如何让Python http.server仅绑定IPv6并禁用IPv4支持?
让Python http.server仅支持IPv6的方法
默认用python3 -m http.server --bind ::启动的服务器是双栈模式(同时支持IPv4和IPv6),这是因为系统IPv6套接字默认允许IPv4地址映射到IPv6,所以你能通过127.0.0.1:8000访问。要禁用IPv4,得手动修改套接字选项,下面是两种可行方法:
方法一:自定义Python脚本(推荐)
Python的http.server没有直接提供禁用IPv4的命令行参数,我们可以写一个简单的自定义脚本,强制开启IPV6_V6ONLY选项:
from http.server import HTTPServer, SimpleHTTPRequestHandler import socket class IPv6OnlyHTTPServer(HTTPServer): def server_bind(self): # 开启IPV6_V6ONLY,禁用IPv4映射 self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1) super().server_bind() if __name__ == "__main__": # 绑定到IPv6的任意地址,端口8000 server_address = ('::', 8000) httpd = IPv6OnlyHTTPServer(server_address, SimpleHTTPRequestHandler) print("仅IPv6的Web服务器已启动,访问地址:[::1]:8000") httpd.serve_forever()
使用步骤:
- 把上面的代码保存为
ipv6_server.py - 运行
python3 ipv6_server.py - 此时只能通过IPv6地址访问,比如本地用
[::1]:8000,IPv4的127.0.0.1:8000会无法连接
方法二:修改系统全局设置(不推荐)
Linux系统可以临时修改内核参数,强制所有绑定IPv6的程序仅支持IPv6:
sudo sysctl -w net.ipv6.bindv6only=1
这个设置是全局的,会影响所有使用IPv6套接字的程序,用完后可以用下面的命令恢复:
sudo sysctl -w net.ipv6.bindv6only=0
核心原理:系统默认的
IPV6_V6ONLY参数为0,允许IPv4地址映射为::ffff:x.x.x.x格式的IPv6地址,所以绑定::的服务器能接收IPv4请求。将该参数设为1后,套接字只会处理纯IPv6的请求,拒绝IPv4映射地址。
内容的提问来源于stack exchange,提问作者Ben Butterworth
相关产品推荐
相关产品推荐

