Вопрос или проблема
Я пытаюсь настроить туннель 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
Основные проблемы и их решение
-
Проблема с перезаписью iptables:
Убедитесь, что правила iptables были применены успешно. Иногда, после перезапуска контейнера, правила могут быть потеряны. Запустите командыiptables -t nat -L -n -v
на сервере, чтобы проверить существование правил. Также стоит проверить, что после выполненияcurl
в журналеiptables
нет записей об игнорировании пакетов. -
Роутинг трафика через интерфейс WireGuard:
Если ваш NAS пытается отправить трафик на внешний адрес, когда он связан с контейнером Docker, убедитесь, что любые маршруты, которые вы добавили внутри контейнера (например, через командыip route
), были применены правильно. Проверьте, существуют ли правильные записи маршрутизации с помощьюip route show
в контейнереqbittorrent
. -
Проверка доступности портов:
Проверьте, открыты ли порты на сервере и клиенте:- Используйте команду
netstat -tuln | grep 5000
для проверки, слушает лиqbittorrent
на соответствующем порту в контейнере. - Убедитесь, что брандмауэр вашего сервера (например,
UFW
илиfirewalld
) не блокирует порты.
- Используйте команду
-
Тестирование соединения:
Проверьте соединение входящих пакетов с помощьюtcpdump
или аналогичных инструментов. Например, выполнитеtcpdump -i wg0 port 5000
на сервере и убедитесь, что пакет, соответствующий вашемуcurl
, регистрируется.
Заключение
Используя вышеперечисленные рекомендации, вы сможете проверить, где именно происходит сбой в настройках вашего WireGuard VPN. Убедитесь, что порты фактически открыты и на обоих концах соединения применяются правильные правила iptables. Эта информация поможет вам лучше настроить маршрутизацию и переадресацию портов в среде Docker, даже находясь за CGNAT.