вторник, 22 июня 2010 г.

Сюрпризы iptables, или как не стоит делать DNAT

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.0.20:80 это плохая команда
И вот почему :)
Допустим, у вас есть некий маршрутизатор с Linux, который имеет 4 интерфейса:
eth0 - 11.1.1.1/30 - который используется для связи с провайдером
eth1 - 12.1.1.1/28 - ваш сабнет с DMZ, куда все пакеты просто маршрутизируются с опциональной фильтрацией на этом же маршрутизаторе
eth2.100 - 192.168.0.1/24 - подсеть, для которой настроен SNAT на интерфейс eth0 (кстати, тут тоже надо настраивать этот самый SNAT правильно) и в которой находятся еще сервера, порты для которых пробрасываются с целью экономии публичных адресов из 12.1.1.0/28
eth2.200 - 192.168.1.1/24 - такая же подсеть, но для обычных компьютеров, и для которой тоже настроен SNAT на eth0.

Итак, что же будет, если мы решим пробросить порт 80 с 11.1.1.1 на 192.168.0.20:80, той командой, которая написана в начале поста? Будет полная фигня, потому что любой пакет с dst-port 80, пришедший из инетрнета будет перенаправлен на 192.168.0.20:80, а не на, возможно, существующие в 12.1.1.0/28 веб-сервера. Так что команду лучше писать примерно так:
iptables -t nat -A PREROUTING -d 11.1.1.1.1 -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.0.20:80
попутно выработав привычку делать так всегда, дабы не обременять себя и других унылым траблшутингом.

Точно так же следует поступать и с SNAT:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/23 -j SNAT --to-source 11.1.1.1
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/23 -j SNAT --to-source 12.1.1.1

дабы хороший траффик с публичными адресами из 12.1.1.0/28 вдруг не стал натиться в 11.1.1.1

Комментариев нет:

Отправить комментарий