是否可以运行Flask来监听IPv4和IPv6(即双IP堆栈)?据我检查,可以使用以下命令在IPv4中运行:

app.run(host='0.0.0.0', port=port, debug=True)

或IPv6使用
app.run(host='::', port=port, debug=True)

但是我没有找到一种同时运行的方法(可能有我的Flask应用程序的一个实例监听IPv4,另一个实例监听IPv6,但两者不能监听同一端口)。

谢谢!

更新(附加信息):

Followd Sander Steffann评论(谢谢!),我已经开始在IPv6中监听我的应用程序:
* Running on http://[::]:1028/
* Restarting with reloader

然后使用IPv6和IPv4 curl 进行测试:
curl -g [::1]:1028/notify
curl 127.0.0.1:1028/notify

分别得到:
::1 - - [10/Feb/2014 12:04:51] "GET /notify HTTP/1.1" 200 -
::ffff:127.0.0.1 - - [10/Feb/2014 12:05:03] "GET /notify HTTP/1.1" 200 -

我对第二行的解释是“某人”(操作系统?Flask所依赖的底层网络库?)正在将IPv4请求转换为IPv6请求。但是,我知道这与在经典双堆栈设置中“本地”支持IPv4并不相同,即我希望有某种链接(这就是我运行应用程序时得到的(Running on http://0.0.0.0:1028/)
127.0.0.1 - - [10/Feb/2014 12:05:03] "GET /notify HTTP/1.1" 200 -

最佳答案

发生的情况是操作系统将传入的IPv4请求自动附加到监听的IPv6套接字。通过使用::ffff:作为前缀,IPv4地址为mapped到IPv6地址。因此,来自127.0.0.1的传入IPv4连接看起来像是来自IPv6地址::ffff:127.0.0.1

从客户端的角度来看,它正在与IPv4服务器通信。客户无法分辨出差异。从服务器的角度来看,每个人都在使用IPv6进行连接。操作系统执行IPv4数据包和IPv6软件之间的映射。

这样的效果是,您可以开发软件而无需手动处理双栈编程。可以为IPv6编写所有软件,并将所有地址作为IPv6地址处理。这样可以简化代码(无需同时具有监听IPv4和监听IPv6套接字等),同时仍然为“外部”提供完整的双栈体验。

因此,从系统外部看,您的服务是完全双堆栈的。在应用程序本身中,您将看到用IPv6地址表示的整个世界,就像在日志文件中显示的那样。通常不会造成任何问题。但是,这可能会影响您处理ACL,日志记录和其他类似方式的方式。

10-07 13:21
查看更多