我用 flask 写的服务,服务部署在公司没网,没有 nginx,如果请求来自内网,那就没问题,如果请求来自外网,那就只能获取到一个固定的内网 IP。
获取 IP 用的是 request.remore_addr,请教下大家这有可能是什么问题造成的?
1 foxyier 2019-03-26 16:45:47 +08:00 "服务部署在公司没网, 没有 nginx" 没看懂 |
![]() | 2 mayorbryant 2019-03-26 16:51:25 +08:00 你是 127 启动的还是 0.0.0.0 |
3 ebingtel 2019-03-26 16:51:48 +08:00 这个固定的内网 IP 就是 nginx 那台机器的地址吧?需要设置一下 nginx,让它真实的 IP 设置到某个 request header, flask 再读取这个 header |
![]() | 4 Ct5T66PVR1bW7b2z 2019-03-26 16:53:16 +08:00 try: ip = request.headers['X-Forwarded-For'].split(',')[0] except: ip = request.remote_addr |
![]() | 5 Latin 2019-03-26 16:53:22 +08:00 外网访问跑到了内网的网关去了呗,还是套个 nginx 拿比较实在 |
6 arrow8899 2019-03-26 16:54:02 +08:00 部署在内网,你外网用什么访问的,肯定是网关做了端口转发的吧,固定的 IP 就是网关的 IP |
![]() | 8 secsilm OP |
9 ThirdFlame 2019-03-26 17:14:03 +08:00 应该不是端口转发。 如果是端口转发的话,那么源 ip 还是 客户的 IP 不是防火墙 /路由器的 IP。 应该是一个类似于 nginx 的 反代或者是应用层代理。 建议抓下包,看下 http 头部中有没有 XFF 等字段。如果没有那就得沟通 上级做所谓端口映射的设备了。 |
![]() | 10 fucker 2019-03-26 17:16:02 +08:00 9L 正解 |
![]() | 11 fucker 2019-03-26 17:17:48 +08:00 |
![]() | 12 Ct5T66PVR1bW7b2z 2019-03-26 17:42:20 +08:00 @secsilm 你确定 request.headers['X-Forwarded-For'].split(',')[0] 这个不行? nginx 反代之后,我一直都用这个 |
![]() | 13 wuyifar 2019-03-26 18:25:53 +08:00 二楼说的方法试了吗,host = 0.0.0.0 启动 |
14 xpresslink 2019-03-26 18:59:38 +08:00 楼主这个问题从你自己这里无解。 从外网访问的用户都会通过你们网关服务器接入内网的,所以你的 web 服务器得到的都是网关的 IP。 除非你找网管来解决,直接给你的 web 做个反向代理,同转发完整的 HTTP 请求头。 如果是 nginx 做反向代理只要在配置里面加上这面这几项 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; |
![]() | 15 secsilm OP |
![]() | 16 secsilm OP |
![]() | 17 westoy 2019-03-26 19:45:43 +08:00 nginx 套一个 proxy.conf flask 套一个 werkzeug.contrib.fixers.ProxyFix 的 middleware |