เหตุใดไฟร์วอลล์ของเรา (Ubuntu 8.04) จึงปฏิเสธแพ็กเก็ตสุดท้าย (FIN, ACK, PSH) ด้วย RST


20

พื้นหลังเป็นเวลานานที่เราประสบปัญหากับไฟร์วอลล์ของเราที่บางครั้งทำให้การร้องขอ HTTP ถูกระงับการโหลดบางส่วนจนกระทั่ง TCP หมดเวลา

หลังจากติดตามปริมาณการใช้งานบนไฟร์วอลล์ฉันสังเกตเห็นว่ามันเกิดขึ้นเฉพาะในช่วงเวลาที่กำหนดเช่นเมื่อเว็บเซิร์ฟเวอร์ส่งการตอบสนองทั้งหมดก่อนที่ลูกค้าจะส่ง ACK ตัวที่สองบนเพย์โหลด [SYN, SYN / ACK, ACK] มีการแลกเปลี่ยนคำขอได้รับการส่งและ ACK'ed และได้รับแพ็คเก็ต RESPONSE แรกและ ACK'ed จากนั้นเว็บเซิร์ฟเวอร์จะส่งเนื้อหาการตอบสนองที่เหลือในหนึ่งช็อต (8 แพ็คเก็ต รวมถึง FIN สุดท้าย, PSH) และก่อนที่ลูกค้าจะได้รับ ACK ใด ๆ เหล่านั้นไฟร์วอลล์จะทำการตอบโต้ด้วย RST ไปยังเว็บเซิร์ฟเวอร์และทำให้ไคลเอนต์ไม่มีที่สิ้นสุด

นี่คือการติดตามทั้งหมดของ wireshark ที่มีแพ็กเก็ตจากทั้งสองด้านของไฟร์วอลล์ 192.168.126.161 เป็นที่อยู่ IP ของ NAT'et ส่วนตัวของลูกค้า 172.16.1.2 เป็นเว็บเซิร์ฟเวอร์ IP (ไม่แสดง IP สาธารณะจริง) และ 10.1.1.1 เป็น IP ภายนอกไฟร์วอลล์ (ไม่แสดง IP สาธารณะจริง)

2105 0.086275 192.168.126.161  172.16.1.2       TCP 37854 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=89375083 TSER=0
2106 0.000066 10.1.1.1         172.16.1.2       TCP 37854 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=89375083 TSER=0
2107 0.002643 172.16.1.2       10.1.1.1         TCP http > 37854 [SYN, ACK] Seq=0 Ack=1 Win=32768 Len=0 MSS=1460
2108 0.007705 172.16.1.2       192.168.126.161  TCP http > 37854 [SYN, ACK] Seq=0 Ack=1 Win=32768 Len=0 MSS=1460
2109 0.006301 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0
2110 0.000025 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0
2111 0.000007 192.168.126.161  172.16.1.2       HTTP GET /test/style.css HTTP/1.1 
2112 0.000015 10.1.1.1         172.16.1.2       HTTP GET /test/style.css HTTP/1.1 
2113 0.001536 172.16.1.2       10.1.1.1         TCP http > 37854 [ACK] Seq=1 Ack=111 Win=32658 Len=0
2114 0.000014 172.16.1.2       192.168.126.161  TCP http > 37854 [ACK] Seq=1 Ack=111 Win=32658 Len=0
2115 0.002274 172.16.1.2       10.1.1.1         HTTP HTTP/1.1 200 OK  (text/css)
2116 0.000025 172.16.1.2       192.168.126.161  HTTP HTTP/1.1 200 OK  (text/css)
2117 0.005689 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=1461 Win=8760 Len=0
2118 0.000024 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=1461 Win=8760 Len=0
2119 0.001536 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
2120 0.000026 172.16.1.2       192.168.126.161  HTTP Continuation or non-HTTP traffic
2121 0.000007 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
2122 0.000023 172.16.1.2       192.168.126.161  HTTP Continuation or non-HTTP traffic
2123 0.000313 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
2124 0.000030 172.16.1.2       192.168.126.161  HTTP Continuation or non-HTTP traffic
2125 0.000007 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
2126 0.000023 172.16.1.2       192.168.126.161  HTTP Continuation or non-HTTP traffic
2127 0.000009 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
2128 0.000023 172.16.1.2       192.168.126.161  HTTP Continuation or non-HTTP traffic
2129 0.001108 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
2130 0.000035 172.16.1.2       192.168.126.161  HTTP Continuation or non-HTTP traffic
2131 0.000008 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
2132 0.000022 172.16.1.2       192.168.126.161  HTTP Continuation or non-HTTP traffic
2133 0.000007 172.16.1.2       10.1.1.1         HTTP Continuation or non-HTTP traffic
REJECT-->
2134 0.000089 10.1.1.1         172.16.1.2       TCP 37854 > http [RST] Seq=111 Win=0 Len=0
CLIENT FIRST ACK-->
2135 0.002421 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=2921 Win=11680 Len=0
2136 0.000033 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=2921 Win=11680 Len=0
2137 0.000007 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=4381 Win=14600 Len=0
2138 0.000014 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=4381 Win=14600 Len=0
2139 0.000008 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=5841 Win=17520 Len=0
2140 0.000014 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=5841 Win=17520 Len=0
2141 0.000007 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=7301 Win=20440 Len=0
2142 0.000013 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=7301 Win=20440 Len=0
2143 0.000007 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=8761 Win=23360 Len=0
2144 0.000015 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=8761 Win=23360 Len=0
2145 0.000007 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=10221 Win=26280 Len=0
2146 0.000013 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=10221 Win=26280 Len=0
2147 0.001059 192.168.126.161  172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=11681 Win=29200 Len=0
2148 0.000018 10.1.1.1         172.16.1.2       TCP 37854 > http [ACK] Seq=111 Ack=11681 Win=29200 Len=0

