Python中的IPv6阅读器

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

我有一个小的Python代码来读取访问我的Flask网站的客户端的IP地址,托管在pythonanywhere.com上:

from flask import Flask, request 

app = Flask(__name__)

@app.route('/')
def hello_world():
    ipread1 = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
    print("The client IP1 is: %s" % (ipread1))
    return 'Hello  World!'

if __name__ == '__main__':
    app.run()

每次刷新网页时,这都会在服务器日志中正确返回我的IPv4地址。但是,我希望它能提供我的IPv6地址(我已经检查过我的确有)。

为此,我尝试过更改:

app.run()app.run(host='::')

但这仍然只是提供我的IPv4地址。如何强制Python提供我的IPv6地址?

python flask server ip
2个回答
0
投票

PythonAnywhere处理的所有请求都来自IPv4,因此您将看不到IPv6地址。


1
投票

考虑app.run()的第一个案例。你得到的是客户的IPV4地址,例如:

The client IP1 is: 127.0.0.1

现在,如果您添加参数host app.run(host='::'),您将在IPv6套接字上侦听并获取类似的内容:

The client IP1 is: ::ffff:127.0.0.1

客户端是否使用IPv6? 不,客户端仍在使用其IPv4地址并与IPv4服务器通信。所以,从它的角度来看,没有任何差异。你得到的v4-mapped-on-v6 address有以下形式的变化:

000 ... 000 |   FFFF  | IPv4 Address
   80 bits    16 bits     32 bits   

例如,参见相应的RFC

以这种方式,从服务器的角度来看,它看起来像是来自IPv6主机,并且它将能够使用双栈IPv4 / IPv6。

如果您想要查看不同的内容,则必须更改客户端发送请求的方式。

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