Linux

iptables 雙棧 - ipv6 不工作

  • April 26, 2014

我的 iptables 設置有問題。我想擁有完全雙堆疊的伺服器,所以我對 IPv4 和 IPv6 使用相同的規則。然而,當 IPv4 正常工作時,所有 IPv6 連接都將被丟棄。

以下是我用來填充防火牆規則的所有文件:這裡

  • 第一個文件是我執行的腳本,第二個文件包含 IPv4 和 IPv6 的通用(共享)規則,第三個和第四個文件包含 IPv4 和 IPv6 的特定規則。

我想指出,一切都在 IPv4 上完美執行。

問題不僅在於 FTP 之類的服務,而且我什至無法 ping 伺服器(從許多不同網路上的許多電腦上測試)。

只是為了您確定,這是命令的輸出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) ping 伺服器,那麼我得到Request timed out. 如果我嘗試在伺服器上 ping 它(通過 SSH),那麼它 ping 沒有任何問題:

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

我將我的防火牆設置基於它們,從現在開始我將在未來使用它們。

引用自:https://serverfault.com/questions/591297