LINUX.ORG.RU
ФорумAdmin

iptables для шлюза с политикой DROP

 , , , ,


0

1

Прошу помочь с правилами iptables для сетевого шлюза. Имеется машинка на Debian 7.8, выполняющая роль шлюза в инет. Из софта - bind9, isc-dhcp-server. Настроил iptables (NAT во внутреннюю сеть 10.0.0.0/8), по умолчанию установил политику DROP (все что не разрешено, то запрещено). Все работает хорошо, но только первые минут 10-15 или до сброса сетевого адаптера на клиентской машине - пинги не ходят, сайты не открываются, при этом DHCP работает исправно и связь с самим шлюзом есть. Стоит выставить политику ACCEPT для INPUT и FORWARD - все начинает работать, но вариант с ACCEPT меня не устраивает.

Подскажите, где закралась ошибка? Ниже привожу листинг iptables.

*filter
Политика по умолчанию для всех цепочек - DROP
:INPUT DROP
:FORWARD DROP 
:OUTPUT DROP 

# Разрешаем входящие ICMP пакеты и traceroute
-A INPUT -p icmp -m icmp --icmp-type 11 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3/3 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m udp --sport 33434:33524 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# Разрешаем внутреннее кольцо
-A INPUT -i lo -j ACCEPT

# Разрешаем DNS запросы на сервер
-A INPUT -i eth0 -p tcp -m tcp --sport 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --sport 53 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Разрешаем DHCP
-A INPUT -i eth1 -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT

# Разрешаем входящие ICMP пакеты
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# Дропаем неправильные плохие пакеты
-A INPUT -m conntrack --ctstate INVALID -j DROP

# Вычисляем правильный размер MSS / MTU
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Разрешаем уже установленные и отоносящиеся к ним соединения из интернет
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Разрешаем соединения из локальной сети в интернет
-A FORWARD -i eth1 -o eth0 -j ACCEPT

# Дропаем  плохие пакеты
-A FORWARD -m conntrack --ctstate INVALID -j DROP

# Разрешаем исходящий traceroute
-A OUTPUT -o eth0 -p udp -m udp --dport 33434:33524 -m state --state NEW -j ACCEPT

# Разрешаем внутреннее кольцо
-A OUTPUT -o lo -j ACCEPT

Разрешаем DNS запросы с сервера
-A OUTPUT -o eth0 -p tcp -m tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

#Разрешаем DHCP ответы
-A OUTPUT -o eth1 -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT

# Разрешаем исходящие ICMP
-A OUTPUT -p icmp -j ACCEPT

# Дропаем  плохие пакеты
-A OUTPUT -m conntrack --ctstate INVALID -j DROP

*nat
:PREROUTING ACCEPT 
:INPUT ACCEPT 
:OUTPUT ACCEPT 
:POSTROUTING ACCEPT 

# Включаем маскарадинг (NAT) для внутренней сети
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

*raw
:PREROUTING ACCEPT
:OUTPUT ACCEPT 
-A PREROUTING -i lo -j CT --notrack
-A OUTPUT -o lo -j CT --notrack

*mangle
:PREROUTING ACCEPT 
:INPUT ACCEPT 
:FORWARD ACCEPT 
:OUTPUT ACCEPT 
:POSTROUTING ACCEPT 

Проблема скорее всего в FORWARD. Попробуйте без:

-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -m conntrack --ctstate INVALID -j DROP
trancefer ★★ ()
Ответ на: комментарий от trancefer

Проблема скорее всего в FORWARD. Попробуйте без:
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Без этого правила проблема сохраняется.

А каким образом

-A FORWARD -m conntrack --ctstate INVALID -j DROP

может влиять на установленные соединения, если не секрет?

denmmx ()
# Разрешаем DNS запросы на сервер
-A INPUT -i eth0 -p tcp -m tcp --sport 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --sport 53 -m state --state RELATED,ESTABLISHED -j ACCEPT

this

State выкинь

dhameoelin ★★★★★ ()
Последнее исправление: dhameoelin (всего исправлений: 2)
Ответ на: комментарий от trancefer

Т.е. причина:

-A FORWARD -m conntrack --ctstate INVALID -j DROP

?

удаление данного правила из все цепочек не помогло.

denmmx ()
Ответ на: комментарий от dhameoelin

Поправил правила для без проверки состояний соединения, DNS-запросы перестали работать даже на самом шлюзе.

denmmx ()
Ответ на: комментарий от dhameoelin

Покажи получившиеся правила

Вот листинг:

INPUT DROP
FORWARD DROP 
OUTPUT DROP 

-A INPUT -p icmp -m icmp --icmp-type 11 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3/3 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m udp --sport 33434:33524 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m udp --dport 33434:33524 -m state --state NEW -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -o eth1 -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

denmmx ()
Ответ на: комментарий от denmmx
-A INPUT -i eth1 -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --sport 53 -j ACCEPT

Думай, что делаешь, перед тем, как делать, что думаешь

dhameoelin ★★★★★ ()
Ответ на: комментарий от gh0stwizard

Оу, я забыл на dport поправить. Позор на мои седины.

А так-то да, для исходящего трафика с шлюза в мир - правильное.

Я, если что, делаю что-то типа:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -m state --state NEW -p tcp --dport 53 -j ACCEPT
-A INPUT -i eth1 -m state --state NEW -p udp --dport 53 -j ACCEPT
-A OUTPUT -o eth0 -m state --state NEW -p tcp --dport 53 -j ACCEPT
-A OUTPUT -o eth0 -m state --state NEW -p udp --dport 53 -j ACCEPT
...
Чёрт его знает, правильно ли это, но, обычно, работает быстро и без особого геморроя.

dhameoelin ★★★★★ ()
Последнее исправление: dhameoelin (всего исправлений: 2)
Ответ на: комментарий от dhameoelin

Рекомендую придерживаться следующих условностей:

  • Для TCP state: 1) RELATED,ESTABLISHED; 2) NEW
  • UDP, ICMP это stateless, хотя опытным путем выяснено, что iptables умеет считать state для них и считает правильно.
  • Использовать INVALID очень аккуратно, т.к. iptables имеет false-positive для определенных пакетов.

Что касается DNS, то tcp/53 нужно открывать только на входящие запросы для твоего DNS-сервера (только не надо делать open dns). Либо ты настраиваешь свой resolver на работу с TCP (посылка запросов). По умолчанию все гоняется по udp/53, udp/953.

Ну и пока ты с правилами не определился:

INPUT ACCEPT
...
...
-A INPUT -m limit --limit 1/sec --limit-burst 1 -j LOG --log-prefix "INPUT: "
Либо:
INPUT DROP
...
...
-A INPUT -m limit --limit 1/sec --limit-burst 1 -j LOG --log-prefix "INPUT: "
-A INPUT -j ACCEPT

gh0stwizard ★★★★★ ()
Ответ на: комментарий от gh0stwizard

ТС не я, если что.

Я уже давно определился с правилами.

dhameoelin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.