我的 OpenVZ VPS 正在阻止出站 IPv6 流量,但正确过滤入站 IPv6 流量。
下面是我的 ip6tables-restore 脚本。
*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。因此,实际上并未阻止出站流量。不允许回复数据包再次入站,因此看起来像是阻止了出站流量。允许 INVALID 数据包入站解决了出站问题,但也使入站过滤器变得无用。
答案1
您正在使用哪个版本的内核,旧版本在 netfilter 中没有针对 IPv6 的 conntrack 状态防火墙支持,因此允许 RELATED、ESTABLISHED 流量的规则将不起作用,您需要允许 !--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
答案2
看来您正在使用 CentOS5 或其他 RHEL5 变体。
RHEL5 中的 Netfilter 连接跟踪已损坏,并且无法修复。因此,典型的 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
但在某些时候,这开始看起来像是一个安全隐患。如果你接受所有这样的流量,为什么还要费心使用防火墙呢?
答案3
您必须接受 tcp、sctp 和 udp 流量
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -p udp -j ACCEPT
-A OUTPUT -p sctp -j ACCEPT
答案4
尝试更换
-A 输入-p ipv6-icmp -j 接受
和
-A 输入-p icmpv6-j 接受
ICMP 对 IPv6 的重要性远高于对 IPv4 的重要性,以上就是我本地 ip6tables 脚本中的内容。