ฉันขุดและบันทึกการสำรวจเส้นทางแพ็คเก็ตตามแผนภูมินี้และดูเหมือนว่าแพ็คเก็ตที่เข้ามาล่าสุด 2133 ได้รับการผ่านการประมวลผลแบบดิบ, การควบคุม, การทำลาย, การประลอง แต่ก็หายไป ฉันไม่มีกฎการปฏิเสธใน iptables ของฉันฉันบันทึกกฎ DROP ทั้งหมดและไม่มีกฎใดที่แสดงว่าแพ็กเก็ต 2133 หายไป

ฉันชอบที่จะใช้เป้าหมายการสืบค้นกลับบนตัวกรองขาเข้า แต่น่าเสียดายที่อูบุนตู 8.04 ไม่ได้จัดส่งพร้อมการสนับสนุนเป้าหมายการติดตาม

ดังนั้นฉันจึงเชื่อว่ากฎการกำหนดเส้นทาง / conntrack / mangling ภายในบางอย่างมีผลบังคับใช้นั้นด้วยเหตุผลบางประการรีเซ็ตการเชื่อมต่อ อาจทราฟฟิกทริกเกอร์การป้องกัน DOS บางอย่าง แต่ฉันไม่รู้ว่าจะกำหนดค่า / วิเคราะห์ได้อย่างไร สิ่งที่น่าผิดหวังที่สุดคือแพ็คเก็ตถูกปฏิเสธและไม่มีอะไรเข้าสู่ระบบ ...

การร้องขอไฟล์นี้ทำงานได้ 100% จากโฮสต์ windows แต่มันล้มเหลวในโฮสต์ Linux บางตัวและ 99.9% ของการร้องขอทั้งหมดดำเนินการผ่าน แต่บางครั้งเวลาของแพ็กเก็ตทำให้เกิดพฤติกรรมนี้ในไฟร์วอลล์ของเรา

แก้ไข ตกลงตอนนี้ฉันได้เพิ่มการเข้าสู่ระบบมากมายใน iptables และดูเหมือนว่าสิ่งต่อไปนี้เกิดขึ้น (ยังไม่รู้ว่าทำไม!)

สำหรับแพ็กเก็ตที่ประสบความสำเร็จในการข้ามไฟร์วอลล์ทำตามขั้นตอนต่อไปนี้อ้างอิงตาราง / ขั้นตอนจากที่นี่

Table 3-3 step

2     raw-pre
      conntrack
