linux – 为什么iptables拒绝允许数据包的第二个和后续片段?

linux – 为什么iptables拒绝允许数据包的第二个和后续片段?,第1张

概述我有两个主机试图建立彼此的IPSec连接.为此,他们必须在UDP端口500和4500上进行通信,因此我在两端的防火墙中打开它们(如相关部分所示): -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT-A INPUT -m udp -p udp --dport 500 -j ACCEPT-A INPUT -m udp -p udp -- 我有两个主机试图建立彼此的IPSec连接.为此,他们必须在UDP端口500和4500上进行通信,因此我在两端的防火墙中打开它们(如相关部分所示):
-A input -m state --state ESTABliSHED,RELATED -j ACCEPT-A input -m udp -p udp --dport 500 -j ACCEPT-A input -m udp -p udp --dport 4500 -j ACCEPT#.....-A input -j REJECT --reject-with icmp6-port-unreachable

但是,密钥交换永远不会成功.每一方都不断尝试一遍又一遍地重传UDP数据包,从不听到响应,直到他们最终放弃.

我在一端启动了tcpdump并观察到UDP数据包被分段,并且在第二个片段进入后返回了一个ICMP端口无法访问.

这种失败的交换的一个例子(为保护而消毒):

04:00:43.311572 IP6 (hlim 51,next-header Fragment (44) payload length: 1240) 2001:db8::be6b:d879 > 2001:db8:f:608::2: frag (0x5efa507c:0|1232) ipsec-nat-t > ipsec-nat-t: NOnesP-encap: isakmp 2.0 msgid 00000001 cookie 55fa7f39522011ef->f8259707aad5f995: child_sa  ikev2_auth[I]: [|v2e] (len mismatch: isakmp 1596/ip 1220)04:00:43.311597 IP6 (hlim 51,next-header Fragment (44) payload length: 384) 2001:db8::be6b:d879 > 2001:db8:f:608::2: frag (0x5efa507c:1232|376)04:00:43.311722 IP6 (hlim 64,next-header ICMPv6 (58) payload length: 432) 2001:db8:f:608::2 > 2001:db8::be6b:d879: [icmp6 sum ok] ICMP6,destination unreachable,length 432,unreachable port[|icmp6]

防火墙记录了以下有关此数据包的信息:

Aug 26 04:00:43 grummle kernel: iptables: REJECT IN=eth0 OUT= MAC=############### SRC=2001:0db8:0000:0000:0000:0000:be6b:d879 DST=2001:0db8:000f:0608:0000:0000:0000:0002 LEN=424 TC=0 HOPliMIT=51 FLOWLBL=0 OPT ( FRAG:1232 ID:5efa507c ) PROTO=UDP

我的印象是linux在将片段传递给数据包过滤器之前会自动重新组合片段.那么为什么这些碎片没有被重新组装,因此第二个碎片随后被拒绝了?

解决方法 netfilter代码仅在数据包过滤 if your firewall rules use connection tracking之前为您重新组合片段(即防火墙规则是有状态的并且使用-m conntrack或不推荐的-m状态)或NAT.否则所有片段都会单独处理,你会遇到类似这样的问题.

这使得解决问题变得容易和明显(无论如何,回想起来).只需将连接跟踪添加到相关的防火墙规则即可.

-A input -m conntrack --ctstate ESTABliSHED,RELATED -j ACCEPT-A input -m conntrack --ctstate NEW -m udp -p udp --dport 500 -j ACCEPT-A input -m conntrack --ctstate NEW -m udp -p udp --dport 4500 -j ACCEPT

或者对于较旧的linux系统(例如RHEL 5及更早版本):

-A input -m state --state ESTABliSHED,RELATED -j ACCEPT-A input -m state --state NEW -m udp -p udp --dport 500 -j ACCEPT-A input -m state --state NEW -m udp -p udp --dport 4500 -j ACCEPT
总结

以上是内存溢出为你收集整理的linux – 为什么iptables拒绝允许数据包的第二个和后续片段?全部内容,希望文章能够帮你解决linux – 为什么iptables拒绝允许数据包的第二个和后续片段?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1041403.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存