История изменений
Исправление Black_Shadow, (текущая версия) :
Блин, да ты же сам тут пишешь, что когда netfilter делает snat ему не нужно знать исходящий интерфейс. Вот я тебе и говорю, чтобы ты привёл пример правила, когда это не нужно. Такие случаи есть, но они специфические. В случае классического NAT, когда у тебя на сервере больше 1 интерфейса, ты не сможешь сделать SNAT без информации об исходящем интерфейсе. А эта информация появляется только после роутинга. То есть, в цепочках POSTROUTING.
Пример:
сервер с 3 интерфейсами:
eth0 - LAN (10.0.0.1/16)
eth1 - DMZ (84.83.82.81/24)
eth2 - uplink в сторону провайдера (94.93.92.91/29)
В LAN помимо 10.0.0.0/16 есть ещё 10.1.0.0/16, 10.2.0.0/16,10.3.0.0/16 ..... 10.n.0.0/16. В DMZ ситуация та же.
Задача: делать SNAT только для тех пакетов, которые пришли из LAN и уходят в uplink провайдера.
Я предлагаю это делать так:
iptables -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 0x1
iptables -t nat -A POSTROUTING -o eth2 -m mark --mark 0x1 -j MASQUERADE
Заметь, между eth0 и eth1 никаких NAT'ов быть не должно. Расскажи, как ты будешь писать правила без указания netfilter'у исходящего интерфейса.
Исходная версия Black_Shadow, :
Блин, да ты же сам тут пишешь, что когда netfilter делает snat ему не нужно знать исходящий интерфейс. Вот я тебе и говорю, чтобы ты привёл пример правила, когда это не нужно. Такие случаи есть, но они специфические. В случае классического NAT, когда у тебя на сервере больше 1 интерфейса, ты не сможешь сделать SNAT без информации об исходящем интерфейсе. А эта информация появляется только после роутинга. То есть, в цепочках POSTROUTING.
Пример:
сервер с 3 интерфейсами:
eth0 - LAN (10.0.0.1/16)
eth1 - DMZ (84.83.82.81/24)
eth2 - uplink в сторону провайдера (94.93.92.91/29)
В LAN помимо 10.0.0.0/16 есть ещё 10.1.0.0/16, 10.2.0.0/16,10.3.0.0/16 ..... 10.n.0.0/16. В DMZ ситуация та же.
Задача: делать SNAT только для тех пакетов, которые пришли из LAN и уходят в uplink провайдера.
Я предлагаю это делать так:
iptables -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 0x1
iptables -t nat -A POSTROUTING -o eth2 -m mark --mark 0x1 -j MASQUERADE
Заметь, между eth0 и eth1 никаких NAT'ов быть не должно. Расскажи, как ты будешь писать правила без указания netfilter'у исходящего интерфейса.