3     mangle-pre
4     [nat-pre]
5     routing-decision -> destination forward
6     mangle-fwd
7     filter-fwd
8     mangle-post
9     [nat-post]

แพ็คเก็ต 2133 ที่ถูกปฏิเสธผ่านเส้นทางเหล่านี้:

Table 3-1 steps for the incoming FIN,ACK packet 2133
2     raw-pre
      conntrack
3     mangle-pre
4     [nat-pre]
5     routing-decision -> destination local
6     mangle-input
7     filter-input
8     local process emits RST -> webserver

Table 3-2 steps for the outgoing RST packet 2134 in response to 2133
1     raw-out
2     routing decision
      conntrack
3     mangle-out
      reroute-check
4     [nat-out]
5     filter-out
6     mangle-post
7     nat-post

สิ่งที่แปลกคือการตัดสินใจกำหนดเส้นทางสำหรับแพ็กเก็ต 2133 ในขั้นตอนที่ 5 ตอนนี้แตกต่างจากการตัดสินใจกำหนดเส้นทางสำหรับแพ็กเก็ตอื่น ๆ เมื่อวิเคราะห์คำขอที่ได้ผลเช่นไม่ติดขัดแม้ FIN สุดท้ายจะถูกกำหนดเส้นทางอย่างเหมาะสม ดูเหมือนว่ามีข้อบกพร่องในเคอร์เนลหรือการตัดสินใจกำหนดเส้นทางเป็น stateful ในบางวิธี

แก้ไข

สิ่งหนึ่งที่อาจทำให้เกิดปัญหาเหล่านี้คือข้อเท็จจริงดังต่อไปนี้ทราฟฟิกถูกกำหนดเส้นทางระหว่างไฟร์วอลล์และ LAN ท้องถิ่นดังนั้น LAN ไคลเอ็นต์ไม่ได้เชื่อมต่อโดยตรงกับไฟร์วอลล์ผ่าน L2

                +---------------------------+       +------------------+                         +------------------------+
                |                           |       |      Router      |   (   Lab network    )  |                        |
( Internet ) -- + eth1                 eth0 +-------+                  +-- (                  ) -+ Client 192.168.126.161 |
                | 10.1.1.1   192.168.60.254 |       |                  |   ( 192.168.126.0/24 )  |                        |
                +---------------------------+       +------------------+                         +------------------------+

ในภาพนี้ 10.1.1.1 แสดงที่อยู่ IP ภายนอกของไฟร์วอลล์ที่อยู่อื่นทั้งหมดเป็นที่อยู่ IP จริงที่ใช้

นี่คือตารางเส้นทางในไฟร์วอลล์:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.1.1.0        0.0.0.0         255.255.255.240 U     0      0        0 eth1
192.168.126.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.60.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         10.1.1.15       0.0.0.0         UG    0      0        0 eth1

โปรดทราบว่า 10.1.1.0 และ gw เริ่มต้น 10.1.1.15 ถูกสร้างขึ้นส่วนที่เหลือจะเหมือนกับที่ใช้ ฉันต้องเพิ่มเส้นทาง 192.168.126.0/24 ด้วยตนเองเพื่อไปยังเครือข่ายแล็บจาก eth0 (192.168.60.254)

ต่อไปนี้เป็นบันทึกที่ครอบคลุมเกี่ยวกับการสำรวจเส้นทางแพ็คเก็ตสำหรับแพ็คเก็ต 2133 ครั้งล่าสุดที่ได้รับการปฏิเสธเนื่องจากถูกกำหนดเส้นทางไปยังโลคัลโฮสต์ (เช่นไฟร์วอลล์)

