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

Flask Rest-Api本地正常运行但公网IP无法访问问题求助

解决Flask REST API公网POST请求失败的排查步骤
  • 检查Ubuntu本地防火墙
    Ubuntu默认启用ufw防火墙,可能拦截了5000端口的外部请求。执行以下操作:

    1. 查看防火墙状态:sudo ufw status
    2. 若状态为active且无5000端口允许规则,添加规则:sudo ufw allow 5000/tcp
    3. 重启防火墙生效: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路由器端口转发规则

    1. 登录路由器后台,进入IP -> Firewall -> NAT页面
    2. 确认规则参数:Chain为dstnat,Protocol为tcp,Dst. Port为5000,In. Interface为路由器WAN口,Action为dst-nat,To Addresses为Ubuntu固定内网IP,To Ports为5000
    3. 确保规则未被更高优先级的NAT规则覆盖,且WAN口确实绑定了你的公网IP
  • 排查公网端口连通性
    用非公司网络的设备(如手机开移动数据)执行测试:

    • 测试端口可达性:telnet 公网IP 5000
    • 查看连接细节:curl -v http://公网IP:5000
    • 若显示Connection refused,说明端口转发未生效;若显示Connection timed out,大概率是运营商屏蔽5000端口,或路由器WAN口防火墙拦截了请求
  • 解决运营商端口屏蔽问题
    多数运营商会屏蔽80、443之外的常用端口,可尝试:

    1. 修改Flask监听端口为高位端口(如12345):app.run(host="0.0.0.0", port=12345, debug=True)
    2. 更新路由器端口转发规则,将公网12345端口转发至Ubuntu内网IP的12345端口
    3. 重新用公网IP+新端口测试请求
  • 切换到生产级WSGI服务器
    Flask自带开发服务器不适合公网环境,存在兼容性风险。尝试用Gunicorn运行:

    1. 安装Gunicorn:pip install gunicorn
    2. 启动服务:gunicorn -w 4 -b 0.0.0.0:5000 你的Flask模块名:app(例如代码文件为app.py,则命令为gunicorn -w 4 -b 0.0.0.0:5000 app:app)
    3. 再次测试公网请求

内容的提问来源于stack exchange,提问作者Md. Samiul Abid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:33:23