WireGuard за прокси-сервером: как настроить туннель через прокси
Пошаговое руководство по настройке WireGuard через HTTP(S)-прокси: использование socat для TCP-туннеля, необходимые команды и типичные ошибки.
Содержание
WireGuard — это современный VPN-протокол, который работает поверх UDP. Именно это делает его быстрым и эффективным, но одновременно создаёт проблему в сетях, где администраторы разрешают только TCP-соединения через прокси-сервер. Если вы оказались за корпоративным или офисным прокси, то при подключении к WireGuard-серверу трафик просто не пойдёт: прокси отбрасывает UDP-пакеты, а WireGuard, в отличие от OpenVPN, не умеет самостоятельно оборачиваться в TCP. В этой статье разберём, как поднять свой туннель через HTTP(S)-прокси, не теряя скорость и не усложняя конфигурацию до предела.
Когда и зачем нужен WireGuard за прокси
Стандартная схема WireGuard предполагает прямой UDP-обмен между клиентом и сервером. Однако во многих сетях (офисы, учебные заведения, гостиницы) для выхода в интернет используется прокси-сервер, поддерживающий только TCP. Такой прокси принимает HTTP/HTTPS-запросы и метод CONNECT, но не пропускает UDP-дейтаграммы. В результате WireGuard, работающий на UDP, не может установить соединение.
Необходимость обхода прокси возникает также при подключении к серверу, который сам находится за прокси (например, в облаке с ограниченным доступом). В любом случае требуется организовать туннель, который упакует UDP-трафик WireGuard в TCP-поток и передаст его через прокси.
Варианты туннелирования WireGuard через прокси
На практике применяются несколько подходов:
- TCP-туннель на базе socat. На сервере socat слушает TCP-порт и пересылает данные на локальный UDP-порт WireGuard; на клиенте socat создаёт локальный UDP-порт и отправляет трафик через прокси на TCP-порт сервера. Это самый простой и надёжный метод.
- WebSocket-туннель (например, wstunnel). WireGuard-пакеты оборачиваются в WebSocket-кадры, которые проходят через HTTP-прокси. Требует дополнительного ПО на обеих сторонах.
- udp2raw. Утилита для маскировки UDP под TCP с шифрованием. Может работать через прокси, если использовать socat в паре.
Выбор зависит от доступных инструментов и ограничений прокси. Далее мы подробно остановимся на socat — он есть в большинстве дистрибутивов Linux, прост в настройке и не требует компиляции.
Настраиваем сервер: превращаем UDP в TCP через socat
Предположим, WireGuard-сервер уже настроен и слушает UDP-порт 51820. Установите socat (например, apt install socat или yum install socat).
Запустите на сервере socat, который будет принимать TCP-соединения и перенаправлять их на локальный UDP-порт WireGuard:
socat TCP-LISTEN:443,fork,reuseaddr UDP:127.0.0.1:51820
Эта команда заставляет socat слушать TCP-порт 443 (можете выбрать другой, если прокси разрешает только 80 или 443). Входящие TCP-пакеты пересылаются на UDP-порт 51820, где работает WireGuard. Опция fork необходима для обработки множества одновременных подключений, reuseaddr позволяет быстро перезапустить сервер без ожидания закрытия порта.
Убедитесь, что на сервере порт 443 открыт для входящих TCP-соединений и не используется другим сервисом (например, nginx). Если вы не хотите занимать стандартный порт, выберите любой свободный, но учтите, что многие прокси разрешают только определённые порты.
Настраиваем клиент: подключаемся через прокси
На клиентской машине (Linux, macOS или WSL) также потребуется socat. Создайте локальный UDP-порт, который будет отправлять данные через прокси на TCP-порт сервера:
socat UDP-LISTEN:51820,fork,reuseaddr PROXY:proxy.example.com:server.example.com:443,proxyport=3128
Разберём параметры:
UDP-LISTEN:51820— порт, на котором клиентский WireGuard будет ожидать ответы от сервера. Вы можете использовать любой свободный порт, например 51820.PROXY:proxy.example.com:server.example.com:443— адрес HTTP-прокси, затем адрес вашего WireGuard-сервера и его TCP-порт (443).proxyport=3128— порт самого прокси (обычно 3128, 8080 или 80, уточните у администратора).
Если прокси требует логин и пароль, добавьте опции username= и password= в команду socat. Например:
socat UDP-LISTEN:51820,fork,reuseaddr PROXY:proxy.example.com:server.example.com:443,proxyport=3128,username=user,password=pass
Теперь в конфигурации WireGuard на клиенте укажите endpoint как 127.0.0.1:51820:
[Interface]
PrivateKey = ...
Address = 10.0.0.2/24
[Peer]
PublicKey = ...
Endpoint = 127.0.0.1:51820
AllowedIPs = 0.0.0.0/0
После запуска WireGuard все пакеты будут отправляться на локальный socat, который через прокси доставит их на сервер. Обратные пакеты вернутся тем же путём.
Проверка и диагностика
Запустите серверный socat, затем клиентский. Выполните ping 10.0.0.1 (или адрес интерфейса WireGuard). Если ответ не приходит, проверьте по шагам:
- Убедитесь, что прокси поддерживает метод CONNECT и разрешает исходящие подключения к IP вашего сервера на порт 443. Проще всего проверить с помощью
curl -x proxy.example.com:3128 https://server.example.com:443— если соединение устанавливается, CONNECT работает. - Проверьте, слушает ли серверный socat TCP-порт:
netstat -tlnp | grep 443. - Проверьте, активен ли клиентский socat:
netstat -ulnp | grep 51820. - Посмотрите логи socat (вывод в терминал) — там могут быть сообщения об ошибках прокси.
Альтернативы socat
Если socat не подходит (например, на Windows или из-за ограничений прокси), рассмотрите:
- wstunnel — туннелирует UDP через WebSocket, работает с HTTP/HTTPS-прокси, есть бинарники для всех ОС. На сервере запускается wstunnel server, на клиенте — client, который создаёт локальный UDP-порт.
- udp2raw — более низкоуровневый инструмент, превращает UDP в TCP с XOR-маскировкой. Его можно комбинировать с socat для прохождения через прокси.
- stunnel — TLS-прокси, который может оборачивать UDP, но это скорее для шифрования, а не для обхода прокси.
Однако для большинства сценариев socat — оптимален: он лёгкий, простой и уже установлен во многих системах.
Мини-чеклист
- Проверьте, поддерживает ли прокси метод CONNECT и разрешён ли исходящий трафик на IP сервера и порт TCP-туннеля (например, 443).
- Убедитесь, что на сервере установлен socat и запущена команда TCP-LISTEN с fork и reuseaddr.
- На клиенте создайте локальный UDP-порт через socat с указанием PROXY-адреса и proxyport.
- В конфигурации WireGuard укажите endpoint как 127.0.0.1:локальный_порт и проверьте маршруты (AllowedIPs).
Частые ошибки
- Игнорирование ограничений прокси: некоторые прокси разрешают только порты 80 и 443, поэтому выбирайте TCP-порт 443 на сервере.
- Забыли добавить опцию fork в серверном socat — тогда socat обработает только одно подключение, и все последующие будут отвергнуты.
- На клиенте указали в Endpoint фактический IP сервера вместо 127.0.0.1 — в этом случае WireGuard будет пытаться работать напрямую через UDP, и прокси не будет задействован.
- Не проверили межсетевой экран: на сервере должен быть открыт TCP-порт, на клиенте — UDP-порт для локального socat.
Источники и документация
FAQ
Можно ли WireGuard через HTTPS-прокси?
Да, если прокси поддерживает CONNECT-метод (обычно это все HTTP/HTTPS-прокси). Настройка с socat использует именно CONNECT — клиентский socat устанавливает TCP-соединение с прокси и просит его подключиться к целевому серверу.
Какой порт выбрать для TCP-туннеля?
Лучше всего использовать порт 443, если он не занят на сервере, — так трафик будет похож на обычный HTTPS и реже блокируется. Если прокси разрешает другие порты, можно взять 80 или любой свободный. Проверьте политику вашего прокси.
Подходит ли этот метод для Windows?
socat существует для Windows, но настройка может быть сложнее. Рекомендуется использовать WSL (Linux-подсистема) на Windows 10/11. Также можно рассмотреть wstunnel, который предоставляет Windows-бинарники.
Что делать, если прокси требует аутентификацию?
В команде socat укажите параметры username и password. Например: socat UDP-LISTEN:51820,fork,reuseaddr PROXY:proxy:server:443,proxyport=3128,username=user,password=pass
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