[16406874.374588] raw pre IN=eth1 OUT= MAC=00:02:b3:b9:ff:b5:00:90:1a:10:06:88:08:00 SRC=172.16.1.2 DST=10.1.1.1 LEN=1004 TOS=0x00 PREC=0x00 TTL=55 ID=13739 DF PROTO=TCP SPT=80 DPT=53497 WINDOW=5840 RES=0x00 ACK PSH FIN URGP=0 
[16406874.374625] mangle pre IN=eth1 OUT= MAC=00:02:b3:b9:ff:b5:00:90:1a:10:06:88:08:00 SRC=172.16.1.2 DST=10.1.1.1 LEN=1004 TOS=0x00 PREC=0x00 TTL=55 ID=13739 DF PROTO=TCP SPT=80 DPT=53497 WINDOW=5840 RES=0x00 ACK PSH FIN URGP=0 
[16406874.374667] mangle in IN=eth1 OUT= MAC=00:02:b3:b9:ff:b5:00:90:1a:10:06:88:08:00 SRC=172.16.1.2 DST=10.1.1.1 LEN=1004 TOS=0x00 PREC=0x00 TTL=55 ID=13739 DF PROTO=TCP SPT=80 DPT=53497 WINDOW=5840 RES=0x00 ACK PSH FIN URGP=0 
[16406874.374699] filter in IN=eth1 OUT= MAC=00:02:b3:b9:ff:b5:00:90:1a:10:06:88:08:00 SRC=172.16.1.2 DST=10.1.1.1 LEN=1004 TOS=0x00 PREC=0x00 TTL=55 ID=13739 DF PROTO=TCP SPT=80 DPT=53497 WINDOW=5840 RES=0x00 ACK PSH FIN URGP=0 
[16406874.374780] mangle out IN= OUT=eth1 SRC=10.1.1.1 DST=172.16.1.2 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=53497 DPT=80 WINDOW=0 RES=0x00 RST URGP=0 
[16406874.374807] mangle post IN= OUT=eth1 SRC=10.1.1.1 DST=172.16.1.2 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=53497 DPT=80 WINDOW=0 RES=0x00 RST URGP=0 
[16406874.378813] mangle pre IN=eth0 OUT= MAC=00:02:b3:b9:ff:b4:00:90:1a:10:0c:dd:08:00 SRC=192.168.126.161 DST=172.16.1.2 LEN=40 TOS=0x00 PREC=0x00 TTL=63 ID=35424 DF PROTO=TCP SPT=53497 DPT=80 WINDOW=11680 RES=0x00 ACK URGP=0 
[16406874.378863] mangle fwd IN=eth0 OUT=eth1 SRC=192.168.126.161 DST=172.16.1.2 LEN=40 TOS=0x00 PREC=0x00 TTL=62 ID=35424 DF PROTO=TCP SPT=53497 DPT=80 WINDOW=11680 RES=0x00 ACK URGP=0 

IP ภายนอก fw ภายนอกของเราถูกแทนที่ด้วย 10.1.1.1 และ ip ของเว็บเซิร์ฟเวอร์นอกเครือข่าย NAT'ed จะถูกแทนที่ด้วย 172.16.1.2

แก้ไขข่าวด่วน!

ตกลงล่าสุดพยายามที่จะ DROP แพ็คเก็ต RST ที่น่าสนใจมากฉันเพิ่มกฎ iptables ที่ลดลงแพ็คเก็ต RST ทั้งหมดที่กำหนดไว้ในเว็บเซิร์ฟเวอร์เรามีปัญหาในการร้องขอไฟล์จาก และจากนั้นก็ทำงานเช่น FIN สุดท้าย ACK, PSH แพ็คเก็ต 2133 ในบันทึกด้านบนถูกทิ้ง แต่เนื่องจาก RST ถูกทิ้งเว็บเซิร์ฟเวอร์มีเวลาที่จะได้รับมดทั้งหมดของ ACK จากนั้นตัดสินใจที่จะส่งแพ็กเก็ตสุดท้ายแพ็คเก็ต 2133 อีกครั้ง และตอนนี้มันจะผ่านไฟร์วอลล์ตั้งแต่โมดูล contrack ตอนนี้ได้เห็น ACK กลับมาจากลูกค้าและอนุญาตให้ ACK สุดท้ายแพ็คเก็ต FIN ด้วยอัตราสุดท้าย

ดังนั้นจึงเป็นปัญหาเวลา / หน้าต่างแน่นอนไฟล์นี้โดยเฉพาะกับเวลาของ ACK จากลูกค้าเรียกสิ่งที่ conntrack ที่ปฏิเสธแพ็กเก็ตสุดท้ายจากเว็บเซิร์ฟเวอร์

