是否可以在IPv4和IPv6 (即双IP堆栈)中运行侦听瓶?据我检查,可以使用以下两种方法在IPv4中运行:
app.run(host='0.0.0.0', port=port, debug=True)或IPv6使用
app.run(host='::', port=port, debug=True)但是我还没有找到一种同时在这两种情况下运行的方法(可以让我的IPv4应用程序的一个实例侦听IPv6,而另一个实例侦听IPv6,但两者都不能侦听同一个端口)。
谢谢!
更新(附加信息):
下面是Steffann的评论(谢谢!),我已经开始在IPv6上收听我的应用程序了:
* Running on http://[::]:1028/
* Restarting with reloader然后用IPv6和IPv4卷发进行测试:
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 -我对第二行的解释是“某人”( OS?( 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 -发布于 2014-02-10 23:21:46
所发生的情况是,操作系统自动将传入的IPv4请求附加到侦听IPv6套接字。IPv4地址是映射与IPv6地址的前缀,以::ffff:作为前缀。因此,来自127.0.0.1的传入127.0.0.1连接看起来像是来自IPv6 address ::ffff:127.0.0.1。
从客户端的角度来看,它正在与IPv4服务器对话。客户端无法分辨出不同之处。从服务器的角度来看,每个人都使用IPv6进行连接。操作系统执行IPv4包和IPv6软件之间的映射。
这样做的效果是,您无需手动处理双堆栈编程,就可以开发软件。所有软件都可以为IPv6编写,并将所有地址作为IPv6地址处理。这可以简化代码(不需要同时处理侦听IPv4和侦听IPv6套接字等等)。虽然仍然提供了一个完整的双重堆栈的经验‘外部’。
因此,从系统外部看,您的服务是完全双堆栈的。但是,在应用程序本身中,您将看到用IPv6地址表示的整个世界,就像您在日志文件中显示的那样。这通常不会引起任何问题。不过,它可能会影响您处理ACL、日志记录和其他类似事情的方式。
发布于 2017-04-12 18:36:41
不幸的是,虽然Linux使用映射的IPv4地址来限定"::",但这并不适用于其他几个IPv6堆栈,例如Microsoft。*“将绑定到IPv6地址系列,出于安全原因,Windows和其他IPv6堆栈实现者已决定不将IPv4地址映射到IPv6地址空间,除非应用程序特别发出这样做的信号。就我所理解的讨论而言,这里的基本原理是,否则会发生意外的IPv4连接,从而破坏ACL或其他应用层安全机制。
https://stackoverflow.com/questions/21673068
复制相似问题