लिनक्स पर, मैं कैसे बता सकता हूं कि कितने अल्पकालिक पोर्ट उपलब्ध हैं?


17

क्या लिनक्स में यह जांचने के लिए एक विधि है कि कितने अल्पकालिक पोर्ट उपलब्ध हैं? मैं कभी-कभी पंचांगों से बाहर निकलने के परिणामस्वरूप त्रुटियों को "पहले से ही उपयोग में पता" देखता हूं। एक मशीन रिबूट इसे हल करेगा लेकिन ऐसा होने से पहले इसे पकड़ना बेहतर होगा।


यदि आप इस तरह की त्रुटियों को मार रहे हैं, तो मैं आपको सुझाव दूंगा कि या तो आप या तो नौकरी के लिए सही सॉफ्टवेयर या आर्किटेक्चर का उपयोग करके सिस्टम का दुरुपयोग कर रहे हैं, या आपका सॉफ्टवेयर गलत व्यवहार कर रहा है या गलत है। शायद आपके आवेदन के लिए आपके टाइमआउट बहुत लंबे हैं या कुछ का उपयोग किए बिना कनेक्शन खुला छोड़ रहे हैं?
कालेब

1
कई वैध अनुप्रयोग हैं जिनके लिए ओएस चूक से परे अतिरिक्त अल्पकालिक बंदरगाहों की आवश्यकता होती है।
ग्रेग

जवाबों:


26

इफर्मल पोर्ट रेंज में निर्दिष्ट है /proc/sys/net/ipv4/ip_local_port_range। आप संभवतः इसे 16k से 64k तक चलाने के लिए बढ़ा सकते हैं।

आप का उपयोग कर खुले कनेक्शन की संख्या देख सकते हैं netstat -an। यदि आप बहुत सारे कनेक्शन खोल रहे हैं और बंद कर रहे हैं तो सॉकेट्स TIME_WAIT स्थिति में अटक सकते हैं। कुछ स्थानों पर यह अपरिहार्य है, लेकिन अगर आपको मामला है, तो आपको इस पर विचार करने की आवश्यकता हो सकती है कि क्या यह कनेक्शन का पूल है।

यदि TIME_WAIT समस्या है, तो आप कनेक्शन टर्नओवर को गति देने के लिए सेट net.ipv4.tcp_tw_reuse/ कर सकते हैं net.ipv4.tcp_tw_recycle


+1, इस आदमी को सटीक विवरण देने के लिए समय निकालने के लिए धन्यवाद।
कालेब

हमारे पास 32800 से 61000 तक की सीमा है। हम बस यह पाते हैं कि एक बार इनका उपयोग करने के बाद ओएस दोबारा इनका उपयोग नहीं करेगा। यह अपेक्षित व्यवहार है, लेकिन मैं उम्मीद करूंगा कि पिछले उपलब्ध पोर्ट पर पहुंचने के बाद ओएस फिर से शुरू हो। हालांकि ऐसा होता नहीं दिख रहा है। इसके अलावा, बस ध्यान दें, यह एक नियमित रूप से नहीं है। यह आंतरायिक है लेकिन हमारे पास बड़ी संख्या में सर्वर हैं।
JMc

ध्यान दें कि net.ipv4.tcp_tw_recycleलिनक्स 4.12
Anon

1
RFC 6335 का अनुपालन /proc/sys/net/ipv4/ip_local_port_rangeकरने के लिए 49152-65535 का सबसेट होना चाहिए। इसलिए 49152 से कम की सीमा के निचले छोर को कम करना एक निश्चित जोखिम पर आता है।
21

कभी भी उपयोगकर्ता net.ipv4.tcp_tw_recycle और net.ipv4.tcp_tw_reuse को छोड़कर अगर आप हताश हैं और ठीक से जानते हैं कि आप क्या कर रहे हैं। आप संभावित विलोपन समस्या के लिए अपनी सेवा को उजागर कर रहे हैं।
किवी

3

यह ध्यान रखें कि यह सीमा अद्वितीय (स्रोत आईपी, पीयर आईपी, पीयर पोर्ट) टपल के अनुसार लागू होती है। इसलिए आपको इनमें से प्रत्येक tuples द्वारा netstat/ के आउटपुट को समूहित करना होगा ss, और यह जांचना होगा कि प्रत्येक समूह कनेक्शन सीमा के कितना करीब है।

यह पोस्ट बताती है कि आप इस समूह को और अधिक विस्तार से कैसे कर सकते हैं। यह जाँचने के लिए कि प्रत्येक समूह रूबी में सीमा के कितना करीब है, आप 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.