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()或时,或者使用 port = 0 调用时。listen()bind()

它不会强制执行任何端口范围外部的客户端可以在连接到服务器时使用——您可以使用 iptables 或其他类型的防火墙来实现这一点,尽管这样的努力是完全没有意义的。

此外,在调用套接字之前,该ip_local_port_rangesysctl 不会阻止显式地bind()将套接字连接到任何空闲端口 >= 1024(无论是在范围内还是在范围外)connect()

有时您希望将 ipv4 和 ipv6 套接字绑定到同一端口,并且由于没有 API 可以实现此目的,您可以让内核使用 为 ipv6 套接字选择一个端口bind(port = 0),然后调用getsockname()并尝试将 ipv4 套接字绑定到同一个端口端口,然后冲洗/重复该过程,直到内核选择一个对 ipv4 和 ipv6 都可用的端口。这是 ssh 服务器在被请求使用 进行远程转发时必须执行的操作-R,但端口参数为 0。

相关内容