如何修改Python运行时以仅允许向localhost等指定地址端口发起TCP连接
实现方案:通过猴子补丁拦截socket连接
Python 中所有 TCP 网络请求最终都会调用 socket.socket.connect() 方法,对该方法做包装添加白名单校验,即可实现指定地址/端口的放行限制,该方案对所有基于 socket 实现的第三方库(包括请求库、数据库驱动等)都生效。
完整实现代码
import socket from functools import wraps # 白名单配置规则:(允许的主机名/IP, 允许的端口),端口填None表示允许该主机的所有端口 ALLOWED_CONNECTIONS = [ ("localhost", 3306), # 放行本地MySQL连接 ("127.0.0.1", 5432), # 放行本地PostgreSQL连接 ("::1", None), # 放行IPv6本地回环的所有端口 ] # 备份原生connect方法 _original_connect = socket.socket.connect @wraps(_original_connect) def _wrapped_connect(self, address): host, port = address allowed = False for allow_host, allow_port in ALLOWED_CONNECTIONS: if host == allow_host and (allow_port is None or port == allow_port): allowed = True break if not allowed: raise ConnectionRefusedError(f"禁止连接到非白名单地址 {host}:{port}") return _original_connect(self, address) # 替换原生方法实现拦截 socket.socket.connect = _wrapped_connect
使用说明
- 按需修改
ALLOWED_CONNECTIONS配置即可自定义放行的地址和端口,支持本地回环、自定义内网IP等任意主机 - 如果需要临时关闭拦截,将
socket.socket.connect重新赋值为之前备份的_original_connect即可 - 单元测试场景可将该补丁逻辑放到测试框架的全局前置钩子中(比如pytest的
pytest_sessionstart),仅在测试运行时生效,不影响生产代码。
内容的提问来源于stack exchange,提问作者warvariuc
相关产品推荐
相关产品推荐

