Вопрос или проблема
У меня есть домашняя сеть за CGNAT, и я хотел бы подключиться к ней через wireguard из интернета на своём телефоне, который также находится за CGNAT. Мои интернет-провайдеры не поддерживают IPv6.
Поскольку ни одна из сторон не будет иметь публичный IP-адрес, у меня есть VPS, который имеет публичный IP-адрес.
Я настроил wireguard на сервере и на клиенте.
Я не хочу, чтобы wireguard работал на VPS в качестве промежуточного узла, так как он не полностью находится под моим контролем, а его закрытый ключ может дать доступ к моей домашней сети.
Я думаю, что мне нужно что-то вроде UDP реле, работающего на VPS, которое будет пересылать зашифрованные пакеты wireguard между двумя хостами. Таким образом, соединение между сервером и клиентом остается зашифрованным, и VPS остается ненадежным.
Я думаю, что это должно быть возможно с некоторыми правилами маскировки iptables на VPS. Есть ответ на https://forum.mikrotik.com/viewtopic.php?t=210772 для маршрутизаторов mikrotik, но мне нужно что-то для iptables. Я также не знаю, как wireguard «слушает» эти пакеты. Альтернативой может быть «wireguard в wireguard», но это кажется ненужным.
Кто-нибудь делал что-то подобное?
Спасибо!
Ответ или решение
Чтобы установить соединение между двумя хостами за CGNAT с использованием WireGuard через ненадежный VPS, можно использовать подход с реле передачи UDP. Этот метод позволит установить защищенное соединение между вашей домашней сетью и мобильным устройством, которое также находится за CGNAT, без необходимости запускать WireGuard на VPS.
Шаг 1: Установка WireGuard
Убедитесь, что WireGuard установлен на обоих хостах (вашем домашнем сервере и мобильном устройстве).
Для установки WireGuard на Ubuntu, выполните следующие команды:
sudo apt update
sudo apt install wireguard
Шаг 2: Настройка VPS
- Установка необходимых пакетов: Убедитесь, что на вашем VPS установлены необходимые пакеты, такие как
iptables
иsocat
.
sudo apt install socat iptables
- Настройка
socat
для релеирования UDP: Используйтеsocat
для создания UDP реле, которое будет слушать на определенном порту на VPS и пересылать пакеты на ваши хосты.
Запустите на VPS следующую команду:
socat UDP4-RECVFROM:51820,fork UDP4-SENDTO:<YOUR_HOME_SERVER_PRIVATE_IP>:51820
Эта команда будет слушать UDP-пакеты на порту 51820 и отправлять их на ваш домашний сервер.
Шаг 3: Настройка WireGuard на домашнем сервере
Настройка конфигурации WireGuard на домашнем сервере (например, /etc/wireguard/wg0.conf
):
[Interface]
PrivateKey = <HOME_SERVER_PRIVATE_KEY>
Address = 10.0.0.1/24
ListenPort = 51820
[Peer]
PublicKey = <MOBILE_DEVICE_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32
Endpoint = <YOUR_VPS_PUBLIC_IP>:51820
PersistentKeepalive = 25
Шаг 4: Настройка WireGuard на мобильном устройстве
Конфигурация WireGuard на мобильном устройстве (например, через приложение WireGuard):
[Interface]
PrivateKey = <MOBILE_DEVICE_PRIVATE_KEY>
Address = 10.0.0.2/24
[Peer]
PublicKey = <HOME_SERVER_PUBLIC_KEY>
AllowedIPs = 10.0.0.1/32
Endpoint = <YOUR_VPS_PUBLIC_IP>:51820
PersistentKeepalive = 25
Шаг 5: Настройка iptables на VPS
Используйте iptables
, чтобы разрешить передачу пакетов UDP через ваш VPS:
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT
sudo iptables -A FORWARD -p udp --dport 51820 -j ACCEPT
Кроме того, включите пересылку пакетов:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
Важно!
- Безопасность: Обеспечьте надежный паролем доступ к вашему VPS и следите за его безопасностью, так как он является посредником в этой схеме.
- Постоянное использование
socat
: Вы можете запуститьsocat
в фоновом режиме или использоватьsystemd
, чтобы он автоматически перезапускался при перезагрузке VPS. - Тестирование: Проверьте соединение после настройки. Используйте
ping
и другие инструменты для диагностики.
Заключение
Используя описанный метод, вы сможете установить защищенное соединение между двумя хостами за CGNAT через ненадежный VPS без потери конфиденциальности и безопасности. Это решение идеально подходит для случаев, когда вам необходимо сохранить шифрование соединения и при этом иметь возможность удаленного доступа.