리눅스 네트워킹 포트 고갈 가 웹 서버에 65k 이상 연결을

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

엄격하게 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) 임시 포트.



답변

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

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은 정상입니다.


답변

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 이상을 지원할 수 있습니다.