Я новичок в iptables и хочу понять, как работает iptables nat. У меня есть машина linux с контейнером lxc. Конфигурация сети машины выглядит следующим образом: интерфейс eth0, который подключает машину к Интернету (его адрес IPv4 - 10.9.63.173) и интерфейс veth-1 (192.168.2.1) для контейнера lxc. В контейнере lxc есть интерфейс eth0 (192.168.2.2), подключенный к veth-1.
На Linux-машине я добавил два правила iptables:
1) iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.9.63.173
2) iptables -t nat -A PREROUTING -d 10.9.63.173 -j DNAT --to-destination 192.168.2.2
Если я выполняю ping 8.8.8.8 из контейнера lxc, все работает (исходный IP-адрес переводится в 10.9.63.173 при выходе из машины linux). Но второе правило никогда не соответствует ответам эхо-запроса. Я смотрел входящие пакеты на eth0 (10.9.63.173), используя tcpdump, и вывод выглядит следующим образом:
23:34:33.151565 IP google-public-dns-a.google.com > host.local: ICMP echo reply, id 536, seq 174, length 64
Поэтому пакеты с пунктом назначения 10.9.63.173 поступают на интерфейс eth0.
У меня три вопроса:
1) Почему правило предварительной маршрутизации nat никогда не совпадает?
2) Как iptables узнает, как изменить ответы так, чтобы они пересылались в 192.168.2.2?
3) Может ли цель SNAT изменить исходный порт (без явного указания переводить на определенный порт (ы))?
Спасибо!