技術道場
先輩忍者「いもかり君」の技術道場です。
世の中のいろんな技術を教えてもらいましょう。

トップ > 道場

ルーティングとは?
《ネットワーク》 - 2017.02.27 
手始めにネットワーク関連の技術解説として「ルーティング(Routing)」について学びましょう。
「Route」は経路であり、「Routing」は経路を決定することです。 インターネット上を流れるパケットの「宛先」を見て経路(ルート)を決めることです。 ルーティングする機器は「経路を提供する人」と言う意味で「Router」と呼びます。 ルータは転送されてくるパケットの宛先を見て、次にどの経路に転送するべきかを決めて 転送する役割を持ちます。

ルータはどうやって転送先を決めるかと言うと、自分の中に「ルーティングテーブル」を持っています。 このルーティングテーブルには、「宛先」に対する「転送先」が書かれているため、 宛先を見たら、どこに転送するのかすぐにわかる訳です。

ルーティングテーブルには宛先は「ネットワーク表記」で書かれます。 例えば、IPアドレスが192.168.10.10/24だとすると、24ビットがサブネットマスクのため、 255.255.255.0となるので、IPアドレスをマスクすると192.168.10.0というネットワークアドレスが抽出できます。
また、「転送先」はインタフェース名で書かれます。インタフェース名とは、 ネットワークインタフェースに付与された名前で「eth0」とか「br0」といった名前で表現されます。 Linuxでは、ルーティングテーブルを以下のコマンドで確認できます。

  ip [-6] route [show] [table main] ※括弧は省略可能(-6はIPv6の場合)

tableはどのルーティングテーブルかを示します。複数のテーブルを作成し、テーブルに優先順位を付けられます。 また、ルーティングテーブルに新たなエントリを追加する場合は、次のように書きます。

  ip route add 192.168.10.0/24
     via 192.168.10.1 dev eth0 table main


この場合、「宛先が192.168.10.0/24の場合は、eth0経由で192.168.10.1に転送する」となります。 削除する場合は、以下のように指定します。

  ip route del 192.168.10.0/24 table main

もうひとつ、デフォルトルートの設定についてお話します。
受け取ったパケットの宛先が、自分の持っているルーティングテーブルにない場合、 どうするか?ですが、その場合、デフォルトルートが設定されていると、すべてそのルートに 従って、転送されることになります。デフォルトルートは「ip route」を実行した際に、 「default」と表示されている項目になります。
デフォルトルートを追加する場合は、次のようにアドレスを空(オールゼロ)にして設定します。 そうすると、次のコマンドでデフォルトルートを追加した場合、 宛先不明のパケットは全てeth0インタフェース経由で192.168.10.1に転送されるようになります。

  ip route add 0.0.0.0/0
     via 192.168.10.1 dev eth0 table main


デフォルトルートがない場合、宛先不明のエラーとなって、パケットは転送されなくなります。

★ ip routeコマンドは次のようなケースでは、エラーを出力する場合があります。
「File exists」:既に同じルーティング情報が登録されている場合
「No such process」:デフォルトゲートウェイに指定したサブネットのIPアドレスがいずれの インタフェースにも設定されていない場合(IPアドレスがインタフェースに設定された状態でない場合、 ip routeコマンドが失敗します)

★ 設定されたルーティング情報に関連する仮想インタフェース(転送先を該当インタフェースに設定するなど)が 削除され、なくなってしまうと、カーネルによって自動で該当するルーティング情報が削除されます。

フィルタリングとは?
《ネットワーク》 - 2017.03.22 
ルーティングに並びネットワークセキュリティの基礎技術解説として「フィルタリング(Filtering)」について学びましょう。
フィルタリングは文字通り、パケットの「通過」「廃棄」を制御する技術です。 OSIの第3層(ネットワーク層)、第4層(トランスポート層)のレベルで情報を選別して制御します。 インターネットは世界のネットワークを相互に接続しており、様々な人々とつながることができます。 その反面、つながるが故に情報が筒抜けになってしまいます。 そこで、フィルタリングによるファイヤーウォール(壁)を作り、必要最小限のパケットを通過させるようにします。

LinuxではOS(カーネル)にて、パケットを処理するための「Netfilter」と呼ばれる仕組みを持っています。 これは、フィルタリングしたり、NAT変換したりといったパケットを処理する機能を持っています。 その「Netfilter」の機能を操作するコマンド(ツール)のことを「iptables」と呼びます。 「iptables」を用いることで、パケットの通過・廃棄といった制御が実現できます。

