Django启动IPv6服务外部访问报Connection refused问题咨询
问题根因
服务返回RST包的核心原因是启动时绑定的地址错误:你执行启动命令时指定的[::1]:8000是IPv6协议的环回地址,和IPv4的127.0.0.1属性完全一致,仅允许服务器本机访问,不会在任何物理网卡的对外IPv6地址上监听端口。当外部设备的TCP请求到达服务器网卡后,内核检查发现8000端口没有在目标地址上处于监听状态,会直接返回RST包断开连接,这个现象和Django配置、防火墙规则无关。
修复步骤
- 替换服务启动命令,将绑定地址从环回地址改为IPv6全地址通配符,正确启动命令为:
python manage.py runserver --ipv6 "[::]:8000"
绑定::地址时,Linux/Windows默认会开启双栈监听,即同一进程会同时监听所有IPv4、IPv6地址的8000端口,不需要额外单独启动IPv4服务。
- 校验防火墙规则:执行
sudo ufw status查看规则列表,确认存在IPv6协议下8000端口的放行记录(通常显示为8000/tcp (v6) ALLOW Anywhere (v6))。如果缺失该条规则,重新执行sudo ufw allow 8000/tcp即可。 - 验证监听状态:服务启动后执行
ss -tlnp | grep 8000,如果输出存在:::8000的LISTEN记录,代表服务已经正常在所有网卡地址上监听,此时同局域网、外部网络的设备就可以通过服务器对应的IPv6地址正常访问服务。
注意:Django自带的runserver仅为开发调试设计,没有做并发、安全防护相关优化,不适合长期直接暴露在公网环境提供服务,长期对外使用建议搭配gunicorn+nginx做生产部署。
内容的提问来源于stack exchange,提问作者Trandus
相关产品推荐
相关产品推荐

