Python http 服务器 REMOTE_ADDR 返回另一个本地 ip (Linux)

问题描述 投票:0回答:1

(我使用Linux)

我电脑的本地IP是

172.16.1.2

ip a
命令返回
172.16.1.2

然后我可以将另一个IP添加到同一网络接口:

ip addr add 192.168.1.10 dev eth0

现在

ip a
命令返回2个IP

172.16.1.2
192.168.1.10

然后我将 Python 简单的 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

我的问题是为什么它打印

192.168.1.10
而不是
172.16.1.2

由于我从本地 IP 访问服务器,即
172.16.1.2
,我希望它是
REMOTE_ADDR

python linux ip http.server
1个回答
0
投票

如果路由表没有设置特定的“首选源地址”提示,则 Linux 使用“最长前缀匹配”选择本地地址;也就是说,它通常会尝试选择与目的地最相似的源地址。

在这种情况下,

192.168.1.10 ↔ 192.168.1.10
匹配所有32位(一如既往从左开始),而
172.16.1.2 ↔ 192.168.1.10
仅匹配1位,因此系统选择前者。

(这不是完整的描述 - 我确信还有一些其他条件我已经忘记了,而且 IPv4 和 IPv6 之间的工作方式也略有不同。)

© www.soinside.com 2019 - 2024. All rights reserved.