dual-stack ipv6/ipv4 on localhost

自古美人都是妖i 提交于 2019-12-10 17:38:50

问题


I have an ipv4 server that only accepts connections over localhost (using INADDR_LOOPBACK). I'd like to convert this server to be dual-stack ipv6/ipv4. However, using in6addr_loopback only accepts connections to ::1.

I've found that I can accept ipv4 and ipv6 connections simultaneously using in6addr_any, but as this also allows connections from anywhere it's not useful for my particular case.

Is it possible to bind to ipv6 localhost (::1) and ipv4 localhost (127.0.0.1) simultaneously?


回答1:


AFAIK, that is not possible.

What you will need to do is create two sockets, one bound to INADDR_LOOPBACK and one bound to in6addr_loopback. You can then wait on both of them simultaneously using your multiplexer of choice (poll, select, epoll, etc0).

Update

Just came up with some work-arounds that you may want to consider. In both of these work-arounds, you bind to in6addr_any.

  1. When a connection is established, check the remote address and if it's not 127.0.0.1 or ::1, close it. While the behavior of connecting on an IP address is not ideal (connections are established/immediately closed instead of being refused), the nice thing it that this can be done purely in your application.
  2. Adjust the settings of your OS's IP stack to refuse connections to your port from non loopback IP's. This is definitely doable on Linux with iptables. While the behavior is more ideal, it requires configuration external to your application.



回答2:


Just because your server is dual-stack, does your localhost-only app really need to be? Can you just pick one and go with it?



来源:https://stackoverflow.com/questions/2277536/dual-stack-ipv6-ipv4-on-localhost

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!