TCP Keepalive และไฟร์วอลล์กำลังฆ่าเซสชันที่ไม่ทำงาน


10

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

เพื่อให้ได้สิ่งนี้เราต้องกำหนดค่าเซิร์ฟเวอร์ (เครื่อง Linux) ที่เปิดใช้ TCP keepalives ด้วย tcp_keepalive_time = 300, tcp_keepalive_intvl = 300 และ tcp_keepalive_probes = 30000 วิธีนี้ใช้งานได้และการเชื่อมต่อสามารถใช้งานได้หลายวัน อย่างไรก็ตามเราต้องการให้เซิร์ฟเวอร์ตรวจจับไคลเอนต์ที่ตายแล้วและฆ่าการเชื่อมต่อดังนั้นเราจึงเปลี่ยนการตั้งค่าเป็นเวลา = 300, intvl = 180, โพรบ = 10 โดยคิดว่าถ้าไคลเอนต์ยังมีชีวิตอยู่เซิร์ฟเวอร์จะสอบสวนทุก ๆ 300 วินาที (5 นาที) และไคลเอนต์จะตอบสนองด้วย ACK และนั่นจะทำให้ไฟร์วอลล์ไม่สามารถมองเห็นสิ่งนี้ว่าเป็นการเชื่อมต่อที่ไม่ได้ใช้งานและฆ่ามัน หากไคลเอ็นต์ตายหลังจากผ่านไป 10 โพรบเซิร์ฟเวอร์จะยกเลิกการเชื่อมต่อ ด้วยความประหลาดใจของเราการเชื่อมต่อที่ไม่ทำงาน แต่ยังมีชีวิตถูกฆ่าหลังจากประมาณ 40 นาทีเหมือนเมื่อก่อน

Wireshark ที่รันบนฝั่งไคลเอ็นต์ไม่แสดง keepalives เลยระหว่างเซิร์ฟเวอร์และไคลเอนต์แม้ว่าจะเปิดใช้งาน keepalives บนเซิร์ฟเวอร์ก็ตาม

เกิดอะไรขึ้นที่นี่

หากการตั้งค่า keepalive บนเซิร์ฟเวอร์คือ time = 300, intvl = 180, probes = 10 ฉันคาดหวังว่าหากไคลเอ็นต์ยังมีชีวิตอยู่ แต่ไม่ได้ใช้งานเซิร์ฟเวอร์จะส่งโพรบ keepalive ทุก ๆ 300 วินาทีและปล่อยการเชื่อมต่อเพียงอย่างเดียว ไคลเอนต์ตายมันจะส่งหนึ่งหลังจาก 300 วินาทีแล้ว 9 โพรบเพิ่มเติมทุก 180 วินาทีก่อนที่จะฆ่าการเชื่อมต่อ ฉันถูกไหม?

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

เซิร์ฟเวอร์เป็นโหนด Teradata และการเชื่อมต่อมาจากยูทิลิตี้ไคลเอ็นต์ Teradata ไปยังเซิร์ฟเวอร์ฐานข้อมูลพอร์ต 1025 ทางฝั่งเซิร์ฟเวอร์ แต่เราได้เห็นปัญหาเดียวกันกับการเชื่อมต่อ SSH ดังนั้นเราจึงคิดว่ามันมีผลต่อการเชื่อมต่อ TCP ทั้งหมด


2
คุณไม่มีคำอธิบายว่าพอร์ตหรือโปรโตคอลใดที่ไคลเอ็นต์ใช้เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ มันคือ SSH หรือเปล่า?
ewwhite

การระบุไฟร์วอลล์อาจช่วยได้เช่นกัน
Skaperen

3
ตรวจสอบว่ามีการเปิดใช้งาน Keepalive บนซ็อกเก็ตหรือไม่โดยเรียกใช้ netstat --timers -tn และตรวจสอบคำหลัก "keepalive" (เนื่องจากต้องเปิดใช้งานโดยซอฟต์แวร์บนซ็อกเก็ต) ข้อมูลเพิ่มเติมที่นี่: tldp.org/HOWTO/TCP-Keepalive-HOWTO/index.html ตรวจสอบค่าตัวจับเวลาเช่นกันค่าแรกคือวินาทีจนกระทั่งแพ็กเก็ต keepalive ถัดไปและอันที่สามคือจำนวนแพ็กเก็ต keepalive ที่ยอดเยี่ยมที่รอคอย ตอบกลับ (ถ้าฉันจำได้ถูกต้อง)
Victor Jerlin

1
โปรดดูที่นี่: linux-tips.com/t/how-to-keep-ssh-sessions-alive/255และสิ่งนี้: access.redhat.com/solutions/23874
P.Goli

2
คนในเครือข่ายของคุณอาจผิด หากพวกเขากำลังใช้ไฟร์วอลล์ stateful (พวกเขาเกือบจะแน่นอน) รายการที่จำเป็นสำหรับการเชื่อมต่อแต่ละครั้งที่ทำ หากไม่มีการหมดเวลาหน่วยความจำในไฟร์วอลล์จะรั่วไหลและไฟร์วอลล์จะหมดและหยุดทำงานในที่สุด แน่นอนพวกเขามีที่ไหนสักแห่งที่ไม่ได้ใช้งานหมดเวลา ...
เจมส์ Shewey

คำตอบ:


1

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

ผู้ค้าบางรายจะมีคุณสมบัติเช่น TCP Intercept, TCP State Bypass และ Dead Connection Detection ที่จะช่วยให้สามารถจัดการกับสถานการณ์พิเศษเช่นคุณ

ตัวเลือกอื่นคือการกำหนดค่าไฟร์วอลล์ด้วยพารามิเตอร์เดียวกับที่คุณมีบนเซิร์ฟเวอร์เพื่อให้แน่ใจว่าทุกอย่างสอดคล้องกัน

บนไฟร์วอลล์ cisco คุณมีคำสั่งต่อไปนี้เพื่อกำหนดค่า

ชื่อโฮสต์ (config) # เวลาหมดเวลาคุณลักษณะ

ไทม์เอาต์ conh hh: mm: ss— เวลาว่างหลังจากการเชื่อมต่อปิดระหว่าง 0: 5: 0 และ 1193: 0: 0 ค่าเริ่มต้นคือ 1 ชั่วโมง (1: 0: 0)

คุณมีหลายพารามิเตอร์ตามความต้องการของคุณ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.