Большинство примеров SNAT дают следующее
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 100.200.100.200
но, похоже, это применимо не только к пересылаемым пакетам, но и к пакетам, приходящим с localhost. Это нежелательно. Исходящие пакеты с localhost могут быть чем-то важным (SMTP и т. Д.), Я не хочу менять его IP на тот, который используется для NAT.
Я видел примеры с
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j SNAT --to-source 100.200.100.200
но мне это кажется ненадежным, так как это еще одно место, за которым нужно следить, когда вы хотите что-то изменить. Есть ли способ определить, что исходящие пакеты с localhost не должны быть привязаны к протоколу SNAT, несмотря ни на что?
Если вы посмотрите на диаграмму iptables (выберите любой https://gist.github.com/nerdalert/a1687ae4da1cc44a437d) вы можете видеть, что nat.POSTROUTING применяется не только к пересылаемым пакетам, но и к исходящим пакетам с этого хоста. Итак, если у вас есть 2 IP-адреса (100.100.100.5 и 100.100.100.6), назначенные этому хосту, и у вас есть что-то вроде этого в ваших iptables
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 100.100.100.5
все соединения с этого хоста исходящие на eth0 будет изменен SNAT. Даже когда программа привязывается к определенному IP. Это могло быть плохо.
Этого можно легко избежать, добавив предыдущий параметр выше.
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL -j ACCEPT
это будет принимать любой пакет, сгенерированный этим хостом, без SNAT, работает для всех IP-адресов, назначенных этому хосту - 127.0.0.1 или 100.100.100.5 или 100.100.100.6 (вторичный IP) и т. д.