Магия WireGuard для обхода CGNAT с помощью VPS?

Вопрос или проблема

Я знаю, что люди, вероятно, уже спрашивали об этом раньше, но я пытаюсь реализовать что-то конкретное более месяца и не совсем преуспел. У меня есть куча вещей в домашней сети, которые я использую почти постоянно. Для удаленного доступа я перестал перенаправлять отдельные порты для служб, поскольку понял, что это не лучшая идея с точки зрения безопасности, а также неудобно в управлении. Вместо этого я решил настроить сервер 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

  1. Настройка 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.

  2. Настройка домашнего сервера

    Конфигурация домашнего сервера также должна быть скорректирована:

    • Для клиентов, использующих выход через 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
  1. Тестирование и устранение неполадок

    После внесения изменений в конфигурации, обязательно проведите тестирование:

    • Проверьте, чтобы с клиентских устройств можно было пинговать адреса в сети 192.168.0.0/24.
    • Убедитесь, что при подключении с клиентов, которые используются как ваша домашняя точка выхода, вы можете получить доступ к Интернету через VPS, проверяя ваш публичный IP-адрес.
  2. Настройки 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 помогут вам решить возникшие проблемы. Обязательно сделайте резервные копии конфигураций перед тем, как вносить изменения, чтобы можно было откатиться в случае необходимости.

Если у вас останутся вопросы или потребуются дополнительные уточнения, не стесняйтесь задавать их для более детального анализа вашей конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...