You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:35:23