TCP 서버는 Ubuntu 18.04 시스템에서 실행됩니다.
이 상자의 로컬 포트 범위 구성은 다음과 같습니다.
blah@blah:~# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
문제는 TCP 서버에 연결하는 일부 클라이언트의 경우 할당된 포트가 지난주와 같이 이 범위를 벗어나는 경우가 있다는 것입니다.
2010
2288
11970
11971
14114
14115
15781
17609
이는 악의적인 클라이언트에서 항상 발생합니다(AbuseIPDB에 따르면).
이유를 아시나요?
답변1
net.ipv4.ip_local_port_range
소켓이 이전에 바인딩되지 않았을 때 connect()
또는 포트 = 0으로 호출될 때 또는 호출될 때 소켓이 바인딩될 "임시" 포트만 제어합니다.listen()
bind()
포트 범위를 적용하지 않습니다.외부서버에 연결할 때 클라이언트를 사용할 수 있습니다. 이를 달성하기 위해 iptables나 다른 유형의 방화벽을 사용할 수 있지만 그러한 노력은 전혀 의미가 없습니다.
또한 이 sysctl은 소켓을 호출하기 전에 ip_local_port_range
소켓이 bind()
1024보다 큰 자유 포트(범위 내 또는 범위 밖)에 명시적으로 연결되는 것을 방지하지 않습니다 connect()
.
때로는 ipv4 및 ipv6 소켓을 동일한 포트에 바인딩하고 싶은데 이를 달성하기 위한 API가 없기 때문에 커널이 다음을 사용하여 ipv6 소켓에 대한 포트를 선택하도록 한 bind(port = 0)
다음 호출하여 getsockname()
ipv4 소켓을 동일한 포트에 바인딩하려고 시도할 수 있습니다. 그런 다음 커널이 ipv4 및 ipv6 모두에 사용 가능한 포트를 선택할 때까지 프로세스를 헹구거나 반복합니다. 이는 원격 전달에 SSH 서버를 사용하라는 요청을 받았을 때 SSH 서버가 수행해야 하는 작업이지만 -R
포트 매개변수는 0입니다.