Вопрос или проблема
Я знаю, что люди, вероятно, уже спрашивали об этом раньше, но я пытаюсь реализовать что-то конкретное более месяца и не совсем преуспел. У меня есть куча вещей в домашней сети, которые я использую почти постоянно. Для удаленного доступа я перестал перенаправлять отдельные порты для служб, поскольку понял, что это не лучшая идея с точки зрения безопасности, а также неудобно в управлении. Вместо этого я решил настроить сервер OpenVPN на старом ПК с Ubuntu и просто перенаправил этот отдельный порт на своем роутере.
Потом я оказался за CGNAT, и люди, с которыми я разговаривал в своем интернет-провайдере, похоже, даже не знают, что это… Но в любом случае, я ничего не могу с этим поделать, поэтому я поискал кое-какие решения. Я узнал о Tailscale, который довольно легко настроить, но мне действительно не понравилось, что необходимо устанавливать клиентское приложение и входить в систему для каждого устройства, и, по какой-то причине, полоса пропускания, похоже, ограничена. Затем я узнал, что WireGuard – это реальная вещь, и предположительно он быстрее и проще в настройке, чем OpenVPN, поэтому я решил попробовать.
Я наконец решил потратиться и получить VPS от IONOS с единственной целью – получить публичный IPv4-адрес на свое имя. Я установил WireGuard как на своем домашнем сервере, так и на VPS и настроил туннель, что удивительно, сработало. VPS находится довольно далеко, так что это добавляет некоторую задержку, но я думаю, с этим ничего не поделаешь.
Затем я хотел создать конфигурации клиентов для своего ноутбука, телефона и других устройств, которые будут подключаться к VPS, а затем использовать существующий туннель для доступа к моей домашней сети и доступа к локальным службам. Проблема в том, что в первый раз, когда я это сделал, весь трафик проходил через VPS, effectively используя его в качестве VPN, и это замедляло все без необходимости. Я хотел сохранить эту функциональность, так как она иногда может быть полезной, но также добавить два других типа клиентов, которые а) будут действовать только как оверлейная сеть для доступа к моей домашней сети, но будут оставлять другой трафик в покое или б) использовать мой домашний сервер в качестве выходного узла, в стиле Tailscale.
Пока что мне не удалось заставить это работать. Скорее всего, это какая-то глупая очевидная вещь (всегда так кажется с такими вещами), но я не могу понять, в чем дело. Я даже пытался спрашивать ChatGPT, и “решения”, которые он предложил, не только не исправили проблему, но и поломали кучу других вещей, которые мне понадобилось время, чтобы восстановить. Я действительно не справляюсь со всеми этими сетевыми способами (iptables, файлы конфигурации, правила брандмауэра? Это никогда не заканчивается…) и был бы очень признателен за любую помощь. Я думаю, основная идея имеет смысл, но я также открыт для любых других подходов. И я уверен, что это может быть полезно другим людям, застрявшим в ситуации с CGNAT у интернет-провайдеров.
Вот копия файлов конфигурации, возможно, там есть что-то, чего я не замечаю? И я уже включил пересылку IPv4 в /etc/sysctl.conf.
## VPS ##
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <key>
MTU = 1420
# Включить IP-перенаправление и NAT
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens6 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens6 -j MASQUERADE
# Партнер домашнего сервера
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.2/32, 192.168.0.0/24
PersistentKeepalive = 25
# Клиент 1 (оверлей) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.3/32
# Клиент 2 (оверлей) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.4/32
# Клиент 3 (оверлей) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.5/32
# Клиент 4 (оверлей) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.6/32
# Клиент 5 (оверлей) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.7/32
# Клиент 6 (vps_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.8/32
# Клиент 7 (vps_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.9/32
# Клиент 8 (vps_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.10/32
# Клиент 9 (vps_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.11/32
# Клиент 10 (vps_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.12/32
# Клиент 11 (home_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.13/32
# Клиент 12 (home_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.14/32
# Клиент 13 (home_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.15/32
# Клиент 14 (home_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.16/32
# Клиент 15 (home_exit) Партнер
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.17/32
## ДОМ ##
[Interface]
Address = 10.0.0.2/24
PrivateKey = <key>
# Включить пересылку для локальной сети (192.168.0.0/24)
PostUp = iptables -A FORWARD -i wg0 -o eno1 -j ACCEPT; iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o eno1 -j ACCEPT; iptables -t nat -D POSTROUTING -o eno1 -j MASQUERADE
# Партнер VPS
[Peer]
PublicKey = <key>
Endpoint = mydomain.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
# Партнер Клиента 11
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.13/32
# Партнер Клиента 12
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.14/32
# Партнер Клиента 13
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.15/32
# Партнер Клиента 14
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.16/32
# Партнер Клиента 15
[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.17/32
## КЛИЕНТ 11 ВЫХОД ИЗ ДОМА ##
[Interface]
Address = 10.0.0.13/24
PrivateKey = <key>
[Peer]
PublicKey = <key>
Endpoint = mydomain.com:51820
AllowedIPs = 0.0.0.0/0, 10.0.0.2/32
## КЛИЕНТ 6 ВЫХОД ИЗ VPS ##
[Interface]
Address = 10.0.0.8/24
PrivateKey = <key>
[Peer]
PublicKey = <key>
Endpoint = mydomain.com:51820
AllowedIPs = 0.0.0.0/0
## КЛИЕНТ 1 ОВЕРЛЕЙ ##
[Interface]
Address = 10.0.0.3/24
PrivateKey = <key>
[Peer]
PublicKey = <key>
Endpoint = mydomain.com:51820
AllowedIPs = 192.168.0.0/24
Ответ или решение
Чтобы обойти CGNAT с помощью WireGuard и VPS, необходимо правильно сконфигурировать туннель таким образом, чтобы обеспечить доступ к вашему домашнему сетевому окружению, а также изменить поведение подключения для различных клиентов. Рассмотрим шаги и конфигурации, которые могут помочь решить вашу задачу.
А. Описание проблемы
Как вы отметили, использование CGNAT вашим ISP вызывает проблемы с доступом извне. WireGuard действительно предоставляет возможность организовать безопасный туннель и упростить конфигурацию по сравнению с традиционными VPN, такими как OpenVPN. Однако важно правильно настраивать AllowedIPs
и маршрутизацию, чтобы избежать ненужного использования VPS в качестве выходного узла.
B. Конфигурация WireGuard
-
Настройка VPS
Конфигурация на VPS выглядит правильно, но давайте уточним, как именно настраивать
AllowedIPs
для различных клиентов в зависимости от их назначения:-
Для клиентов, работающих в режиме overlay, нужно указать только локальную подсеть вашего домашнего окружения (например,
192.168.0.0/24
). Это позволит этим клиентам получить доступ к домашним ресурсам, не используя VPS как выходной узел. В данном случае вы уже указали адреса для клиентов 1, 2 и т.д. Однако вам следует внести изменения в конфигурации этих клиентов. -
Для клиентов, использующих VPS в качестве выходного узла (например, клиент 6 и клиенты, отмеченные как
home_exit
), укажитеAllowedIPs = 0.0.0.0/0
, чтобы весь трафик перенаправлялся через VPS. Убедитесь, что вы правильно указали настройки NAT для вашего VPS черезiptables
.
-
-
Настройка домашнего сервера
Конфигурация домашнего сервера также должна быть скорректирована:
-
Для клиентов, использующих выход через VPS, вам следует установить
AllowedIPs = 10.0.0.8/32
(для клиента VPC Exit) для каждого клиента, который должен использовать этот выход. -
Для overlay-клиентов, таких как клиент 1, убедитесь, что у вас правильные IP-адреса и что они направляются на вашу локальную сеть.
-
## CLIENT 1 OVERLAY ##
[Interface]
Address = 10.0.0.3/32
PrivateKey = <key>
[Peer]
PublicKey = <VPS-Public-Key>
Endpoint = mydomain.com:51820
AllowedIPs = 192.168.0.0/24
-
Тестирование и устранение неполадок
После внесения изменений в конфигурации, обязательно проведите тестирование:
- Проверьте, чтобы с клиентских устройств можно было пинговать адреса в сети 192.168.0.0/24.
- Убедитесь, что при подключении с клиентов, которые используются как ваша домашняя точка выхода, вы можете получить доступ к Интернету через VPS, проверяя ваш публичный IP-адрес.
-
Настройки iptables
Убедитесь, что у вас включен IP-маршрутизация на VPS:
echo 1 > /proc/sys/net/ipv4/ip_forward
Также проверьте, правильно ли настроены правила iptables для NAT:
iptables -A FORWARD -i wg0 -j ACCEPT iptables -t nat -A POSTROUTING -o ens6 -j MASQUERADE
Заключение
Судя по вашей конфигурации и описанию проблемы, основное внимание следует уделить корректировке параметров AllowedIPs
для каждого клиента, в том числе для overlay-сетей и выходных узлов. Постепенное тестирование каждого изменения и проверка логов WireGuard и iptables помогут вам решить возникшие проблемы. Обязательно сделайте резервные копии конфигураций перед тем, как вносить изменения, чтобы можно было откатиться в случае необходимости.
Если у вас останутся вопросы или потребуются дополнительные уточнения, не стесняйтесь задавать их для более детального анализа вашей конфигурации.