Python套接字服务器:拒绝来自地址的连接

hrs*_*hrs 1 python sockets networking

我有一个监听端口的python套接字服务器,并使用以下方法接受所有传入连接:

(conn, address) = socket.accept()
Run Code Online (Sandbox Code Playgroud)

但是,我希望只接受来自某个IP地址的连接.

目前,如果未注册地址,我会关闭连接,以实现此目的.

但有没有更好的方法来做到这一点,直接拒绝来自未注册地址的连接,而不是接受连接然后关闭它们?

pts*_*pts 6

无法从某些IP地址指示Connection拒绝客户端,并且无法从其他IP地址建立与客户端的连接.这不是Python限制,而是较低级别的BSD套接字层限制.你甚至不能从C做到这一点.

您可以在Python中执行的最接近的行为是在接受连接后快速关闭连接:

sock, addr = server_socket.accept()
if addr[0] != '12.34.56.78':
  sock.close()
  return
...
Run Code Online (Sandbox Code Playgroud)

然后客户端将看到连接被接受,并且在此之后不久,客户端在读取它时将看到EOF,并且它将无法写入它.

但是,可以通过以下方法之一在绑定时通过接口(即网卡)进行限制:

server_socket.bind(('', 65432))  # Bind on any interface.
server_socket.bind(('127.0.0.1', 65432))  # Bind on loopback (localhost clients only).
server_socket.bind(('34.56.78.91', 65432))
Run Code Online (Sandbox Code Playgroud)

因此在127.0.0.1版本中,telnet 127.0.0.1 65432(作为客户端)可以工作,但telnet myhostname 65432会导致Connection拒绝(并且server_socket.accept()调用将不会获得此连接).