จนถึงตอนนี้ googling และการอ่านเอกสารของเคอร์เนลไม่พบสิ่งใดที่ทำให้เกิดพฤติกรรมนี้ขั้นตอนต่อไปคือการอ่านซอร์สโค้ดเคอร์เนลสำหรับโมดูลการเราต์ / คอนแท็ค

แก้ไขปัญหา

อย่างน้อยตอนนี้เราก็รู้ว่าเกิดอะไรขึ้นและมีวิธีแก้ปัญหาที่แก้ปัญหาได้

Sergey ชี้ไปที่รัฐที่มีค่ามาก - กฎการจับคู่ INVALID รัฐซึ่งช่วยในการตรวจแก้จุดบกพร่องมากมายตอนนี้ฉันทราบว่าการตั้งค่า iptables โดยไม่มีกฎที่ชัดเจนสำหรับแพ็กเก็ต INVALID ไม่สมบูรณ์ดังนั้นพฤติกรรมแปลก ๆ บางครั้งดูเหมือนจะเกิดขึ้น

เมื่อเปิดใช้งานการเข้าสู่ระบบในโมดูล conntrack สำหรับสิ่งที่ทำให้เกิดแพ็คเก็ตที่ไม่ถูกต้องสิ่งที่เกิดขึ้นมันชัดเจนและฉันสงสัยเกี่ยวกับเรื่องนี้

[16659529.322465] nf_ct_tcp: SEQ is over the upper bound (over the window of the receiver) IN= OUT= SRC=172.16.1.2 DST=10.1.1.1 LEN=1004 TOS=0x00 PREC=0x00 TTL=55 ID=40874 DF PROTO=TCP SPT=80 DPT=55498 SEQ=658735108 ACK=1194081763 WINDOW=5840 RES=0x00 ACK PSH FIN URGP=0 

อีกครั้ง 172.16.1.2 เป็นเว็บเซิร์ฟเวอร์ภายนอก (ซึ่งทำงานไม่ถูกต้อง) และ 10.1.1.1 เป็นที่อยู่ภายนอกของไฟร์วอลล์

เว็บเซิร์ฟเวอร์ส่งข้อมูลผ่านสายมากกว่าไคลเอนต์ที่โฆษณาในหน้าต่างรับ (การเชื่อมต่อเต็มรัฐและตรวจสอบสิ่งนี้) ดูเหมือนว่าเมื่อแพ็คเก็ต FIN มาถึงที่เชื่อมต่อ bails ออกเนื่องจากหน้าต่างรับเกินจริงมาก ก่อน

ฉันเชื่อว่าอาจเกิดจากการถ่าย TCP ไม่ถูกต้องในการ์ดเครือข่ายบนเว็บเซิร์ฟเวอร์ เมื่อฉันเริ่มวิเคราะห์สิ่งนี้ฉันได้จับภาพบนเว็บเซิร์ฟเวอร์และตามเฟรมจัมโบ้ tcpdump / wireshark ร่องรอยที่เขียนโดยเลเยอร์ TCP ในเคอร์เนลซึ่งถูกแบ่งเป็นเฟรมขนาดเล็กด้วย MTU = 1500 โดยการ์ดเครือข่าย เห็นได้ชัดว่าสิ่งนี้จำเป็นต้องได้รับการแก้ไขในเว็บเซิร์ฟเวอร์เนื่องจากมันไม่ถูกต้องพฤติกรรม TCP ในการส่งข้อมูลมากกว่าผู้รับมีโฆษณาในหน้าต่างรับของมัน

ทั้ง Polynomial และ Sergey ให้การป้อนข้อมูลที่มีค่า แต่ Sergey ชี้ให้ฉันเห็นถึงพฤติกรรมที่ถูกต้องของโมดูล conntrack / NAT ที่เกี่ยวกับการข้ามแพ็คเก็ต


คุณมีคำสั่งปฏิเสธในการกำหนดค่า iptables ของคุณ? ถ้าเป็นเช่นนั้นดูว่าคุณสามารถใช้การบันทึกเพื่อพิจารณาว่าเป็นกฎใด
Ladadadada

ไม่ไม่มีกฎการปฏิเสธดูเหมือนว่า REJECT เกิดขึ้นนอก iptables มันเกิดขึ้นระหว่างการตัดสินใจกำหนดเส้นทาง
ernelli

