Wireguard over TCP or over TLS
В один из вечеров заметил что отвалился Wireguard и подключаться обратно не хотел.. Как известно он хорошо палится DPI. Я решил запараноить и загнать его через Stunnel.
Сам Stunnel работает через TCP используя TLS.
Он у меня уже был настроен когда я использовать его для проброса OpenVPN.
Stunnel настроен на 443 порту, там же где крутится и другой сайт но засчет SNI можно было разруливать кому отдавать трафик Nginx-у или Stunnel-y что еще повышает легитимность сервера.
Но так как Wireguard не умеет работать по TCP, а только по протоколу UDP нужно как то трансформировать трафик. На просторах интернета нашел проект известного VPN провайдера mullvad, который уже решил эту задачу, код на GitHub udp-over-tcp + еще один проект использующий этот же код proxyguard.
Схематично схема работы такова
Т.к. чистый UDP палится, пробуем завести трафик через Stunnel. И используем tcp2udp и udp2tcp для конвертации трафика из UDP в TCP и потом обратно.
Скомпилить бинари tcp2udp и udp2tcp из репы udp-over-tcp можно так
podman(или docker) run -it rust:latest /bin/bash
git clone https://github.com/mullvad/udp-over-tcp.git
cd /udp-over-tcp/ && ./build-static-bins.sh
Бинари будут лежать в папке /udp-over-tcp/target/x86_64-unknown-linux-gnu/release
Скопировать их можно через
docker/podman cp название_контейнера:/udp-over-tcp/target/x86_64-unknown-linux-gnu/release/tcp2udp tcp2udp
docker/podman cp название_контейнера:/udp-over-tcp/target/x86_64-unknown-linux-gnu/release/udp2tcp udp2tcp
Бинарь tcp2udp тащим на сервер, udp2tcp на клиента
Без Stunnel, если нужно просто завести трафик по TCP
На клиенте запускаем
RUST_LOG=debug ./udp2tcp --udp-listen 127.0.0.1:1234 --tcp-forward ip_server:8443
На сервере
RUST_LOG=debug ./tcp2udp --tcp-listen ip_server:8443 --udp-forward 127.0.0.1:port_wireguard --fwmark port_wireguard
fwmark использовать обязательно если порт вашего Wireguard не стандартный 51820
В клиенте Wireguard указываем наш порт и адрес который мы открыли 127.0.0.1:1234
При использовании Stunnel трафик заворачиваем на него, а потом из него.
P.S. через сутки все заработало как было по UDP. Но заметка останется если нужно будет запрятать тунель..