Отказ от ответственности: репост из stackoverflow: https://stackoverflow.com/questions/67917278/site2site-wireguard-with-docker-routing-problems
Я пытаюсь, чтобы два контейнера, работающие на двух RPI, действовали как межсайтовая VPN между сетью 1 и сетью 2.
С приведенной ниже настройкой я могу пинговать изнутри контейнера сеть друг друга:
- из док-контейнера 1 я могу пропинговать адрес 192.168.1.1
- из контейнера докеров 2 я могу пропинговать адрес 192.168.10.1
Но если я попытаюсь пропинговать 192.168.1.1 с хоста System1 (192.168.10.100), у меня возникнут ошибки (см. изображение ниже, чтобы визуализировать то, что я пытаюсь сделать).
Я понимаю, что мне нужно добавить статический маршрут на хост system1 (192.168.10.100), чтобы направить трафик для 192.168.1.0/24 через контейнер wireguard (172.17.0.5), поэтому я запускаю:
$i p добавить маршрут 192.168.1.0/24 через 172.17.0.5
$ IP-маршрут
по умолчанию через 192.168.10.1 dev eth0 proto dhcp src 192.168.10.100 метрика 100
172.17.0.0/16 dev docker0 ссылка на область ядра proto src 172.17.0.1
172.18.0.0/16 dev br-e19a4f1b7646 ссылка на область действия ядра src 172.18.0.1 linkdown
172.19.0.0/16 dev br-19684dacea29 ссылка на область действия ядра src 172.19.0.1
172.20.0.0/16 dev br-446863cf7cef ссылка на область ядра прото src 172.20.0.1
172.21.0.0/16 dev br-6800ed9b4dd6 ссылка на область ядра прото src 172.21.0.1 linkdown
172.22.0.0/16 dev br-8f8f439a7a28 ссылка на область действия ядра src 172.22.0.1 linkdown
192.168.1.0/24 через 172.17.0.5 dev docker0
192.168.10.0/24 dev eth0 ссылка на область действия ядра proto src 192.168.10.100
192.168.10.1 dev eth0 proto dhcp scope link src 192.168.10.100 метрика 100
но пинг до 192.168.1.1 все равно не проходит.
запустив tcpdump на контейнере 2, я вижу, что некоторые пакеты действительно достигают контейнера:
root@936de7c0d7eb:/# tcpdump -n -i любой
tcpdump: подробный вывод подавлен, используйте -v или -vv для полного декодирования протокола
прослушивание на любом, ссылка типа LINUX_SLL (линукс сваренный), размер захвата 262144 байт
10:11:19.885845 IP [publicIPsystem1].56200 > 172.17.0.6.56100: UDP, длина 128
10:11:30.440764 IP 172.17.0.6.56100 > [publicIPsystem1].56200: UDP, длина 32
10:11:35.480625 ARP, Запросите кто имеет 172.17.0.1 сообщите 172.17.0.6, длина 28
10:11:35.480755 ARP, ответ 172.17.0.1 is-at 02:42:24:e5:ac:38, длина 28
поэтому я думаю, что это не проблема маршрутизации в системе 1.
Может кто подскажет как дальше диагностировать?
РЕДАКТИРОВАТЬ 1:
Я сделал следующий тест:
- запустите «tcpdump -ni any» на контейнере 2
- отправил пинг из системы 1 (из хост-системы) 'ping -c 1 192.168.1.1 .
В контейнере 2 tcpdump записывает следующее:
tcpdump: подробный вывод подавлен, используйте -v или -vv для полного декодирования протокола
прослушивание на любом, ссылка типа LINUX_SLL (линукс сваренный), размер захвата 262144 байт
15:04:47.495066 IP [publicIPsystem1].56200 > 172.17.0.3.56100: UDP, длина 128
15:04:58.120761 IP 172.17.0.3.56100 > [publicIPsystem1].56200: UDP, длина 32
- отправил пинг из контейнера (внутри контейнера) 'ping -c 1 192.168.1.1 .
В контейнере 2 tcpdump записывает следующее:
# tcpdump -ni любой
tcpdump: подробный вывод подавлен, используйте -v или -vv для полного декодирования протокола
прослушивание на любом, ссылка типа LINUX_SLL (линукс сваренный), размер захвата 262144 байт
15:05:48.120717 IP [publicIPsystem1].56200 > 172.17.0.3.56100: UDP, длина 128
15:05:48.120871 IP 10.13.18.2 > 192.168.1.1: эхо-запрос ICMP, идентификатор 747, последовательность 1, длина 64
15:05:48.120963 IP 172.17.0.3 > 192.168.1.1: эхо-запрос ICMP, идентификатор 747, последовательность 1, длина 64
15:05:48.121955 IP 192.168.1.1 > 172.17.0.3: эхо-ответ ICMP, идентификатор 747, последовательность 1, длина 64
15:05:48.122054 IP 192.168.1.1 > 10.13.18.2: эхо-ответ ICMP, идентификатор 747, последовательность 1, длина 64
15:05:48.122246 IP 172.17.0.3.56100 > [publicIPsystem1].56200: UDP, длина 128
15:05:53.160617 ARP, Запросите, у кого есть 172.17.0.1, сообщите 172.17.0.3, длина 28
15:05:53.160636 ARP, Запросите, у кого есть 172.17.0.3, сообщите 172.17.0.1, длина 28
15:05:53.160745 ARP, ответ 172.17.0.3 is-at 02:42:ac:11:00:03, длина 28
15:05:53.160738 ARP, ответ 172.17.0.1 is-at 02:42:24:e5:ac:38, длина 28
15:05:58.672032 IP [publicIPsystem1].56200 > 172.17.0.3.56100: UDP, длина 32
Итак, кажется, что пакеты обрабатываются иначе, чем контейнер 2, в зависимости от чего-то, что мне сейчас не хватает. может проблема в iptables?
|
Сайт 1 |
Сайт 2 |
Диапазон IP-адресов сети 1 |
192.168.10.0/24 |
192.168.1.0/24 |
адрес хост-системы |
192.168.10.100 |
192.168.1.100 |
мост докер0 диапазон |
172.17.0.0/16 |
172.17.0.0/16 |
адрес контейнера |
172.17.0.5 |
172.17.0.6 |
Система 1 — WG0.conf
[Интерфейс]
Адрес = 10.13.18.2
Приватный ключ = *приватный ключ*
ListenPort = 56200
PostUp = iptables -A FORWARD -i %i -j ПРИНЯТЬ; iptables -A FORWARD -o %i -j ПРИНЯТЬ; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ПРИНЯТЬ; iptables -D FORWARD -o %i -j ПРИНЯТЬ; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Вглядеться]
ПубличныйКлюч = *общедоступный*
Конечная точка = *системный2адрес*:56100
Разрешенные IP-адреса = 10.13.18.1/32, 192.168.1.0/24
Система 2 — WG0.conf
[Интерфейс]
Адрес = 10.13.18.1
ListenPort = 56100
Приватный ключ = *приватный ключ*
PostUp = iptables -A FORWARD -i %i -j ПРИНЯТЬ; iptables -A FORWARD -o %i -j ПРИНЯТЬ; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ПРИНЯТЬ; iptables -D FORWARD -o %i -j ПРИНЯТЬ; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Вглядеться]
# peer_casaleuven
ПубличныйКлюч = *общедоступный*
Разрешенные IP-адреса = 10.13.18.2/32, 192.168.10.0/24
Конечная точка = *системный1адрес*:56200