리눅스 네트워킹 포트 고갈


10

커널 소스에서 바로 파지 않고 가능한 한 많은 연구를 수행했습니다. 주제에 대한 많은 양의 잘못된 정보 / 잘못된 정보가있는 것 같습니다. 그래서 이것이 저와 다른 사람들에게 한 번에 대한 질문에 대답하기를 바랍니다.

엄격하게 IPv4를 사용하면 실제로 포트 소진이 가능합니까? 설명하겠습니다 :

  • 사용 가능한 65535 포트가 있습니다. 0을 사용할 수 없습니다.
  • 포트 소진은 (src ip, src port, dst ip, dst port) 튜플이 고유해야한다는 것을 읽었습니다.
  • 명확하고 가정하면 sysctl net.ipv4.ip_local_port_range 설정을 통해 임시 포트를 100 % 사용할 수 있다고 가정합니다.

그리고 이것이 질문입니다 : 이것이 어떻게 작동합니까?

  • 127.0.0.1:(x)에서 127.0.0.1:80까지 65k 연결 가능
  • 127.0.0.1:(x)에서 127.0.0.1:555까지 65k 연결 가능
  • 기본적으로 다시 한 번 질문은 (srcip, srcport, dstip, dstport) 고유해야합니까?
  • ip "A"에서 IP "B", 포트 "N"으로 65k 이상 연결 열 수 없습니다.
  • 마찬가지로 xxxx : 80에서 단일 IP 가 웹 서버에 65k 이상 연결을 열 수 없지만 다른 소스 IP 에서 온다면 65k 이상을 지원할 수 있습니까?

마지막으로, 나는 들어오는 임시 포트와 수신 포트에 대해 약간 혼란스러워합니다. 일단 연결이 설정되면 연결의 각면이 피어와 동등하다는 것을 알지만 그 전에는 다음과 같습니다.

예를 들어 실제로 (srcip, srcport, dstip, dstport) 튜플이 고유해야하는 경우, 예를 들어 활성화하면 왜 그렇습니까?

net.ipv4.ip_local_port_range = 1024 65535

1024-65535의 임시 포트를 사용할 수 있으므로 포트 3306 (예 : mySQL)에서 바인딩하는 서비스가있는 경우 포트가 사용 중이기 때문에 시작되지 않는 경우가 있습니다.

이것은 사실과 관련이 있습니까? (그리고 이것은 내가 확인을 요구하는 진술입니다) :

  • (srcip, srcport, dstip, dstport)는 포트 범위가 1-65535 인 각 연결마다 고유해야합니다 (OS의 임시 포트 사용에주의하지 않음)
  • 그러나 소켓을 바인드하려면 (srcip, srcport, *, *)로 표시 될 수 있습니다. 또는 이것을 넣는 또 다른 방법은 IP가 바인딩을 위해 어떤 이유로 포트를 사용하지 않아야합니까?

위의 동작을 확인할 수 있습니다. 즉, 위의 정확한 sysctl 줄을 사용하면 OS가 해당 포트를 사용한다고 가정하여 mySQL을 때때로 무작위로 다시 시작하지 못하기 때문에 mySQL을 1024보다 낮은 포트로 옮겼습니다 (3306) 임시 포트.


자세한 내용으로 답변을 업데이트했습니다. 궁금한 점이 있으시면 언제든지 문의하십시오.
89c3b1b8-b1ae-11e6-b842-48d705

답변:


8

여기에 두 가지 주요 질문이 있습니다.

1.

엄격하게 IPv4를 사용하면 실제로 포트 소진이 가능합니까?

예. 예를 들어 모든 연결을 NAT IP 주소로 보내는로드 밸런싱 라우터를 생각해보십시오. 이것은 SRC IP하나의 병목 현상에 많은 연결 이있을 때 발생할 수 있습니다 DST IP.

이것은 웹 서버가 다음과 같은 많은 연결을 가질 수 있음을 의미합니다.

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

그리고 그것은 완벽하게 괜찮습니다. 그러나 모든 '외국 주소'가 동일하면 문제가 발생할 수 있습니다 (예 : '하나의 IP 주소로 NAT <---> 서버를 수행하는 큰 라우터').

임시 포트 소진이 일반적인 문제가 아닌 이유에 대해 가정해야한다면 모든 포트에 청취 서비스가 필요하고 응답하기에 충분한 리소스가 필요하기 때문에 다른 리소스 (메모리, CPU)가 일반적으로 병목 현상이 발생하기 때문입니다.

그러나로드 밸런싱 회사에서 일할 때 개인적으로 몇 가지 포트 소진 문제를 겪었습니다.

2. 왜 사용한 포트가 청취 서비스에 문제가 될 수 있습니까?

"1024-365535의 임시 포트를 사용할 수 있지만 포트 3306 (예 : mySQL)에 바인딩하는 서비스가있는 경우 포트가 사용 중이기 때문에 시작되지 않는 경우가 있습니다."

mySQL 서버는 사용중인 포트 (예 : localhost : 3306 또는 모든 인터페이스)에 해당 포트에 바인딩 할 수 없습니다. 예를 들어 다음 netstat출력 에서 0.0.0.0:80 줄을 참조하십시오 .

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

이는 포트 80이 서버에 대한 모든 인터페이스에서 수신 대기 중임을 의미 합니다. nginx서버가 시작 되기 전에 다른 프로세스가 포트 80을 보유하면 nginx해당 포트를 제어 할 수 없으며 시작 절차가 실패 할 수 있습니다.

일반적으로 수신 서비스에는 호스트 시스템에서 요청한 미리 정의 된 포트 (또는 범위) (예 : 웹 서버의 경우 포트 80 및 443)가 있으므로 포트 3306은 정상입니다.


0

127.0.0.1:(x)에서 127.0.0.1:80까지 65k 연결 가능 127.0.0.1:(x)에서 127.0.0.1:555까지 65k 연결 가능

a : 예, 로컬 포트가 1-65535이면 연결 수는 65k-1입니다 (하나의 포트는 청취)

기본적으로 다시 한 번 질문은 (srcip, srcport, dstip, dstport) 고유해야합니까? A : 예

ip "A"에서 IP "B", 포트 "N"으로 65k 이상의 연결을 열 수 없습니다. 마찬가지로 단일 IP는 xxxx : 80에서 웹 서버에 65k 이상의 연결을 열 수 없었습니다. 그러나 훨씬 더 많은 것을 지원할 수있었습니다 소스 IP가 다른 한 65k 이상입니까?

a : srcip, srcport, dstip, dstport는 고유하기 때문에 단일 IP가 xxxx : 80에서 웹 서버에 65k 이상 연결을 열 수 없습니다. 예, soruce ip가 다른 경우 65k 이상을 지원할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.