我想建立一个本地未加密的服务,该服务通过 SSL 在端口 8001 上的 IPv4 和 IPv6 上侦听 127.0.0.1:8000。
不幸的是,stunnel配置
[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)
我已经尝试了 stunnel 配置文件中相应部分的两个命令。我使用的是 Ubuntu Utopic 存储库中的 5.02 版本。有什么想法吗?
答案1
看来我自己找到了答案。为什么这个 IPv6 监听指令不接受 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 隐式尝试将 IPv4 端口装入 v6 部分。我不确定我的解决方案是否是最佳实践,以及是否可以依赖 net.ipv6 默认值。我认为 stunnel 中应该有一个 ipv6only 选项,就像 nginx 和 socat 一样。
答案2
为了让 ipv4 和 ipv6 在我的 ubuntu 16.04 机器(Linode)上同时工作,我必须配置 stunnel 来绑定到全部ipv6 地址,如下所示:
accept = :::443
指定特定的 ipv6 地址将成功绑定到该地址,但不允许 ipv4 请求通过。
accept = ipv6.sqlite.org:443 ;# Does not accept IPv4