การเชื่อมต่อที่ไม่ได้ใช้งานในสถานะ CLOSE_WAIT


30

ฉันมีเครื่อง SLES ที่สะสมการเชื่อมต่อ TCP ในสถานะ CLOSE_WAIT สำหรับสิ่งที่ดูเหมือนจะเป็นตลอดไป ตัวอธิบายเหล่านี้ดูดหน่วยความจำที่มีอยู่ทั้งหมดในที่สุด ในขณะนี้ฉันมี 3037 ของพวกเขา แต่มันสูงกว่ามากก่อนที่จะรีบูตเครื่องเร็ว ๆ นี้

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

# netstat -ton | grep CLOSE_WAIT
tcp      176      0 10.0.0.60:54882     10.0.0.12:31663      CLOSE_WAIT  off (0.00/0/0)
tcp       54      0 10.0.0.60:60957     10.0.0.12:4503       CLOSE_WAIT  off (0.00/0/0)
tcp       89      0 10.0.0.60:50959     10.0.0.12:3518       CLOSE_WAIT  off (0.00/0/0)

# netstat -tonp | grep CLOSE_WAIT
tcp       89      0 10.0.0.59:45598     10.0.0.12:1998       CLOSE_WAIT  -                   
tcp       15      0 10.0.0.59:60861     10.0.0.12:1938       CLOSE_WAIT  -                   
tcp        5      0 10.0.0.59:56173     10.0.0.12:1700       CLOSE_WAIT  -     

ฉันไม่ใช่เข็มขัดหนังสีดำเมื่อพูดถึงสแต็ก TCP หรือเครือข่ายเคอร์เนล แต่การตั้งค่า TCP ดูเหมือนว่ามีเหตุผลเนื่องจากค่าเหล่านี้เป็นค่าเริ่มต้นตามหน้า man:

# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time 
7200

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


โอ้และการวิจัยของฉันแสดงให้เห็นว่าคนอื่นเห็นสิ่งประดิษฐ์เช่นนี้ใน 'lsof -i' ฉันไม่เห็นอะไรแปลก ๆ
pboin

2
ลองsudo netstat -tonpดูว่าโปรแกรมนี้เกิดขึ้นกับอะไร
BillThor

1
stackoverflow.com/a/17697733/540323คำตอบของฉันจะช่วยได้
Amil Waduwawara

คำตอบ:


16

ไม่หมดเวลาไม่CLOSE_WAITได้ ฉันคิดว่านั่นคือสิ่งที่มีความoffหมายในผลลัพธ์ของคุณ

ในการออกจากCLOSE_WAITแอปพลิเคชันจะต้องปิดซ็อกเก็ตอย่างชัดเจน (หรือออก)

ดูวิธีการแบ่ง CLOSE_WAIT

หากnetstatแสดง-ในคอลัมน์กระบวนการ:

  • คุณกำลังใช้สิทธิ์และความสามารถที่เหมาะสม (เช่นในฐานะรูท) หรือไม่?
  • พวกเขาอาจเป็นกระบวนการเคอร์เนล (เช่น nfsd)

เมื่อทำเน็ตสต๊อตฉันมีสิทธิพิเศษเต็มรูปแบบใช่ ฉันจะตรวจสอบมุมกระบวนการของเคอร์เนล - นั่นเป็นความคิดที่ดี ฉันนิ่งงันจริงๆเพราะไม่ควรจะมีซ็อคเก็ตการฟังเลยยกเว้นพอร์ตที่รู้จักกันดีสองหรือสามพอร์ต อาจเป็นปัญหา iptables ที่แปลก ฉันจะตรวจสอบว่าเกินไป
pboin

1
ลิงก์เสีย
นาธาน

1
ขอขอบคุณอัปเดตเป็นunix.derkeiler.com/Mailing-Lists/SunManagers/2006-01/…
มิเคล

10

CLOSE_WAITบ่งชี้ว่าไคลเอ็นต์กำลังปิดการเชื่อมต่อ แต่แอปพลิเคชันยังไม่ได้ปิดหรือไคลเอ็นต์ไม่ได้ คุณควรระบุว่าโปรแกรมหรือโปรแกรมใดมีปัญหานี้ ลองใช้netstat -tonp 2>&1 | grep CLOSEเพื่อพิจารณาว่าโปรแกรมใดเป็นตัวเชื่อมต่อ

หากไม่มีรายการโปรแกรมแสดงว่ามีการให้บริการโดยเคอร์เนล เหล่านี้เป็นบริการ RPC มีแนวโน้มเช่นหรือnfs ฟังบริการเคอร์เนลสามารถแสดงด้วย rpc.lockdnetstat -lntp 2>&1 | grep -- -

นอกจากว่าบริการ RPC จะผูกเข้ากับพอร์ตคงที่พวกเขาจะผูกเข้ากับพอร์ตชั่วคราวเมื่อการเชื่อมต่อของคุณปรากฏขึ้น คุณอาจต้องการตรวจสอบกระบวนการและการเมาท์บนเซิร์ฟเวอร์อื่น

คุณสามารถผูกบริการ NFS ของคุณกับพอร์ตคงที่ได้โดยทำสิ่งต่อไปนี้:

  1. เลือกสี่พอร์ตที่ไม่ได้ใช้สำหรับ NFS (32763-32766 ใช้ที่นี่)
  2. เพิ่มพอร์ตที่คงที่สำหรับ NFS ไปยัง /etc/services
    rpc.statd-bc 32763 / udp # RCP statd ออกอากาศ
    rpc.statd-bc 32763 / tcp
    rpc.statd 32764 / udp # RCP statd Listen
    rpc.statd 32764 / tcp
    rpc.mountd 32765 / udp # RPC mountd
    rpc.mountd 32765 / tcp
    rpc.lockd 32766 / udp # RPC lockd / nlockmgr
    rpc.lockd 32766 / tcp
  3. กำหนดค่า statd เพื่อใช้ตัวเลือก --port 32763 --outgoing-port 32764
  4. กำหนดค่า rpcmountd เพื่อใช้ตัวเลือก --port 32765
  5. ปิดและเริ่มบริการ NFS และ RPC

ฉันเขียนว่าไม่มี PIDs แต่ไม่แสดงงานของฉัน ฉันทำการแก้ไขอย่างรวดเร็วตามคำแนะนำของคุณขอบคุณ
pboin

@opboin: เพิ่มความคิดเห็นในพอร์ตที่ไม่มี PIDS (บริการเคอร์เนล)
BillThor

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