TCP 클라이언트가 정의된 포트 범위 외부에 연결합니다.

TCP 클라이언트가 정의된 포트 범위 외부에 연결합니다.

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

관련 정보