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

Двойной стек iptables - ipv6 не работает

У меня проблема с настройкой iptables. Я хочу иметь полностью сдвоенный сервер, поэтому я использую одни и те же правила для IPv4 и IPv6. Однако все соединения IPv6 просто обрываются, в то время как IPv4 работает без проблем.

Вот все файлы, которые я использую для заполнения правил брандмауэра: Вот - Первый файл - это сценарий, который я запускаю, второй содержит общие (общие) правила для IPv4 и IPv6, а третий и четвертый - файлы, содержащие определенные правила для IPv4 и IPv6.

Хочу отметить, что на IPv4 все работает отлично.

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

На всякий случай, это вывод команды iptables -L -n -v:

Chain INPUT (policy DROP 511 packets, 79527 bytes)
 pkts bytes target     prot opt in     out     source               destination
 1765  739K ACCEPT     all  --  !eth0  *       0.0.0.0/0            0.0.0.0/0
43146 1980K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcpflags: 0x10/0x10
  180 26305 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
  138  8300 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp multiport dports 20,21,25,80,443,465
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpts:50000:50500
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1194
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 0
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 4
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 12

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 11171 packets, 65M bytes)
 pkts bytes target     prot opt in     out     source               destination

и это результат команды ip6tables -L -n -v:

Chain INPUT (policy DROP 32 packets, 3076 bytes)
 pkts bytes target     prot opt in     out     source               destination
    8   832 ACCEPT     all      !eth0  *       ::/0                 ::/0
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcpflags: 0x10/0x10
    0     0 ACCEPT     all      *      *       ::/0                 ::/0                 state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp multiport dports 20,21,25,80,443,465
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpts:50000:50500
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpt:1194
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 129
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 1
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 128
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 3
    0     0 ACCEPT     icmpv6    *      *       ::/0                 ::/0                 ipv6-icmptype 4

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Выход iptables-save:

*filter
:INPUT DROP [93:13846]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4788:4752203]
-A INPUT ! -i eth0 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags ACK ACK -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp -m multiport --dports 20,21,25,80,443,465 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 50000:50500 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT
COMMIT

Выход ip6tables-save:

*filter
:INPUT DROP [6:778]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT ! -i eth0 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags ACK ACK -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp -m multiport --dports 20,21,25,80,443,465 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 50000:50500 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 129 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
COMMIT

Если я попытаюсь пропинговать сервер через IPv6 (ping -6 2a02:2b88:2:1::2498:1) тогда я получаю Request timed out. Если я попытаюсь пинговать его на сервере (через SSH), он пингуется без проблем:

ping6 2a02:2b88:2:1::2498:1 -> 64 bytes from 2a02:2b88:2:1::2498:1: icmp_seq=1 ttl=64 time=0.034 ms

ИЛИ

ping6 localhost -> 64 bytes from localhost: icmp_seq=1 ttl=64 time=0.031 ms

Я также забыл упомянуть, что если я изменю всю цепочку INPUT на ACCEPT, все будет работать. Конечно, это, к сожалению, не вариант ...

В конце концов, проблема действительно заключалась в пакетах ICMP. Если быть точным, я не знал, что IPv6 больше не использует ARP и некоторые другие сервисы - он использует свои собственные механизмы. Для этого необходимо пройти много пакетов ICMPv6. После включения все работает как положено.

Я пришел к этому решению, попытавшись просто включить ВСЕ пакеты ICMPv6 - все заработало. Поэтому я просмотрел несколько руководств и выяснил, какие пакеты ICMPv6 необходимо включить.

Я хотел бы порекомендовать этот набор правил: https://gist.github.com/jirutka/3742890

Я основал на них свои настройки брандмауэра, и с этого момента я буду делать это в будущем.