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

ip6tables блокирует выходной трафик

Мой OpenVZ VPS блокирует исходящий трафик IPv6, но правильно фильтрует входящий трафик IPv6.

Ниже мой сценарий восстановления ip6tables.

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 51413 -j ACCEPT
-A INPUT -p udp -m udp --dport 51413 -j ACCEPT
-A INPUT -m limit --limit 5/min
-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j ACCEPT
-A OUTPUT -j ACCEPT
COMMIT

Трафик ICMPv6 по-прежнему может проходить как входящий, так и исходящий.

Когда я сбрасываю эти правила, используя -F, исходящий трафик идет нормально.

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ: похоже, что ip6tables помечает пакеты ESTABLISHED как недействительные. Следовательно, исходящий трафик фактически НЕ блокируется. Ответные пакеты снова не допускаются к входящим, поэтому выглядят как заблокированный исходящий трафик. Разрешение входящих пакетов INVALID решает проблему исходящего трафика, но также делает входящий фильтр бесполезным.

Какую версию ядра вы используете, более старые версии не имели поддержки межсетевого экрана conntrack с отслеживанием состояния в netfilter для IPv6, поэтому правило, разрешающее СВЯЗАННЫЙ, УСТАНОВЛЕННЫЙ трафик, не будет работать, и вам нужно будет разрешить! --syn -dport 1024: 65535 и вместо этого трафик udp.

Возможно, вам потребуется указать модуль состояния при разрешении трафика, например, вот конфигурация от хоста RHEL6, который действительно работает.

ip6tables -t filter -F INPUT
ip6tables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -t filter -A INPUT -p ipv6-icmp -j ACCEPT
ip6tables -t filter -A INPUT -i lo -j ACCEPT
ip6tables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
ip6tables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
ip6tables -t filter -A INPUT -j LOG --log-prefix=v6_input_deny --log-level=4
ip6tables -t filter -A INPUT -j REJECT --reject-with icmp6-adm-prohibited

Похоже, вы используете CentOS5 или другой вариант RHEL5.

Отслеживание соединений Netfilter в RHEL5 не работает и никогда не будет исправлено. В результате типичное правило iptables, подобное -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT не будет работать, и ip6tables / connfilter просто посчитает их «НЕДЕЙСТВИТЕЛЬНЫМИ». В следующем примере обратите внимание на то, как Netfilter по ошибке помечает действительные пакеты как «НЕДЕЙСТВИТЕЛЬНЫЙ» вместо «УСТАНОВЛЕННЫЙ»:

# ip6tables-save |grep state
-A INPUT -s ::/0 -d ::/0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -s ::/0 -d ::/0 -m state --state INVALID -j ACCEPT 
# curl -6 www.google.com >/dev/null 2>&1

# ip6tables --list --numeric -v
...
Chain INPUT (2 references)
 pkts bytes target     prot opt in     out     source               destination         
0     0 ACCEPT     all      lo     *       ::/0                 ::/0               
3   208 ACCEPT     icmpv6   *      *       ::/0                 ::/0               
0     0 ACCEPT     ah       *      *       ::/0                 ::/0               
0     0 ACCEPT     all      *      *       ::/0                 ::/0               state RELATED,ESTABLISHED 
61 65747 ACCEPT    all      *      *       ::/0                 ::/0               state INVALID 

Если ты бежишь tcpdump для трафика IPv6 вы увидите пакет SYN для удаленного хоста и ответный пакет SYN-ACK от удаленного хоста. На этом этапе с ip6tables по умолчанию пакет не будет соответствовать никаким существующим правилам и, следовательно, попадет в последнее правило --- -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited.

Какого черта эти пакеты НЕДЕЙСТВИТЕЛЬНЫ? Это ошибка в той версии Red Hat, и она так и не была исправлена.

В качестве обходного пути вы можете попробовать игнорировать входящий SYN, который пытается решить проблему отслеживания соединения:

-A INPUT -s ::/0 -d ::/0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp ! --syn -s 2001:1:1:1::/48 -j ACCEPT

При желании некоторые люди также принимают пакеты UDP:

-A RH-Firewall-1-INPUT -p udp -m udp

Но в какой-то момент это начинает выглядеть угрозой безопасности. Если вы принимаете весь такой трафик, зачем вообще нужен брандмауэр?

Попробуйте заменить

-A ВВОД -p ipv6-icmp -j ПРИНЯТЬ

с участием

-A ВВОД -p icmpv6 -j ПРИНЯТЬ

ICMP гораздо важнее для IPv6, чем для IPv4, и это то, что у меня есть в моем локальном скрипте ip6tables.

Вы должны принимать трафик tcp, sctp и udp


-A OUTPUT -p tcp -j ACCEPT 
-A OUTPUT -p udp -j ACCEPT 
-A OUTPUT -p sctp -j ACCEPT