Переадресация портов на site-to-site VPN с использованием WireGuard в Docker

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

Я пытаюсь настроить туннель wireguard для моего NAS за CGNAT. Я обращаюсь к этому полезному руководству: https://www.linuxserver.io/blog/routing-docker-host-and-container-traffic-through-wireguard

Но я настраиваю VPN между сайтами, используя VPS в качестве сервера wireguard. На клиентской стороне я настраивал согласно вышеуказанному руководству.

client wg0.conf:

[Interface]
Address = 10.13.13.2
PrivateKey = 
ListenPort = 51820
DNS = 10.13.13.1

PostUp = iptables -t nat -A POSTROUTING -o wg+ -j MASQUERADE; iptables -t nat -A PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 172.20.0.2:5000
PreDown = iptables -t nat -D POSTROUTING -o wg+ -j MASQUERADE; iptables -t nat -D PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 172.20.0.2:5000

[Peer]
PublicKey = 
PresharedKey = 
Endpoint = <server-ip>:51820
AllowedIPs = 0.0.0.0/0

затем запустите:

docker exec --privileged qbittorrent ip route del default
docker exec --privileged qbittorrent ip route add default via 172.20.0.50

docker exec --privileged qbittorrent ip route add 192.168.0.0/24 via 172.20.0.1

На сервере я также запускаю wireguard в docker:

services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE #опционально
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - SERVERURL=<server-ip> #опционально
      - SERVERPORT=51820 #опционально
      - PEERS=1 #опционально
      - PEERDNS=auto #опционально
      - INTERNAL_SUBNET=10.13.13.0 #опционально
      - ALLOWEDIPS=0.0.0.0/0 #опционально
      - PERSISTENTKEEPALIVE_PEERS= #опционально
      - LOG_CONFS=true #опционально
    volumes:
      - /home/ajit/.config/appdata/wg:/config
      - /lib/modules:/lib/modules #опционально
    ports:
      - 51820:51820/udp
      - 5000:5000
      - 5000:5000/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = 
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE


PreUp = iptables -t nat -A PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 10.13.13.2:5000
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 10.13.13.2:5000
PreUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE

[Peer]
# peer1
PublicKey = 
PresharedKey = 
AllowedIPs = 10.13.13.2/32

Я получил второй блок маршрутов iptable из сообщения на reddit, вот здесь я настроен скептически.

Что работает:

  • трафик qbittorrent маршрутизируется через wireguard на удаленный VPS
  • можно получить доступ к веб-интерфейсу qbittorrent локально
  • онлайн-проверки портов сообщают, что мой порт открыт, но реального соединения нет!

если я запущу в контейнере qbittorrent: nc -l 5000

и на моем ПК: curl --connect-timeout 5 <server-ip>:5000

curl: (28) Не удалось подключиться к <ip> порт 5000 после 5003 мс: время ожидания истекло

Таким образом, реального соединения нет!

Буду признателен за любые отзывы.

Ответ или решение

Настройка переадресации портов на VPN соединении site-to-site с использованием WireGuard в Docker

Ваша просьба о помощи в настройке WireGuard для достижения соединения с NAS, находящимся за МТУ (CGNAT), подчеркивает актуальность настройки VPN и переадресации портов. Вы уже сделали значительный прогресс, следуя указанному руководству, однако, как видно из вашего сообщения, возникают проблемы с доступом через пятый порт.

Обзор текущей конфигурации

Вы уже настроили WireGuard на сервере VPS и клиенте. Конфигурация на клиенте и сервере помещена в отдельные секции, и функциональность обеспечивается правилами iptables. Рассмотрим ваши конфигурации более подробно и выделим несколько ключевых моментов.

Конфигурация клиента

[Interface]
Address = 10.13.13.2
PrivateKey = 
ListenPort = 51820
DNS = 10.13.13.1

PostUp = iptables -t nat -A POSTROUTING -o wg+ -j MASQUERADE; iptables -t nat -A PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 172.20.0.2:5000
PreDown = iptables -t nat -D POSTROUTING -o wg+ -j MASQUERADE; iptables -t nat -D PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 172.20.0.2:5000

[Peer]
PublicKey = 
PresharedKey = 
Endpoint = <server-ip>:51820
AllowedIPs = 0.0.0.0/0

Конфигурация сервера

[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = 
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE

PreUp = iptables -t nat -A PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 10.13.13.2:5000
PostDown = iptables -t nat -D PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 10.13.13.2:5000
PreUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE

[Peer]
PublicKey = 
PresharedKey = 
AllowedIPs = 10.13.13.2/32

Основные проблемы и их решение

  1. Проблема с перезаписью iptables:
    Убедитесь, что правила iptables были применены успешно. Иногда, после перезапуска контейнера, правила могут быть потеряны. Запустите команды iptables -t nat -L -n -v на сервере, чтобы проверить существование правил. Также стоит проверить, что после выполнения curl в журнале iptables нет записей об игнорировании пакетов.

  2. Роутинг трафика через интерфейс WireGuard:
    Если ваш NAS пытается отправить трафик на внешний адрес, когда он связан с контейнером Docker, убедитесь, что любые маршруты, которые вы добавили внутри контейнера (например, через команды ip route), были применены правильно. Проверьте, существуют ли правильные записи маршрутизации с помощью ip route show в контейнере qbittorrent.

  3. Проверка доступности портов:
    Проверьте, открыты ли порты на сервере и клиенте:

    • Используйте команду netstat -tuln | grep 5000 для проверки, слушает ли qbittorrent на соответствующем порту в контейнере.
    • Убедитесь, что брандмауэр вашего сервера (например, UFW или firewalld) не блокирует порты.
  4. Тестирование соединения:
    Проверьте соединение входящих пакетов с помощью tcpdump или аналогичных инструментов. Например, выполните tcpdump -i wg0 port 5000 на сервере и убедитесь, что пакет, соответствующий вашему curl, регистрируется.

Заключение

Используя вышеперечисленные рекомендации, вы сможете проверить, где именно происходит сбой в настройках вашего WireGuard VPN. Убедитесь, что порты фактически открыты и на обоих концах соединения применяются правильные правила iptables. Эта информация поможет вам лучше настроить маршрутизацию и переадресацию портов в среде Docker, даже находясь за CGNAT.

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

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