首页 文章

Flask应用程序中的双IPv4和IPv6支持

提问于
浏览
5

是否可以运行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,但两者都不能监听同一个端口) .

谢谢!

Update (additional info):

在Sander Steffann评论之后(谢谢!),我已经开始在IPv6中监听我的应用了:

* Running on http://[::]:1028/
* Restarting with reloader

然后使用IPv6和IPv4 curls进行测试:

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 -

我对第二行的解释是"somebody"(操作系统?Flask所依赖的底层网络库?)正在将IPv4请求转换为IPv6请求 . 但是,据我所知,在经典的双栈设置中支持IPv4 "natively"是不一样的,也就是说我希望能有这样的东西(这是我运行应用程序时得到的)( Running on http://0.0.0.0:1028/

127.0.0.1 - - [10/Feb/2014 12:05:03] "GET /notify HTTP/1.1" 200 -

2 回答

  • 0

    不幸的是,虽然Linux使用映射的IPv4地址来限定“::”,但这不适用于其他几个IPv6堆栈,例如在Microsoft Windows上 . “::”将绑定到IPv6地址族,出于安全原因,Windows和其他IPv6堆栈实现者决定不将IPv4地址映射到IPv6地址空间,除非应用程序特别发出信号 . 就我理解的讨论而言,这里的理由是,否则会发生可能破坏ACL或其他应用层安全机制的意外IPv4连接 .

  • 7

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

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

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

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

相关问题