iptablesの超基本(NAT)
前回(今さらながらiptables基本(その1))の続き。iptablesにおけるNATの基本設定を、Wiresharkで取得したデータとともに記載。
参考サイト
ネットワーク
VirtualBoxで3つのVMを設けて接続する。前回と同じであるが、中央のルーターであるLubuntuが”NAT Router”となっており、左がNATの内側、右がNATの外側である。
準備など
前回とほぼ同じ。
NAT Router(Lubunts)
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
パケット転送を許可する。
サーバー側(右のVM: Busterdog 2)
$ ping 192.168.10.10
$ nc -l -p 1234
クライアント側(左のVM: Busterdog 1)
$ ping 172.16.0.21
$ nc -z 172.16.0.21 1234
検証
IPマスカレード
NAT Routerでの設定である。以下、同様。
$ sudo iptables -t nat -A POSTROUTING -i enp0s8 -j MASQUERADE
iptables v1.8.4 (legacy): Can't use -i with POSTROUTING
Try `iptables -h' or 'iptables --help' for more information.
あえて、エラーも記載。POSTROUTINGと"-i"オプション(NAT内側からの入力)とは共存できない。
$ sudo iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
$
$ sudo iptables -t nat -L
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
マスカレード(MASQUERAGE)、"-o"(NAT外側への出力)、POSTROUTINGとを組みあわせる。この設定前後のping受け側(サーバー側、右のVM)のWiresharkデータは下記となる。
パケット番号8までが設定前のデータであり、送信元IPアドレスが、左のVMのIPアドレスとなっている。パケット番号13以降が設定後のデータであり、送信元IPアドレスが、NAT RouterのIPアドレスとなっている。(期待どおり)。
しかし、これだけの設定だと、NAT外側からNAT内側へ通信ができてしまう。右のVMから左のVMへのpingの結果は下記となり、疎通がある。
$ ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=63 time=1.30 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=63 time=1.42 ms
NATとしては、下記するフィルター設定が必要となる。
フィルター設定
$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i enp0s8 -o enp0s9 -j ACCEPT
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
- FORWARD(転送)の基本はDROP(通さない)
- NAT内側からNAT外側への転送はACCEPT(通す)
- ステートフルな転送はACCEPT(通す)
フィルターの設定状況は下記となる。
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
フィルター設定前後の右側VMからのpingのWiresharkデータは下記となる。
パケット番号26までが設定前でデータあり、左側VMからレスポンスがある。パケット番号30以降が設定後のデータであり、左側VMからレスポンスがない。(期待どおり。)
また、TCPセッションの状況(Server側、右側VM)のデータも下記する。
TCPセッションが適切に行われている。
終わりに
これが基本であろう。他にも基本的なiptablesの事項で説明できそうなものが見つかれば、その3を考えてみたい。