Ssl

在 IPv6 和 IPv4 上綁定 stunnel

  • March 14, 2017

我想在埠 8001 上的 IPv4 和 IPv6 上通過 SSL 提供偵聽 127.0.0.1:8000 的本地未加密服務。

不幸的是,stunnel 配置

[Server]
accept = 8001
connect = 8000

正如我通過 netstat 和 ncat 檢查過的那樣,僅在 IPv4 上綁定:

~$ 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 版。有任何想法嗎?

看來我自己找到了答案。為什麼這個 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 隱式嘗試綁定到 v6 部分中的 IPv4 埠。我不確定我的解決方案是否是好的做法,以及是否可以依賴 net.ipv6 預設值。我認為 stunnel 中應該有一個 ipv6only 選項,就像 nginx 和 socat 一樣。

引用自:https://serverfault.com/questions/666712