Я хотел бы сделать локальную незашифрованную службу, которая прослушивает 127.0.0.1:8000, доступной через SSL как на IPv4, так и на IPv6 на порту 8001.
К сожалению, конфигурация 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. Я использую версию 5.02 из репозитория Ubuntu Utopic. Любые идеи?
Похоже, я сам нашел ответ. Почему эта директива прослушивания 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.
Поэтому я использовал ТОЛЬКО [IPv6 сервера]. Это дает только запись tcp6 в netstat, но я также могу подключиться через IPv4.
Это также объясняет поведение, поскольку stunnel неявно пытается подключиться к порту IPv4 в разделе v6. Я не уверен, является ли мое решение хорошей практикой и можно ли полагаться на значение по умолчанию net.ipv6. Я думаю, что в stunnel должна быть опция ipv6only, как для nginx и socat.
Чтобы ipv4 и ipv6 работали одновременно на моем компьютере с Ubuntu 16.04 (Linode), мне пришлось настроить stunnel для привязки к все адреса ipv6, например:
accept = :::443
Указание определенного адреса ipv6 приведет к успешной привязке к этому одному адресу, но не позволит проходить запросам ipv4.
accept = ipv6.sqlite.org:443 ;# Does not accept IPv4