Tôi có hai máy chủ đang cố gắng thiết lập kết nối IPSec với nhau. Đối với điều này, họ phải giao tiếp trên các cổng UDP 500 và 4500, vì vậy tôi đã mở chúng trong tường lửa ở cả hai đầu (hiển thị trong phần có liên quan):
-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
Tuy nhiên, trao đổi quan trọng không bao giờ thành công. Mỗi bên tiếp tục cố gắng truyền lại các gói UDP nhiều lần, không bao giờ nghe thấy phản hồi, cho đến khi cuối cùng họ bỏ cuộc.
Tôi đã bắt đầu tcpdump
ở một đầu và quan sát thấy gói UDP đang bị phân mảnh và một cổng ICMP không thể truy cập được được trả lại sau khi đoạn thứ hai xuất hiện.
Một ví dụ về việc trao đổi thất bại như vậy (được vệ sinh để bảo vệ bạn):
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]
Tường lửa đã ghi lại những điều sau đây liên quan đến gói này:
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
Tôi có ấn tượng rằng Linux tự động ghép lại các đoạn trước khi chuyển chúng vào bộ lọc gói. Vậy tại sao những mảnh này không được ghép lại và do đó mảnh thứ hai sau đó bị từ chối?
iptables -A INPUT -p esp -j ACCEPT