Chapter 06

構築手順の解説(ネットワーク編:ネットワーク層)

yutafujii
yutafujii
2021.06.27に更新

最終的なネットワーク構成

本書で紹介するWiFiアクセスポイント構築によるネットワーク構成は以下のようになります.

以下,これに関する背景知識を紹介します.

Linuxカーネルでのパケット処理

ワイヤレス通信によってRaspberry Piまで届いたパケットにはカーネルでフィルタリングやNATなどの処理が行われます.

どのようにフィルタするか,どうNATするかはruleとして定められ,一連のruleをまとめたchainごとに処理が走ります.chainは PREROUTING,FORWARD,POSTROUTING,INPUT,OUTPUTの5種類ですが,目的ごとにtableに細分化して管理されます.tableはraw, mangle, nat, filter, securityの5種類です.

全体としては以下のようなまとまりで管理され,

個別のchainには以下のような処理が記録されています.

実際に登録されているruleを確認したい場合はiptablesコマンドを使用します.

$ iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere             anywhere

パケットの処理内容は ACCEPT, DROP, RETURNを基本にしつつ,その他にも様々な処理が拡張的に定められているようです[1]

全体像

さて,Linuxカーネル上でのパケット処理の全体像は次の図の通りです.

Inbound
1.ルーティング前処理
2.フォワーディングまたは受信ファイアーウォール通過

Outbound
1.フォワーディングまたは送信ファイアーウォール通過
2.ルーティング後処理

以下ではもう少し詳細な処理の流れを説明します.

Inboundパケット処理

データリンク層を通してカーネルに届いたパケットは3つのchainに関する処理が適用されたのち[2],「このホスト(つまりこのRaspberry Pi)がパケットの最終目的地か」によって以後の処理が分かれます.Yesの場合はInboundパケットのファイアーウォールを適用し,Noの場合はパケットのフォワーディング処理に向かいます.

WiFiアクセスポイントとしては,基本的にパケットはそのまま次のルーターへパスするだけなので,フォワーディング処理が走ることが多いはずです.

FORWARDのchainルールに従って処理が行われたのちに,「このパケットは次どこに送信すべき(routing)か判定可能か」を判断します.ここで参照されるのがカーネルが管理している経路制御テーブル(routing table)です.

routing tableはrouteコマンド(あるいはnetstat -r)で確認できます.

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    600    0        0 wlan1
192.168.0.0     0.0.0.0         255.255.255.0   U     600    0        0 wlan1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 wlan0

制御は上に書かれたルールからではなく最もマッチ度合いが高いものが適用されます.上の例ではデフォルトのルーティングが設定されているので,この場合基本的に全て"routable"ということになり,POSTROUTINGのchainへ向かいます.

POSTROUTINGにおけるrule適用によってNATが行われるなどしたのち,パケットは最終的にデータリンク層のアウトバウンドインターフェイスに流れるのです.

参考)ホストが最終目的地のInboundパケット処理

今回のWiFiアクセスポイントのホスティングでは,基本的にパケットがこのホスト向けであることはないのですが,参考までにInboundパケットのファイアーウォールの順序は以下の通りです.

参考)アプリケーションから発生するOutboundへのパケット処理

こちらも参考までに,Raspberry PiのLinux上で動くアプリケーションがソケットを通してパケットを外部に送信したい場合,まずOutboundパケットのファイアーウォールが適用されます.

まとめ

全体をまとめるとこのようになります.

今回設定したrule

今回の手順「IPパケットのフォワーディング」ではパケット処理に以下の2つのルールを追加しました.

$ iptables –-table nat –-append POSTROUTING --out-interface <WLAN1> -j MASQUERADE
$ iptables –-append FORWARD –-in-interface <WLAN0> -j ACCEPT
table chain 処理
nat POSTROUTING MASQUERADE
filter FORWARD ACCEPT

FORWARDのACCEPT

2つ目のフォワードのACCEPTは明示的に追加しなくても最初からルールが入っていることもあると思われますが,意図としては--in-interface 引数からのパケットは許可するという設定になります.

POSTROUTINGのMASQUERADE

1つ目の処理で利用したMASQUERADE[3]という処理は,NATの一種でありプライベートネットワークに存在するホストIPの代わりに単一のIPアドレスに変換するものです.masqueradeは誰々のふりをするという意味です.

IP masquerade is the name given to one type of network address translation that allows all of the hosts on a private network to use the Internet at the price of a single IP address.
(引用元)Linux Network Administrator's Guide, 2nd Edition

コマンド用途一覧

最後に本書で使用したネットワークに関するLinuxコマンドと捕捉コマンドの使用例を記載しておきます.

ifconfig

configure a network interface

# WirelessかLANか問わずネットワークインターフェイス全ての設定
$ ifconfig

# wlan0のインターフェイスを停止
$ ifconfig wlan0 down

# wlan0のインターフェイスを起動
$ ifconfig wlan0 up

# wlan0のインターフェイスを自身のIPとサブネットマスクを指定して起動
$ ifconfig wlan0 up 192.168.1.1 netmask 255.255.255.0

iwconfig

configure a wireless network interface

# Wirelessのネットワークインターフェイスの設定
$ iwconfig

# Wirelessのネットワークインターフェイスのモード切り替え(monitorモード)
# インターフェイスが稼働状態だと変更できないのでifconfig downしておく
$ iwconfig wlan0 mode monitor

iptable

administration tool for IPv4/IPv6 packet filtering and NAT

# nat tableのruleを表示する
$ iptable -t nat -L -v -n

# -tオプションを付けない場合はfilter tableを表示する
$ iptable -L -v -n

route

show / manipulate the IP routing table

$ route

# カーネル上のIPパケットの経路制御テーブル
# ex) 192.168.1.0/24 のパケットが来たら 192.168.1.1の
# ネットワークインターフェイスに流す
$ route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1

dig

DNS lookup utility

# netflix.comを問い合わせ
$ dig netflix.com

# name server 8.8.8.8にドメインnetflix.comを問い合わせ
$ dig netflix.com @8.8.8.8

lsof

list open files

# 53番ポートを使用しているプロセスのリストアップ
$ lsof -i :53
脚注
  1. 詳細はman iptables-extensions ↩︎

  2. なおNATによるアドレス・ポート置換はストリームの最初のパケットに適用された以後は同じストリームのパケットは機械的に同様の置換が行われるようです(パフォーマンス向上のため). ↩︎

  3. (man iptables-extentionsでの記載内容)Masquerading is equivalent to specifying a mapping to the IP address of the interface the packet is going out, but also has the effect that connections are forgotten when the interface goes down. This is the correct behavior when the next dialup is unlikely to have the same interface address (and hence any established connections are lost anyway). ↩︎