WANからLANへのアクセスをフィルダリングするSource NATの設定

先日読んだと書いた書籍で消化不良だったSource NATの設定を確認したので記事にまとめる。

blog.amedama.jp

なにが消化不良だったかというと,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についても同様の問題があると思うので,気が向いたら考えてみたい。