Мой вопрос связан с основами сетевой маршрутизации и iptables и, вероятно, из-за моего непонимания того, как мне это настроить.
Я установил оверлейная сеть между хостами с использованием защиты от проводов, где один находится за маршрутизатором / NAT. Пока что оверлейная сеть работает хорошо, и каждый хост может разговаривать с другими.
Теперь я хотел бы сделать хост A шлюзом в частную сеть, но я ужасно не могу этого сделать.
Могу Вы можете помочь мне разгадать тайну пересылки iptables?
Оверлейная сеть VPN - 169.254.0.0/24
, а частная сеть за маршрутизатором - 192.168.0.0/24
.
Вот рабочая конфигурация. Уф, я на самом деле получил это сам, но мне потребовалось некоторое время, чтобы все исправить.
Мне нужно было убедиться, что пиру (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
Мне просто нужно было пересылать пакеты с интерфейса 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. Черт, это сложно.