- Вопрос или проблема
- Ответ или решение
- Шаг 1: Проверка сетевых интерфейсов контейнеров
- Шаг 2: Настройка правил iptables
- Шаг 3: Настройка NAT для маршрутизации трафика
- Шаг 4: Правила для перенаправления трафика
- Шаг 5: Проверьте настройки в DCVPN
- Шаг 6: Проверьте настройки DNS
- Шаг 7: Тестирование конфигурации
- Заключение
Вопрос или проблема
Этот вопрос очень похож на ранее заданный, но есть серьезное отличие: я хотел бы использовать iptables
для решения проблемы.
На стороне VPN-сервера настроен и успешно работает Strongswan в режиме сервера (VPS). У меня есть два контейнера Docker, настроенных на моем домашнем сервере: контейнер DCVPN
как клиент для подключения к серверу VPN Strongswan, и это соединение работает успешно, а также контейнер DCWG
, на котором настроен Wireguard. На пользовательских устройствах (WG Client 1
и WG Client 2
) я могу успешно подключиться к серверу VPN DCWG
.
Я столкнулся с проблемой при попытке настроить пересылку трафика подключенного клиента Wireguard из контейнера DCWG
в контейнер DCVPN
. Я не очень разбираюсь в сетях, но попытался настроить пересылку всего клиентского трафика через iptables на DCWG
:
iptables -t nat -A PREROUTING -d 10.13.13.1/24 -j DNAT --to-destination 172.19.0.2
iptables -t nat -A POSTROUTING -d 172.19.0.2 -j MASQUERADE
Тем не менее, это не сработало, потому что, когда я пытаюсь определить свой внешний IP-адрес, я получаю IP-адрес моего домашнего сервера.
Команда Docker для запуска DCVPN:
docker run -d --name DCVPN \
--restart unless-stopped \
--cap-add=NET_ADMIN \
--net=vpn \
-e TIMEZONE=$TIMEZONE \
-v /var/docker/vpn/data/strongswan.conf:/etc/strongswan.conf \
-v /var/docker/vpn/data/ipsec.conf:/etc/ipsec.conf \
-v /var/docker/vpn/data/ipsec.secrets:/etc/ipsec.secrets \
-v /var/docker/vpn/data/ipsec.d:/etc/ipsec.d \
vpn
Команда Docker для запуска DCWG:
docker run -d --name DCWG \
--restart unless-stopped \
--cap-add=NET_ADMIN \
--net=vpn \
-e TIMEZONE=$TIMEZONE \
-e PUID=$PUID \
-e PGID=$PGID \
-e PEERS=$PEERS \
-e SERVERPORT=$PORT \
-e PEERDNS=8.8.8.8,1.1.1.1 \
-p 51820:51820/udp \
-v /var/docker/wireguard/config:/config \
linuxserver/wireguard:latest
NAT-правила на DCWG
:
iptables -L -n -t nat --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DNAT 0 -- 0.0.0.0/0 10.13.13.0/24 to:172.19.0.2
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DOCKER_OUTPUT 0 -- 0.0.0.0/0 127.0.0.11
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 DOCKER_POSTROUTING 0 -- 0.0.0.0/0 127.0.0.11
2 MASQUERADE 0 -- 0.0.0.0/0 0.0.0.0/0
3 MASQUERADE 0 -- 0.0.0.0/0 172.19.0.2
Chain DOCKER_OUTPUT (1 references)
num target prot opt source destination
1 DNAT 6 -- 0.0.0.0/0 127.0.0.11 tcp dpt:53 to:127.0.0.11:36145
2 DNAT 17 -- 0.0.0.0/0 127.0.0.11 udp dpt:53 to:127.0.0.11:57760
Chain DOCKER_POSTROUTING (1 references)
num target prot opt source destination
1 SNAT 6 -- 127.0.0.11 0.0.0.0/0 tcp spt:36145 to::53
2 SNAT 17 -- 127.0.0.11 0.0.0.0/0 udp spt:57760 to::53
И, насколько я могу судить, трафик от WG Client 1
не пересылается в DCVPN
. Я отправил ping на google.com с WG Client 1
и получил ответ от хоста DCWG:
tcpdump -i wg0 host 10.13.13.2
12:11:23.841895 IP 10.13.13.2 > dns.google: ICMP echo request, id 30840, seq 30840, length 64
12:11:23.896444 IP dns.google > 10.13.13.2: ICMP echo reply, id 30840, seq 30840, length 64
12:11:24.840582 IP 10.13.13.2 > dns.google: ICMP echo request, id 30840, seq 30840, length 64
12:11:24.895165 IP dns.google > 10.13.13.2: ICMP echo reply, id 30840, seq 30840, length 64
12:11:25.842555 IP 10.13.13.2 > dns.google: ICMP echo request, id 30840, seq 30840, length 64
12:11:25.897695 IP dns.google > 10.13.13.2: ICMP echo reply, id 30840, seq 30840, length 64
Иными словами, проблема заключается в том, что мне нужно настроить Wireguard через IKEv2 – настроить Connection 3
. Я был бы благодарен за советы о том, что можно сделать для достижения цели.
Ответ или решение
Чтобы настроить маршрутизацию трафика контейнера WireGuard (DCWG) через контейнер OpenVPN (DCVPN) с использованием iptables, нужно выполнить несколько шагов. Давайте разберемся, что нужно сделать.
Шаг 1: Проверка сетевых интерфейсов контейнеров
Убедитесь, что оба контейнера находятся в одной сети Docker (--net=vpn
), и проверьте их IP-адреса. Вы можете проверить IP-адреса контейнеров с помощью следующей команды:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' DCVPN
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' DCWG
Для примера, допустим, что у вас следующие IP:
- DCVPN: 172.19.0.2
- DCWG: 172.19.0.3
Шаг 2: Настройка правил iptables
На контейнере DCWG нужно настроить правила iptables для правильной маршрутизации трафика. Убедитесь, что у вас включена пересылка пакетов в контейнерах. Для этого выполните:
echo 1 > /proc/sys/net/ipv4/ip_forward
Шаг 3: Настройка NAT для маршрутизации трафика
Выполните следующие команды для настройки iptables на контейнере DCWG:
# Программируем правила NAT для перенаправления трафика из DCWG в DCVPN
iptables -t nat -A POSTROUTING -s 10.13.13.0/24 -d 0.0.0.0/0 -j SNAT --to-source 172.19.0.2
Шаг 4: Правила для перенаправления трафика
Добавьте правила для перенаправления трафика от клиентов WireGuard:
iptables -t nat -A PREROUTING -d 10.13.13.0/24 -j DNAT --to-destination 172.19.0.2
Эти команды настройки NAT необходимы, чтобы трафик от клиентов WireGuard перенаправлялся через контейнер DCVPN.
Шаг 5: Проверьте настройки в DCVPN
Убедитесь, что конфигурация OpenVPN (strongSwan) позволяет принимать подключения и отправлять трафик. Убедитесь, что в конфигурации разрешены соответствующие IP-адреса.
Шаг 6: Проверьте настройки DNS
Если ваши клиенты WireGuard не могут разрешить имена, добавьте в конфигурацию WireGuard DNS-серверы. Вы можете использовать те же DNS-серверы, что и в контейнере DCWG:
-e PEERDNS=8.8.8.8,1.1.1.1
Шаг 7: Тестирование конфигурации
-
Подключитесь к WireGuard с клиентами.
-
Проверьте внешний IP-адрес с клиентских устройств:
curl ifconfig.me
Ожидайте, что вы увидите внешний IP вашего VPN-сервера.
-
Используйте tcpdump для проверки маршрутизации. Запустите tcpdump на DCVPN для отслеживания входящих и исходящих пакетов:
tcpdump -i any host 172.19.0.2
Заключение
Если вы все еще не получаете желаемого результат, проверьте журналы strongSwan
и WireGuard
на наличие каких-либо ошибок в настройках или проблем с аутентификацией. Иногда проблему можно также решить путем перезапуска контейнеров или проверки конфигурации на наличие опечаток.