开发者

dual-stack ipv6/ipv4 on localhost

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 o开发者_开发技巧nly 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?


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.


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?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