先日読んだと書いた書籍で消化不良だったSource NATの設定を確認したので記事にまとめる。
なにが消化不良だったかというと,LAN側からのみWAN(インターネット)へのアクセスを許可するための仕組みとしてSource NATが紹介されているのだが,その説明はポートマスカレードが中心で,実際,WAN側からLAN側へのアクセスできる状態で説明が終わっていた。
なので,LAN側からWAN側へのフィルタリングを演習と見立てて調べてみた。
(書籍自体はわかりやすくてよいです。)
基本のSource NATの設定
書籍中で紹介されるSouce NATの設定は以下。
# clear for ns in $(ip netns list | awk '{print $1}'); do sudo ip netns delete $ns done sudo ip netns add wan sudo ip netns add router sudo ip netns add lan sudo ip link add lan-veth0 type veth peer name gw-veth0 sudo ip link add wan-veth0 type veth peer name gw-veth1 sudo ip link set lan-veth0 netns lan sudo ip link set gw-veth0 netns router sudo ip link set gw-veth1 netns router sudo ip link set wan-veth0 netns wan sudo ip netns exec lan ip link set lan-veth0 up sudo ip netns exec router ip link set gw-veth0 up sudo ip netns exec router ip link set gw-veth1 up sudo ip netns exec wan ip link set wan-veth0 up sudo ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0 sudo ip netns exec router ip link set dev gw-veth0 address 00:00:5E:00:50:00 sudo ip netns exec router ip address add 203.0.113.254/24 dev gw-veth1 sudo ip netns exec router ip link set dev gw-veth1 address 00:00:5E:00:50:01 sudo ip netns exec router sysctl net.ipv4.ip_forward=1 sudo ip netns exec lan ip address add 192.0.2.1/24 dev lan-veth0 sudo ip netns exec lan ip link set dev lan-veth0 address 00:00:5E:00:51:01 sudo ip netns exec lan ip route add default via 192.0.2.254 sudo ip netns exec wan ip address add 203.0.113.1/24 dev wan-veth0 sudo ip netns exec wan ip link set dev wan-veth0 address 00:00:5E:00:52:01 sudo ip netns exec wan ip route add default via 203.0.113.254 # set forward sudo ip netns exec router iptables -t nat \ -A POSTROUTING \ -s 192.0.2.0/24 \ -o gw-veth1 \ -j MASQUERADE sudo ip netns exec router iptables -t nat -L sudo ip netns exec router iptables -t filter -L
以下のような構成になる。
lan-veth0@lan[192.0.2.1] ---- gw-veth0@router [192.0.2.254] | gw-veth1@router[203.0.113.254] ---- wan-veth@wan[203.0.113.1]
この設定で確かに,Source NATのMASQUERADEの振る舞いは確認できる。 ただし,routerにはなんのフィルターもかかっておらず,すべての通信がACCEPTされるので, LANからWANだけでなく,LANからWANへのpingも通ってしまう。
なので,LAN起点でWANへの通信はできるが,WAN起点のLANへの通信ができないところまで追加で確認してみたい。
INPUTとFORWARDを閉じる。
sudo ip netns exec router iptables -P INPUT DROP sudo ip netns exec router iptables -P FORWARD DROP
これでLAN/WANの通信はできなくなる。
LAN側のFORWARDのみ許可する
LAN側からのFORWARDは許可したいので,LAN側のサブネット192.0.2.0/24を対象としたFORWARDを許可する。
sudo ip netns exec router iptables -t filter \ -A FORWARD \ -s 192.0.2.0/24 \ -j ACCEPT
これでLANからWANへのpingが届くことを期待したいが,pingは帰ってこない。 なぜか?pingのreplyがDROPされるからである。
期待通り,上記の設定でpingはwanまで届いている。 これはtcpdumpでwanやrouterを確認すれば,ちゃんとwanまでpingが届いているし,wan側からreplyが返されていることは確認できる。 wanからrouterへのpingのFORWARDは許可されていないので,routerがFORWARDしていないのである。
確立済みの通信のFORWARDは許可する
WAN側からの応答を受け付けるように以下の設定を追加する。
sudo ip netns exec router iptables -t filter \ -A FORWARD \ -m state --state ESTABLISHED,RELATED \ -j ACCEPT
これで,ちゃんとLAN側からのpingは通って,WAN側からのpingは通らないことが確認できる。
まとめ
これまでの結果をまとめた設定を以下に示す。
# clear for ns in $(ip netns list | awk '{print $1}'); do sudo ip netns delete $ns done sudo ip netns add wan sudo ip netns add router sudo ip netns add lan sudo ip link add lan-veth0 type veth peer name gw-veth0 sudo ip link add wan-veth0 type veth peer name gw-veth1 sudo ip link set lan-veth0 netns lan sudo ip link set gw-veth0 netns router sudo ip link set gw-veth1 netns router sudo ip link set wan-veth0 netns wan sudo ip netns exec lan ip link set lan-veth0 up sudo ip netns exec router ip link set gw-veth0 up sudo ip netns exec router ip link set gw-veth1 up sudo ip netns exec wan ip link set wan-veth0 up sudo ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0 sudo ip netns exec router ip link set dev gw-veth0 address 00:00:5E:00:50:00 sudo ip netns exec router ip address add 203.0.113.254/24 dev gw-veth1 sudo ip netns exec router ip link set dev gw-veth1 address 00:00:5E:00:50:01 sudo ip netns exec router sysctl net.ipv4.ip_forward=1 sudo ip netns exec lan ip address add 192.0.2.1/24 dev lan-veth0 sudo ip netns exec lan ip link set dev lan-veth0 address 00:00:5E:00:51:01 sudo ip netns exec lan ip route add default via 192.0.2.254 sudo ip netns exec wan ip address add 203.0.113.1/24 dev wan-veth0 sudo ip netns exec wan ip link set dev wan-veth0 address 00:00:5E:00:52:01 sudo ip netns exec wan ip route add default via 203.0.113.254 # set default drop sudo ip netns exec router iptables -P INPUT DROP sudo ip netns exec router iptables -P FORWARD DROP # set forward sudo ip netns exec router iptables -t filter \ -A FORWARD \ -s 192.0.2.0/24 \ -j ACCEPT sudo ip netns exec router iptables -t filter \ -A FORWARD \ -m state --state ESTABLISHED \ -j ACCEPT sudo ip netns exec router iptables -t nat \ -A POSTROUTING \ -s 192.0.2.0/24 \ -o gw-veth1 \ -j MASQUERADE sudo ip netns exec router iptables -t nat -L sudo ip netns exec router iptables -t filter -L
今後
ちなみに,書籍中のDestination NATについても同様の問題があると思うので,気が向いたら考えてみたい。