Назад | Перейти на главную страницу

Безопасная настройка NAT с помощью iptables

У меня есть устройство под управлением Debian, которое должно действовать как интернет-шлюз. Вдобавок к этому я хочу предоставить брандмауэр, который блокирует не только входящий, но и исходящий трафик. И я решил, что iptables должен справиться с этой задачей.

Эта проблема: Я правильно настроил NAT (я так думаю?), Но как только я установил политику по умолчанию на DROP и добавил правила, например, разрешающие HTTP-трафик из локальной сети, HTTP не проходит. Так что в основном мои правила, похоже, не работают.

Ниже приведен сценарий инициализации, который я использую для iptables. Устройство имеет два сетевых адаптера, соответственно eth0 (интерфейс WAN) и eth1 (интерфейс LAN).

echo 1 > /proc/sys/net/ipv4/ip_forward

# Flush tables
iptables -F
iptables -t nat -F

# Set policies
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow outbound HTTP from LAN? 
iptables -A FORWARD -i eth1 -o eth0 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

Может кто-нибудь пролить некоторый свет на это?

Решено: Майк предложил использовать telnet и IP вместо имени домена для тестирования HTTP-трафика, и это привело к двум открытиям: DNS не работал должным образом и фильтрация исходящей почты тоже не работала (я мог подключиться к порту 8080 через telnet).

Итак, прежде всего я добавил правила, позволяющие клиентам локальной сети использовать службы шлюза, например DNS. (И да, не волнуйтесь, я собираюсь сузить круг предлагаемых услуг)

iptables -A INPUT -i eth1 -d 172.16.0.1 -j ACCEPT
iptables -A OUTPUT -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Можно было подумать, что теперь я смогу делать DNS-запросы. И я действительно мог, но время ожидания запросов истекло, потому что шлюз не мог сам выполнять DNS-запросы. Добавлены правила для исходящего DNS:

iptables -A OUTPUT -o eth0 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT

Наконец, я установил политику по умолчанию для FORWARD цепь к DROP. И мы вернулись на круги своя.

Я собирался опубликовать обновление, когда увидел ответ Рама, в котором предлагалось разрешить входящий трафик для существующих подключений. Я также применил этот принцип к OUTPUT цепочка выше.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Итак, теперь, похоже, он работает именно так, как я хочу. Полный сценарий здесь. Спасибо!

Вам необходимо разрешить ответы на ваши исходящие запросы.

Я собирался добавить это в качестве ответа после того, как получил ответ на комментарий, но похоже, что вы следовали моему ходу мыслей ... Я заметил, что у вас не разрешен DNS во внутреннем интерфейсе. Удачи в ваших услугах.