ip6tables 阻止输出流量

ip6tables 阻止输出流量

我的 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 

如果您运行tcpdumpIPv6 流量,您将看到发送到远程主机的“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 脚本中的内容。

相关内容