我想使一个本地的未encryption服务在端口8001上的IPv4和IPv6上通过SSL监听127.0.0.1:8000。
不幸的是,stunnelconfiguration
[Server] accept = 8001 connect = 8000
绑定只在IPv4上,因为我通过netstat和ncat检查:
~$ sudo netstat -an|grep 800 | grep LISTEN tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8001 0.0.0.0:* LISTEN ~$ ncat --ssl -v ::1 8001 Ncat: Version 6.46 ( http://nmap.org/ncat ) Ncat: Connection refused.
但是,该端口似乎也被封锁在IPv6上。 当我添加
[Server IPv6] accept = :::8001 connect = 8000
由于港口被封锁,stunnel将无法启动。
[ ] Service [pyload Web] (FD=7) bound to 0.0.0.0:8001 [!] Error binding service [pyload Web IPv6] to :::8001 [!] bind: Address already in use (98)
我已经尝试了我的stunnelconfiguration文件中的各个部分的两个订单。 我正在使用Ubuntu Utopic存储库的版本5.02。 有任何想法吗?
看起来我自己find了答案。 为什么这个IPv6 listen指令也不接受IPv4? 从nginx文档说明
In Linux by default any IPv6 TCP socket also accepts IPv4 traffic ... the runtime parameter: net.ipv6.bindv6only which has the value 0 by default.
所以我只用了[Server IPv6]。 这只给netstat一个tcp6入口,但是我也能通过IPv4连接。
这也解释了这个行为,因为stunnel会隐式地尝试在v6节中的IPv4端口。 我不确定我的解决scheme是否是良好的实践,如果可以依靠net.ipv6默认。 我认为在stunnel中应该有一个ipv6only选项,就像nginx和socat一样。
为了让ipv4和ipv6同时在我的ubuntu 16.04机器(一个Linode)上工作,我必须configurationstunnel绑定到所有 ipv6地址,如下所示:
accept = :::443
指定特定的ipv6地址将成功绑定到该地址,但不允许ipv4请求通过。
accept = ipv6.sqlite.org:443 ;# Does not accept IPv4