Tại sao iptables từ chối các mảnh thứ hai và tiếp theo của gói được phép?


9

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?


Là một lưu ý phụ, IME bạn cũng cần cho phép ESP:iptables -A INPUT -p esp -j ACCEPT
fukawi2

@ fukawi2 Có, nhưng điều đó không liên quan đến câu hỏi này.
Michael Hampton

Câu trả lời:


14

Mã bộ lọc mạng chỉ tập hợp lại các đoạn cho bạn trước khi lọc gói nếu quy tắc tường lửa của bạn sử dụng theo dõi kết nối (nghĩa là quy tắc tường lửa là trạng thái và sử dụng -m conntrackhoặc không dùng nữa -m state) hoặc NAT. Nếu không, tất cả các mảnh được xử lý riêng và bạn gặp vấn đề như thế này.

Điều này làm cho việc giải quyết vấn đề trở nên dễ dàng và rõ ràng (dù sao đi nữa, dù sao đi nữa). Chỉ cần thêm theo dõi kết nối với các quy tắc tường lửa trong câu hỏi.

-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

Hoặc đối với các hệ thống Linux cũ hơn (ví dụ: RHEL 5 trở về trước):

-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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.