Wireguard over TCP or over TLS

Wireguard over TCP or over TLS

06.08.2023 0 Автор Vovanys

В один из вечеров заметил что отвалился 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. Но заметка останется если нужно будет запрятать тунель..