我的 iptables 设置有问题。我想要完全双栈服务器,因此我对 IPv4 和 IPv6 使用相同的规则。但是,所有 IPv6 连接都被断开,而 IPv4 工作正常。
以下是我用来填充防火墙规则的所有文件:这里 - 第一个文件是我运行的脚本,第二个文件包含 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 服务器,ping -6 2a02:2b88:2:1::2498:1
则我得到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,那么一切都会正常。当然,不幸的是这不是一个选项...
答案1
问题最终确实出在 ICMP 数据包中。确切地说,我不知道 IPv6 不再使用 ARP 和其他一些服务 - 它使用自己的机制。为此,它需要传递许多 ICMPv6 数据包。启用后,一切都按预期运行。
我通过尝试启用所有 ICMPv6 数据包找到了此解决方案 - 一切正常。因此我查阅了一些指南并找出需要启用哪些 ICMPv6 数据包。
我想推荐这套规则:https://gist.github.com/jirutka/3742890
我的防火墙设置均基于它们,并且从现在起我也将以此为基础进行设置。