Flask Rest-Api本地正常运行但公网IP无法访问问题求助
解决Flask REST API公网POST请求失败的排查步骤
检查Ubuntu本地防火墙
Ubuntu默认启用ufw防火墙,可能拦截了5000端口的外部请求。执行以下操作:- 查看防火墙状态:
sudo ufw status - 若状态为
active且无5000端口允许规则,添加规则:sudo ufw allow 5000/tcp - 重启防火墙生效:
sudo ufw reload
- 查看防火墙状态:
验证Flask服务监听状态
确认Flask确实在监听所有网卡的5000端口:
执行命令:ss -tulpn | grep 5000
正常输出应包含0.0.0.0:5000及对应Python进程,说明监听配置生效。测试内网连通性
用公司内其他机器(非运行Flask的Ubuntu),通过Ubuntu内网IP+5000端口发起POST请求:
示例:curl -X POST -F "image=@test.jpg" http://内网IP:5000/你的接口路径
内网请求正常则问题出在路由器转发或公网层面;内网请求失败则需检查Flask接口路由定义、POST请求处理逻辑是否正确。检查Mikrotik路由器端口转发规则
- 登录路由器后台,进入
IP -> Firewall -> NAT页面 - 确认规则参数:
Chain为dstnat,Protocol为tcp,Dst. Port为5000,In. Interface为路由器WAN口,Action为dst-nat,To Addresses为Ubuntu固定内网IP,To Ports为5000 - 确保规则未被更高优先级的NAT规则覆盖,且WAN口确实绑定了你的公网IP
- 登录路由器后台,进入
排查公网端口连通性
用非公司网络的设备(如手机开移动数据)执行测试:- 测试端口可达性:
telnet 公网IP 5000 - 查看连接细节:
curl -v http://公网IP:5000 - 若显示
Connection refused,说明端口转发未生效;若显示Connection timed out,大概率是运营商屏蔽5000端口,或路由器WAN口防火墙拦截了请求
- 测试端口可达性:
解决运营商端口屏蔽问题
多数运营商会屏蔽80、443之外的常用端口,可尝试:- 修改Flask监听端口为高位端口(如12345):
app.run(host="0.0.0.0", port=12345, debug=True) - 更新路由器端口转发规则,将公网12345端口转发至Ubuntu内网IP的12345端口
- 重新用公网IP+新端口测试请求
- 修改Flask监听端口为高位端口(如12345):
切换到生产级WSGI服务器
Flask自带开发服务器不适合公网环境,存在兼容性风险。尝试用Gunicorn运行:- 安装Gunicorn:
pip install gunicorn - 启动服务:
gunicorn -w 4 -b 0.0.0.0:5000 你的Flask模块名:app(例如代码文件为app.py,则命令为gunicorn -w 4 -b 0.0.0.0:5000 app:app) - 再次测试公网请求
- 安装Gunicorn:
内容的提问来源于stack exchange,提问作者Md. Samiul Abid
相关产品推荐
相关产品推荐

