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

Linux下Python HTTP服务器REMOTE_ADDR返回本地另一IP的原因

为什么本地访问绑定到多IP网卡的HTTP服务器时,REMOTE_ADDR是目标IP而非本地主IP?

问题场景

我使用Linux系统,本地IP为172.16.1.2,执行ip a命令可查看该IP。随后通过ip addr add 192.168.1.10 dev eth0命令为同一网卡eth0添加另一IP,此时ip a返回两个IP:172.16.1.2和192.168.1.10。接着将Python的wsgiref简单HTTP服务器绑定到192.168.1.10,代码如下:

from wsgiref.simple_server import make_server

def hello_world_app(environ, start_response):
    print(environ['REMOTE_ADDR'])  # why not 172.16.1.2
    start_response(status='200 OK', headers=[])
    return [b"Hello World"]


IP = '192.168.1.10'
PORT = 8000
make_server(IP, PORT, hello_world_app).serve_forever()

通过浏览器或curl访问http://192.168.1.10:8000时,服务器打印的REMOTE_ADDR是192.168.1.10而非本地IP 172.16.1.2。

原因解释

  • 本地回环路径的源地址优化:当你在同一台机器上访问自身的另一个IP时,Linux内核不会将数据包发送到物理网卡eth0,而是直接通过**回环接口(lo)**处理流量。为了优化本地通信效率,内核会自动将数据包的源地址设置为你访问的目标IP(即192.168.1.10),而非主机的主IP(172.16.1.2)。
  • 流量路径验证:可以用tcpdump工具验证这一点:
    • 执行tcpdump -i eth0 port 8000,不会捕获到任何访问数据包,说明流量未经过物理网卡。
    • 执行tcpdump -i lo port 8000,会看到源IP和目标IP均为192.168.1.10的数据包,证明流量走的是回环路径。

若需获取主IP的解决办法

如果需要让服务器获取到172.16.1.2,可通过另一台机器访问该HTTP服务:此时数据包会经过物理网络,源地址会显示为访问机器的IP;若要在本地访问时显示172.16.1.2,需修改Linux路由规则强制流量走物理网卡,但这种操作通常没有实际意义,因为回环路径本身是本地通信的最优方式。

内容的提问来源于stack exchange,提问作者user19315471

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:17:26