Linux에서 사용 가능한 임시 포트 수를 어떻게 알 수 있습니까?


17

Linux에 사용 가능한 임시 포트 수를 확인하는 방법이 있습니까? 임시 포트가 부족하여 "주소가 이미 사용 중입니다"라는 오류가 나타나는 경우가 있습니다. 컴퓨터를 다시 부팅하면이 문제가 해결되지만 문제가 발생하기 전에 미리 파악하는 것이 좋습니다.


이와 같은 오류가 발생하면 작업에 적합한 소프트웨어 또는 아키텍처를 사용하지 않고 시스템을 남용하거나 소프트웨어가 잘못 작동하거나 잘못 구성되어있는 것이 좋습니다. 아마도 시간 초과가 응용 프로그램에 비해 너무 길거나 연결을 사용하지 않고 연결을 열어두고 있습니까?
Caleb

1
OS 기본값 이외의 추가 임시 포트가 필요한 유효한 응용 프로그램이 많이 있습니다.
GregB

답변:


26

ephermal 포트 범위는에 지정되어 /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, 시간을내어이 사람에게 정확한 정보를 제공해 주셔서 감사합니다.
Caleb

우리는 32800에서 61000의 범위를 가지고 있습니다. 일단 이것들이 사용되면 OS는 그것들을 다시 사용하지 않을 것입니다. 이것은 예상되는 동작이지만, 마지막으로 사용 가능한 포트에 도달하면 OS가 처음부터 다시 시작될 것으로 기대합니다. 이것은 일어나지 않는 것 같습니다. 또한, 이것은 단지 정기적으로 발생하는 것은 아닙니다. 간헐적이지만 많은 서버가 있습니다.
JMc


1
RFC 6335 를 준수하려면 /proc/sys/net/ipv4/ip_local_port_range49152-65535의 하위 집합이어야합니다. 따라서 범위의 하단을 49152 미만으로 줄이면 특정 위험에 처하게됩니다.
kasperd

필사적이고 수행중인 작업을 정확히 알고있는 경우를 제외하고 net.ipv4.tcp_tw_recycle 또는 net.ipv4.tcp_tw_reuse를 사용하지 마십시오. 잠재적 극단 문제에 서비스를 노출하고 있습니다.
키위

3

이 제한은 고유 (소스 IP, 피어 IP, 피어 포트) 튜플마다 적용됩니다. 따라서이 튜플별로 netstat/ 의 출력을 그룹화하고 ss각 그룹이 연결 제한에 얼마나 가까운 지 확인해야합니다.

이 게시물 에서는이 그룹화 방법에 대해 자세히 설명합니다. 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.