我有两个正在尝试建立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在将片段传递到数据包筛选器之前会自动对其进行重组。那么为什么这些片段没有被重新组装,因此第二个片段随后被拒绝了?
@ fukawi2是的,但这与这个问题无关。
—
迈克尔·汉普顿
iptables -A INPUT -p esp -j ACCEPT