เป็นไปได้ไหมว่าไฟร์วอลล์ไม่รองรับหน้าต่างบานเลื่อน? การจับภาพจากไคลเอนต์ที่ใช้งานได้เปรียบเทียบกับสิ่งนี้ได้อย่างไร
joeqwerty

เมื่อใช้งานนอกเหนือจากแพ็กเก็ตทั้งหมดที่ถูกส่งต่อไปยังไคลเอนต์อย่างถูกต้องและไม่มีการส่งคืนแพ็กเก็ต RST ไคลเอ็นต์จะส่ง ACK ก่อน FIN สุดท้ายจากเซิร์ฟเวอร์ ฉันได้ตรวจสอบการถ่ายโอนข้อมูลจากไฟล์ขนาดใหญ่ (300k) แล้วไม่มีปัญหา การติดตามจากไฟล์ขนาดเล็กก็ใช้งานได้แพ็คเก็ตสุดท้ายที่มี FIN จะถูกส่งต่อ คุณช่วยอธิบายรายละเอียดเกี่ยวกับ "ไฟร์วอลล์ไม่รองรับการเลื่อนหน้าต่าง"
ernelli

คุณสามารถขยายการเชื่อมต่อระหว่างเราเตอร์และไคลเอ็นต์ห้องปฏิบัติการได้หรือไม่? คุณมี / 24 netmasks ใน 60 และ 126 ดังนั้นจึงไม่ชัดเจนว่าลูกค้าห้องปฏิบัติการสามารถส่งปริมาณการใช้งานได้อย่างไร netmask ของพวกเขาไม่ใช่ / 24 หรือไม่? พร็อกซีบางประเภทเกิดขึ้นหรือไม่ มีนามแฝงใน eth0: 1 สำหรับ 126.0 / 24 หรือไม่?
พหุนาม

คำตอบ:


9

สถานการณ์ที่คล้ายกันถูกอธิบายไว้ที่http://www.spinics.net/lists/netfilter/msg51408.html : แพ็คเก็ตบางอันที่ควรได้รับการประมวลผลโดย NAT จะถูกทำเครื่องหมายเป็น INVALID แทน ESTABLISHED และไปที่ห่วงโซ่ INPUT คุณควรเพิ่มกฎบางอย่างด้วย-m state --state INVALIDเพื่อตรวจสอบสิ่งนี้และคำตอบที่http://www.spinics.net/lists/netfilter/msg51409.htmlแนะนำว่าแพ็คเก็ต INVALID ดังกล่าวควร DROPped เสมอเนื่องจาก NAT ไม่ทำงานอย่างถูกต้อง ดังนั้นที่อยู่ในนั้นอาจผิด

