บน Linux ฉันจะบอกได้อย่างไรว่ามีพอร์ตชั่วคราวจำนวนเท่าใดที่มีอยู่


17

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


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

1
มีแอปพลิเคชั่นที่ถูกต้องมากมายที่ต้องใช้พอร์ตชั่วคราวเพิ่มเติมนอกเหนือจากค่าเริ่มต้นของระบบปฏิบัติการ
GregB

คำตอบ:


26

ช่วงพอร์ต ephermal /proc/sys/net/ipv4/ip_local_port_rangeระบุไว้ใน คุณสามารถขยายให้เรียกใช้จาก 16k เป็น 64k

netstat -anคุณจะเห็นจำนวนของการเชื่อมต่อที่เปิดใช้ Sockets อาจติดอยู่ในสถานะ TIME_WAIT หากคุณกำลังเปิดและปิดการเชื่อมต่อจำนวนมาก ในบางสถานที่สิ่งนี้ไม่สามารถหลีกเลี่ยงได้ แต่คุณอาจต้องพิจารณาหากคุณต้องการกลุ่มการเชื่อมต่อหากเป็นกรณีนี้

หาก TIME_WAIT เป็นปัญหาคุณสามารถตั้งค่าnet.ipv4.tcp_tw_reuse/ net.ipv4.tcp_tw_recycleเพื่อเพิ่มความเร็วในการหมุนเวียนการเชื่อมต่อ


+1 ขอบคุณที่สละเวลาให้รายละเอียดที่แน่นอนแก่เจ้านี่
Caleb

เรามีช่วงของ 32,800 ถึง 61,000 เราเพิ่งพบว่าเมื่อสิ่งเหล่านี้ถูกใช้แล้วระบบปฏิบัติการจะไม่ใช้อีกต่อไป นี่เป็นลักษณะการทำงานที่คาดไว้ แต่ฉันคาดว่าระบบปฏิบัติการจะเริ่มต้นอีกครั้งเมื่อเริ่มต้นเมื่อถึงพอร์ตสุดท้ายที่มีอยู่ สิ่งนี้ดูเหมือนจะไม่เกิดขึ้น นอกจากนี้เพื่อทราบว่านี่ไม่ได้เกิดขึ้นเป็นประจำอย่างมหาศาล มันเป็นระยะ ๆ แต่เรามีเซิร์ฟเวอร์จำนวนมาก
JMc


1
เพื่อให้สอดคล้องกับRFC 6335 /proc/sys/net/ipv4/ip_local_port_rangeจะต้องเป็นชุดย่อยของ 49152-65535 ดังนั้นการลดจุดสิ้นสุดของช่วงล่างเป็นอะไรที่น้อยกว่า 49152 จึงมีความเสี่ยง
kasperd

ไม่เคยเป็นผู้ใช้ net.ipv4.tcp_tw_recycle และ net.ipv4.tcp_tw_reuse ยกเว้นถ้าคุณหมดหวังและรู้ว่ากำลังทำอะไรอยู่ คุณกำลังเปิดเผยบริการของคุณเกี่ยวกับปัญหาที่อาจเป็นไปได้
กีวี

3

โปรดจำไว้ว่าข้อ จำกัด นี้มีผลต่อ tuple ที่ไม่ซ้ำกัน (ซอร์ส IP, เพียร์ IP, เพียร์พอร์ต) ดังนั้นคุณจะต้องจัดกลุ่มผลลัพธ์ของnetstat/ ssโดยแต่ละ tuples เหล่านี้และตรวจสอบว่าแต่ละกลุ่มปิดถึงขีด จำกัด การเชื่อมต่อ

โพสต์นี้จะอธิบายวิธีการจัดกลุ่มนี้ในรายละเอียดเพิ่มเติม ในการตรวจสอบว่าแต่ละกลุ่มปิดถึงขีด จำกัด ใน Ruby ได้อย่างไรคุณสามารถประมวลssผลผลลัพธ์เช่น:

#!/usr/bin/ruby

first_port, last_port = IO.read('/proc/sys/net/ipv4/ip_local_port_range').split.map(&:to_i)
ephemeral_port_max = last_port - first_port + 1
ephemeral_port_warning = ephemeral_port_max / 3 * 2

conns = `ss --numeric --tcp state connected "( sport >= :#{first_port} and sport <= :#{last_port} )"`

groups = Hash.new(0)
conns.lines.each do |conn|
  state, recvq, sendq, local, peer = conn.split
  local_ip, local_port = local.split(':')
  group = [local_ip, peer]
  groups[group] += 1
end

groups_requiring_warning =
  groups.select { |k, v| v > ephemeral_port_warning }
  .to_a
  .sort_by { |v1, v2| v1[1] <=> v2[1] } # Sort groups in descending order of number of connections

groups_requiring_warning.each do |group, used_port_count|
  puts "Connections from #{group[0]} to #{group[1]} "\
    "have used #{used_port_count} ephemeral ports out of #{ephemeral_port_max} max"\
    "(#{((used_port_count.to_f / ephemeral_port_max) * 100).round(2)}% used)"
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.