我的OpenVZ VPS阻止出站IPv6stream量,但正确过滤入站IPv6stream量。
下面是我的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
ICMPv6stream量仍然能够通过入站和出站。
当我使用-F刷新这些规则时,出站通信正常。
我在这里错过了什么?
编辑:看来,ip6tables标记ESTABLISHED数据包为无效。 因此,出站stream量实际上并未被阻止。 回复数据包不允许再次入站,因此出现阻塞的出站stream量。 允许入侵INVALID数据包解决出站问题,但也使入站filter无用。
您使用的是哪个版本的内核,旧版本在netfilter for IPv6中没有conntrack状态防火墙支持,所以允许RELATED,ESTABLISHEDstream量的规则将不起作用,您需要允许! –syn -dport 1024:65535和udpstream量。
您可能需要在允许stream量时指定状态模块,例如,这是来自可以工作的RHEL6主机的configuration。
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
看来您正在使用CentOS5或其他RHEL5变体。
Netfilter在RHEL5中的连接跟踪被破坏,永远不会被修复 。 因此,像-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT这样的典型的iptables规则将不起作用,并且ip6tables / connfilter将简单地认为它们是“无效的”。 在以下示例中,请注意Netfilter错误地将有效数据包标记为“INVALID”,而不是“ESTABLISHED”:
# 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
如果为IPv6stream量运行tcpdump ,则会看到远程主机的“SYN”数据包,即来自远程主机的“SYN-ACK”响应数据包。 此时使用默认的ip6tables,数据包将不符合任何现有的规则,因此将落入最后的规则— -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited 。
为什么这些包是无效的? 这是Red Hat版本中的一个bug,它从来没有修复过。
作为一种解决方法, 您可以尝试忽略入站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
但是在某些时候,这看起来像是一个安全隐患。 如果您接受这样的所有stream量,为什么还要打扰防火墙?
您必须接受tcp,sctp和udpstream量
-A OUTPUT -p tcp -j ACCEPT -A OUTPUT -p udp -j ACCEPT -A OUTPUT -p sctp -j ACCEPT
尝试更换
-A INPUT -p ipv6-icmp -j ACCEPT
同
-Ainput-p icmpv6 -j接受
ICMP比IPv4更重要,上面就是我在本地ip6tables脚本上的。