ในไซต์ลูกค้าทีมเครือข่ายเพิ่มไฟร์วอลล์ระหว่างไคลเอนต์และเซิร์ฟเวอร์ นี่ทำให้การเชื่อมต่อที่ไม่ได้ใช้งานถูกตัดการเชื่อมต่อหลังจากเวลาที่ไม่ได้ใช้งานประมาณ 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 ทั้งหมด