Маршрутизация трафика контейнера Docker через другой контейнер с помощью iptables

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

Этот вопрос очень похож на ранее заданный, но есть серьезное отличие: я хотел бы использовать 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: Тестирование конфигурации

  1. Подключитесь к WireGuard с клиентами.

  2. Проверьте внешний IP-адрес с клиентских устройств:

    curl ifconfig.me

    Ожидайте, что вы увидите внешний IP вашего VPN-сервера.

  3. Используйте tcpdump для проверки маршрутизации. Запустите tcpdump на DCVPN для отслеживания входящих и исходящих пакетов:

    tcpdump -i any host 172.19.0.2

Заключение

Если вы все еще не получаете желаемого результат, проверьте журналы strongSwan и WireGuard на наличие каких-либо ошибок в настройках или проблем с аутентификацией. Иногда проблему можно также решить путем перезапуска контейнеров или проверки конфигурации на наличие опечаток.

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

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