Linuxシェルにて下記のようにコマンドを実行すると、現在の設定内容が確認できます。

  iptables -S [-t(※1)][filter] [chain(※2)] ※括弧はフィルタの場合は省略可能

(※1) [-t]は参照するテーブルを指定するもので、下記のような種類があります。
 @ filter     :フィルタリング制御用テーブル
 A nat       :NAT/NAPT制御用テーブル
 B mangle :優先制御等のマーク設定用テーブル
 C raw      :処理しないパケットの振り分け用テーブル

(※2) チェイン(chain)はルールを繋げるためのまとまりを示し、ルールの設定先となります。 次のようなチェインがデフォルトで定義されています(ビルトインチェイン)。 チェインは「-N」コマンドによって任意で作成することができます(ユーザ定義チェイン)
 @ PREROUTING : ルーティングする前に適用される
 A INPUT : プロセスに入力する前に適用される
 B FORWARD : 転送時に適用される
 C OUTPUT : プロセスから出力する際に適用される
 D POSTROUTING : ルーティング処理終了後に適用される

★通常、プロセスにINPUTされた場合に、プロセスにパケットが流入しますが、 ローソケット(RawSocket)などで、プロセスがソケットを作成した場合などは、 PREROUTINGを通過すると、その時点でパケットのコピーを受信するようになります。 パケットのオリジナルはINPUTチェインのルールが適用され、 なおかつ、コピーされたパケットをローソケットで受信するような挙動になります。

下記コマンドを実行すると、チェイン単位でルールを確認できます。 また、パケットがルールにヒットしたカウントも含めて確認することができます。

  iptables -nvL [-t][filter] [chain] ※括弧はフィルタの場合は省略可能


・・・ルールの追加削除の話はのちほど。。
データの正規化
《データベース》 - 2017.03.23 
データは通常は関連のあるまとまりで管理しますが、このようなまとまりを 「テーブル」と呼びます。永続化する場合、テーブルにデータを格納します。 このテーブルの集合がデータベースです。
メモリにデータを格納する場合は、テーブルのことを「データ構造」と表現したりします。 このように、データのまとまりをテーブルだったりデータ構造だとか、呼びますが、 データをうまく整理しないと、同じ情報が複数個所に保存されてしまい、 同時に更新しないと、データが不整合な状態になったりすることがあります。

データの正規化とは、こうしたデータの冗長性を排除することでで更新時異常(矛盾)を防ぎ、 独立性を保つためにデータを整理することを言います。

データの正規化には複数の段階があり、下記のような段階アプローチでデータを整理します。

 ●非正規系
  データに繰り返し項目が存在する状態で整理されていない。
  明細情報などのように繰り返されるデータがカラムに存在する。
 ●第1正規系
  繰り返し項目が排除され、属性は全て単一値である状態。
  「部分関数従属」が残存する(主キーの一部に関数従属する)。
 ●第2正規系
  第1正規系を満たし、完全関数従属している状態。
  「推移的関数従属」が残存する(非キー属性間に依存関係がある)。
 ●第3正規系
  第2正規系を満たし、推移的関数従属が排除された状態。
  非キー項目間に依存関係がない。冗長性が排除された状態。


正規化されていないテーブル(データ構造)を設計した場合、下記のような更新時異常が発生する可能性があります。
 ★挿入/登録異常
  主キーがNULLになる。主キーが重複する(二重登録による一意性違反)
 ★更新異常
  同時に更新しないと、データ整合性が崩れる(不整合が起こる)
 ★削除異常
  データが失われ、削除できなくなる

正規化を検討する際は、まず、データ項目間において、複数データが存在する可能性があるかを 検証する必要があります。キーに対して対象データが「複数設定可能」な場合、その属性は全て 「候補キー」として含めなければなりません。
そうすることで、「主キー」+「繰り返し項目」となり、はじめて属性内容が特定できるようになります。

正規化は繰り返し項目を分解していくことからはじめます。 分解して、最後に残った属性をまとめることでテーブルを整理していきます。 属性を整理した後、テーブルの非キー属性間で関数従属性がないかを確認します。 非キー属性がない場合は、第3正規化が満たせている状態なので確認は不要です。

★主キーの候補キーに「日程」「時間」などを表す属性を含む場合、追加時の二重キー登録発生などの一意性違反の 可能性があるため、注意する必要があります。