首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何阻止传入的IPv6片段?

如何阻止传入的IPv6片段?
EN

Server Fault用户
提问于 2019-04-22 15:41:29
回答 1查看 1.3K关注 0票数 1

我的防火墙配置有问题。我想在一个特殊的接口中阻止所有的IPv6分段数据包。所以,我试过:

代码语言:javascript
运行
复制
# 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,如下所示:

代码语言:javascript
运行
复制
table ip6 filter {
   chain preroute500 {
      type filter hook prerouting priority -500; policy accept;
      ip6 nexthdr ipv6-frag counter packets 2 bytes 2104
   }
 } 

我怎样才能用ip6tables来做这样的事情呢?

代码语言:javascript
运行
复制
# cat /etc/system-release
CentOS Linux release 7.5.1804 (Core)

# uname -r
5.0.8-1.el7.elrepo.x86_64
EN

回答 1

Server Fault用户

回答已采纳

发布于 2019-04-22 20:05:45

如前所述,您应该确保阻止片段确实是您的目标,而不是您认为对您的目标最好的方法,而更好的方法将存在。不管怎么说,不管你有什么价值:

  • 使用最近足够的内核。功能在内核4.16中添加。CentOS使用3.10。虽然很多特性都是支持移植的(从nftable开始,它在普通的3.10内核中是不可用的,但在RHEL/CentOS的3.10上),但是这个特性在最新的CentOS 7.6's内核中还没有被支持。由于您使用的是"elrepo“5.0.8内核,因此出现了该特性。以下是特性描述及其存在的原因(主要用于路由,或者至少用于非有状态/非NAT防火墙路由情况):netfilter: nf_defrag:如果NOTRACK设置为conntrack,只有在CONNTRACK或NAT这样的模块显式请求时才需要它。对于普通转发方案,不需要碎片整理,如果在规则中设置NOTRACK,则可以跳过碎片整理。由于连接轨迹碎片整理当前比原始表具有更高的优先级,因此设置NOTRACK是不够的。我们只需要为iptable提供更高的优先级。这是通过引入模块参数"raw_before_defrag“来实现的,该参数允许更改原始表的优先级,将其置于碎片整理之前。默认情况下,参数被禁用,原始表的优先级为NF_IP_PRI_RAW,以支持遗留行为。如果启用了模块参数,则原始表的优先级设置为NF_IP_PRI_RAW_BEFORE_DEFRAG。
  • (如果需要的话,删除现有的原始ip6tables规则,卸载和)使用参数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,直到第一次需要时才激活。下面是一个网络命名空间示例:

代码语言:javascript
运行
复制
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

这样做是可行的:

代码语言:javascript
运行
复制
# 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

在这之后,它就不再起作用了:

代码语言:javascript
运行
复制
ip netns exec receiver ip6tables -A INPUT -m ipv6header --header ipv6-frag --soft -j DROP

在网络命名空间中激活连接轨迹后,这些命令显然会导致没有操作:

代码语言:javascript
运行
复制
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_rawraw_before_defrag=1模块,这将恢复分段ping的阻塞:

代码语言:javascript
运行
复制
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链中再次阻塞:

代码语言:javascript
运行
复制
ip netns exec receiver ip6tables -t raw -A PREROUTING -m ipv6header --header ipv6-frag --soft -j CT --notrack

这只是一个没有多大意义的例子。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/964072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档