我的防火墙配置有问题。我想在一个特殊的接口中阻止所有的IPv6分段数据包。所以,我试过:
# ip6tables -A INPUT -d <ipv6_address> -i eth0 -m ipv6header --header ipv6-frag --soft -j DROP
但IPv6支离破碎的流量仍在继续。
我还找到了这个链接:https://www.secfu.net/2015/03/25/how-to-block-incoming-ipv6-fragments-in-latest-red-hat-releases/,它解释了IPv4 6- frag或frag不会阻塞最新的CentOS中的ipv6分段通信,因为在bug id 1011214 (内核-2.6.32-437.el6)之后,netfilter开始处理重新组装的数据包,而不是像IPv4那样处理片段。同一篇文章建议使用nftable,如下所示:
table ip6 filter {
chain preroute500 {
type filter hook prerouting priority -500; policy accept;
ip6 nexthdr ipv6-frag counter packets 2 bytes 2104
}
}
我怎样才能用ip6tables来做这样的事情呢?
# cat /etc/system-release
CentOS Linux release 7.5.1804 (Core)
# uname -r
5.0.8-1.el7.elrepo.x86_64
发布于 2019-04-22 20:05:45
如前所述,您应该确保阻止片段确实是您的目标,而不是您认为对您的目标最好的方法,而更好的方法将存在。不管怎么说,不管你有什么价值:
raw_before_defrag=1
加载ip6table_raw
模块,因此raw的钩子(在PREROUTING中)从PRIO-300切换到-450,在DEFRAG-400之前。ip6table_raw raw_before_defrag=1,它应该得到像ip6table_raw: Enabling raw table before defrag
这样的内核消息现在,在raw
表中,并且可能只有在PREROUTING
中才有意义,ip6tables将能够看到片段。它可以在那里过滤它们,或者选择跳过连接轨迹(iptables -t raw -A PREROUTING ... -j CT --notrack
),正如在特性补丁中解释的那样,它也将跳过碎片整理,允许其他链处理它们(当然不包括nat
表的链或任何其他连接跟踪相关特性)。
请注意,要在测试网络命名空间中见证问题描述,必须首先人为地启用连接跟踪操作,以便连接跟踪依赖于defrag,直到第一次需要时才激活。下面是一个网络命名空间示例:
ip netns add sender
ip netns add receiver
ip -n sender link add veth0 address 02:00:00:00:00:01 type veth peer netns receiver name veth0 address 02:00:00:00:00:02
ip -n sender link set veth0 up
ip -n receiver link set veth0 up
这样做是可行的:
# ip netns exec sender ping6 -s 4000 fe80::ff:fe00:2%veth0
PING fe80::ff:fe00:2%veth0(fe80::ff:fe00:2%veth0) 4000 data bytes
4008 bytes from fe80::ff:fe00:2%veth0: icmp_seq=1 ttl=64 time=0.069 ms
^C
在这之后,它就不再起作用了:
ip netns exec receiver ip6tables -A INPUT -m ipv6header --header ipv6-frag --soft -j DROP
在网络命名空间中激活连接轨迹后,这些命令显然会导致没有操作:
ip netns exec receiver ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED
ip netns exec receiver ip6tables -D INPUT -m conntrack --ctstate ESTABLISHED
ipv6碎片整理也被激活。现在,前面的ping将始终正常工作,因为输入中的规则只看到碎片化的数据包。
使用以前加载的带有参数ip6table_raw
的raw_before_defrag=1
模块,这将恢复分段ping的阻塞:
ip netns exec receiver ip6tables -t raw -A PREROUTING -m ipv6header --header ipv6-frag --soft -j DROP
或者,可以将感兴趣的数据包标记为无迹,从而免除它们的连接跟踪,从而也不会接收碎片处理,从而允许使用filter/INPUT
链中的规则再次对它们进行过滤。因此,与以前的raw
规则不同,这也将阻塞ping数据包(每个ping 3个),但这次在filter/INPUT
链中再次阻塞:
ip netns exec receiver ip6tables -t raw -A PREROUTING -m ipv6header --header ipv6-frag --soft -j CT --notrack
这只是一个没有多大意义的例子。
https://serverfault.com/questions/964072
复制相似问题