У меня есть устройство под управлением 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 во внутреннем интерфейсе. Удачи в ваших услугах.