Как пересылать / маршрутизировать пакеты через оверлейную сеть Wireguard?

Мой вопрос связан с основами сетевой маршрутизации и iptables и, вероятно, из-за моего непонимания того, как мне это настроить.

Я установил оверлейная сеть между хостами с использованием защиты от проводов, где один находится за маршрутизатором / NAT. Пока что оверлейная сеть работает хорошо, и каждый хост может разговаривать с другими.

Теперь я хотел бы сделать хост A шлюзом в частную сеть, но я ужасно не могу этого сделать.

Могу Вы можете помочь мне разгадать тайну пересылки iptables?

3 Сети

Оверлейная сеть VPN - 169.254.0.0/24 , а частная сеть за маршрутизатором - 192.168.0.0/24 .

  • Интернет
0
задан 10 October 2020 в 23:45
1 ответ

Вот рабочая конфигурация. Уф, я на самом деле получил это сам, но мне потребовалось некоторое время, чтобы все исправить.

Клиент

Мне нужно было убедиться, что пиру (VPN-серверу) разрешено использовать диапазон 192.168.178.0/24.

[Interface]
Address = 169.254.0.2/32
PrivateKey = ...
ListenPort = 51280

[Peer]
PublicKey = ...
AllowedIPs = 169.254.0.1/32, 192.168.178.0/24
Endpoint = ...:51280

VPN-сервер

Мне просто нужно было пересылать пакеты с интерфейса tun0 и MASQUERADE их. Кроме того, я также добавил сеть 192.168.178.0/24 в AllowedIPs хоста А.

$ iptables -A FORWARD -i tun0 -j ACCEPT
$ iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Конфигурация Wireguard:

[Interface]
Address = 169.254.0.1/32
PrivateKey = ...
ListenPort = 51280

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.2/32

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.3/32, 192.168.178.0/24

Хост А

Там мне нужно было принять пересылка пакетов на обоих интерфейсах. И я бы замаскировал пакеты на eth0.

$ iptables -A FORWARD -i tun0 -j ACCEPT
$ iptables -A FORWARD -i eth0 -j ACCEPT
$ iptables -A POSTROUTING -o eth0 -j MASQUERADE

Что касается Wireguard, то в конфигурации нет ничего особенного. Он просто подключается к серверу VPN.

[Interface]
Address = 169.254.0.3/32
PrivateKey = ...
ListenPort = 51280

[Peer]
Endpoint = ...:51280
PublicKey = ...
AllowedIps = 169.254.0.1/32
PersistentKeepalive = 25

Однако была одна серьезная ловушка при работе с хостом A (который находится за маршрутизатором/NAT). VPN-сервер должен знать конечную точку (общедоступный IP-адрес + порт) узла A, чтобы отправлять ему пакеты. Через некоторое время маршрутизатор потеряет состояние, и, таким образом, VPN-сервер больше не сможет подключиться к хосту A.

Я исправил это, добавив параметр PersistentKeepalive в раздел [Peer] VPN-сервера на хосте А. (Спасибо @A.B из комментариев, чтобы указать на это.)

Интересно, как решить эту проблему, если оба находятся за маршрутизатором/NAT. Черт, это сложно.

1
ответ дан 10 October 2020 в 22:13

Теги

Похожие вопросы