หากแพ็คเก็ตที่มีปัญหาของคุณถูกทำเครื่องหมายว่าไม่ถูกต้องการเพิ่มiptables -I INPUT -m state --state INVALID -j DROPอาจจะแก้ปัญหาได้ (แพ็คเก็ตที่ใช้งานไม่ได้จะไปที่กระบวนการโลคัลและจะไม่ทำให้เกิดการตอบสนอง RST TCP จะกู้คืนจากแพ็คเก็ตที่หายไป จากนั้นคุณสามารถลองแก้ไขปัญหาเพิ่มเติมได้ตามที่อธิบายไว้ในhttp://www.spinics.net/lists/netfilter/msg51411.html :

echo 255 >/proc/sys/net/netfilter/nf_conntrack_log_invalid

(ในกรณีนั้นปัญหาเกิดจากฮาร์ดแวร์เครือข่ายที่ขาดไปตามเส้นทางอาจรวมกับ TCP checksum บางส่วนที่ขาดการโหลด)


4

ฉันได้เห็นพฤติกรรมนี้ในไฟร์วอลล์ประเภทอื่นและพฤติกรรมนั้นเหมือนกันฉันคิดว่าฉันจะทิ้งมันไป

ปัญหาที่ฉันมีคือไฟร์วอลล์ถูก NAT'ing ในพื้นที่เดียวกับพอร์ตชั่วคราวบนกล่อง สิ่งนี้จะทำให้เกิดพฤติกรรมที่แน่นอนนี้หากทั้งสองชนกันเนื่องจากเคอร์เนลได้รับการสมมติว่าการเชื่อมต่อมีความหมายสำหรับเครื่องท้องถิ่น ด้วยเหตุนี้มีสองสิ่งที่คุณสามารถตรวจสอบได้ ก่อนอื่นให้คุณระบุการกำหนดค่าพอร์ตขาออกใน iptables (โดยใช้ - กับพอร์ต) หรือคุณได้ปรับเปลี่ยนช่วงพอร์ตชั่วคราวบนเครื่อง:

$ cat /proc/sys/net/ipv4/ip_local_port_range

ในการวินิจฉัยคุณสามารถตั้งค่าการจับภาพและดูว่าคุณเห็นคำขออื่นใดโดยใช้ fw ip ภายนอกเดียวกันหรือไม่พอร์ตคำสั่งผสมภายใน 3 * MSL ก่อนเวลา RST (~ 180s ฉันคิดว่า)

ในขณะที่ฉันยังไม่มั่นใจว่าเป็นคำตอบยังถ้าฉันอยู่ในสถานการณ์นี้ฉันจะออกกฎก่อนแล้วดูอีกสองสิ่ง

ง่ายต่อการทำซ้ำหรือไม่? เป็นไปได้หรือไม่ที่จะจับการวินิจฉัยเพิ่มเติมจากกล่องไฟร์วอลล์และดูปัญหาที่เกิดขึ้น? ฉันจะพยายามจับภาพ:

$ netstat -anp
$ cat /proc/net/ip_conntrack

ทุกวินาทีหรือมากกว่านั้นในขณะที่พยายามทำซ้ำและดูว่ามีบางสิ่งบางอย่างที่มีผลผูกพันกับพอร์ตและสิ่งที่ตารางสวมหน้ากากดูเหมือนในระหว่างปัญหา

หากคุณไฟร์วอลล์ RST outbound ACK ในที่สุดจากไคลเอ็นต์ภายในจะทำให้การเชื่อมต่อสำเร็จหรือไม่

สิ่งสุดท้ายที่คุณเห็นบันทึกทั้งหมดหรือไม่ คุณได้ตรวจสอบ dmesg แล้วหรือยัง คุณได้ติดตั้ง *. * ในกล่องไฟร์วอลล์ในการตั้งค่า syslog เป็นไฟล์เพื่อให้แน่ใจหรือไม่?

แจ้งให้เราทราบสิ่งที่คุณพบ! ฉันขอขอบคุณจำนวนข้อมูลที่คุณให้ในคำถามขอบคุณ


ขอบคุณสำหรับความพยายามของคุณฉันสามารถทำซ้ำข้อผิดพลาด 100% คำขอทั้งหมดผ่านไฟร์วอลล์ทำงานได้ยกเว้นน้อยมาก คนที่ไม่ทำงานดูเหมือนจะตีปัญหาเรื่องขนาด / เวลาที่แม่นยำ ฉันสามารถเพิ่มการติดตาม Wireshark หลายรายการสำหรับคำขอที่ใหญ่กว่า / เล็กกว่าระหว่างไคลเอนต์ / เว็บเซิร์ฟเวอร์เดียวกันผ่านไฟร์วอลล์ที่ใช้งานได้ทั้งหมด แต่การติดตามด้านบนเป็นสิ่งที่ติดอยู่ ฉันได้เพิ่มข้อมูลใหม่ด้านบนซึ่งอาจกำหนดเวลาแสงส้มเกี่ยวกับปัญหา
ernelli

/ proc / sys / net / ipv4 / ip_local_port_range ถูกตั้งค่าเป็น [32768 61000] netstat ไม่แสดงพอร์ตที่ถูกเชื่อมต่อใด ๆ ip_conntrack แสดงการเชื่อมต่อเป็น establised เช่นความรักที่ยังคงเปิดอยู่ตั้งแต่ FIN สุดท้ายไม่ได้ถูกส่งต่อไปยังลูกค้า สถานะคือแพ็กเก็ต = 10 ไบต์ = 12084 [มั่นใจ] เครื่องหมาย = 0 secmark = 0 ใช้ = 1
ernelli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.