【问题标题】:IPv6 reader in PythonPython 中的 IPv6 阅读器
【发布时间】:2019-02-06 23:32:46
【问题描述】:

我有一个小的 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 地址?

【问题讨论】:

  • 要获得 IPv6 地址,对端必须通过 IPv6 连接。
  • 有没有办法通过 IPv6 强制连接?

标签: python flask server ip


【解决方案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。

如果你想看到不同的东西,你必须改变你的客户发送请求的方式。

【讨论】:

  • 感谢您的回复,虽然它很有用,但这还没有解决我的问题。我正在寻找我唯一的 IPv6 地址,而不是我的 IPv4 地址到 IPv6 格式的转换。例如,如果我访问 whatip.me,这会显示我唯一的 IPv6 地址 - 这是我想用 Python 阅读的内容。
【解决方案2】:

PythonAnywhere 处理的所有请求都通过 IPv4,因此您不会看到 IPv6 地址。

【讨论】:

  • 啊,这是我不知道的事情。当然可以解释!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2012-02-28
相关资源
最近更新 更多