Вопрос или проблема
Допустим, у меня есть 3 пира WireGuard: мой ПК, VPS-сервер, к которому у меня есть полный доступ, и VPN-сервер, к которому у меня нет доступа. Я пытаюсь настроить маршрутизацию всего моего трафика с ПК через VPS, а затем через VPN-сервер. Сам VPS-сервер, конечно, не должен маршрутизировать трафик через VPN.
Я прочитал этот гид – https://www.procustodibus.com/blog/2022/06/multi-hop-wireguard/#internet-gateway-as-a-spoke. Сделал все, как описано, за исключением того, что я не могу настроить пир C, VPN-сервер в моем случае. Это не работает. Когда он включен, у меня нет доступа к интернету и сети wireguard (10.0.0.*).
Вот моя конфигурация на VPS-сервере:
[Interface]
Address = 10.68.200.191/32,10.0.0.1/32
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <KEY>
Table = 123
PreUp = ip rule add iif wg1 table 123 priority 456
PostDown = ip rule del iif wg1 table 123 priority 456
[Peer]
PublicKey = <KEY>
AllowedIPs = 10.0.0.2/32
[Peer]
PublicKey = <KEY>
AllowedIPs = 0.0.0.0/0
Endpoint = <VPN_ADDR>:51820
Итак, есть ли какой-либо способ достичь того, что я хочу, не имея доступа к последнему пиру?
VPN-сервер ожидает, что клиент будет иметь конкретный IP-адрес (10.68.200.191). Его собственная конфигурация WireGuard не примет трафик с других адресов (таких как 10.0.0.2), и даже если бы приняла, сервер не имел бы возвратного маршрута к этим произвольным адресам.
Чтобы это работало, ваш VPS должен выполнять NAT (SNAT
или MASQUERADE
) для всего трафика, идущего к этому пиру, то есть переписывать весь трафик так, чтобы он казался исходящим с собственного адреса VPS (10.68.200.191).
В настоящее время вы добавляете правило MASQUERADE iptables, которое соответствует только пакетам, выходящим через -o eth0
– что вы бы использовали, если бы VPS сам был VPN-сервером для доступа в интернет – но это не то, куда идут пакеты в вашем случае; вместо этого трафик возвращается через тот же wg1
, поэтому именно это правило MASQUERADE должно соответствовать.
Когда как клиент, так и VPN-сервер подключены через один и тот же интерфейс, правило должно быть, вероятно, уточнено, чтобы также соответствовать исходному IP-адресу, то есть -s 10.0.0.2/32
, в дополнение к -o wg1
. Но поскольку пира представляют собой две совершенно разные сети, я бы действительно рекомендовал использовать два отдельных интерфейса и маршрутизацию между ними вместо этого…
Кроме того, когда у интерфейса несколько IP-адресов, MASQUERADE может не всегда автоматически выбирать правильный. Снова, это было бы лучше решено с помощью использования двух отдельных интерфейсов WireGuard для представления ваших подключений к двум сетям – но если вы настаиваете на использовании одного интерфейса, то замена MASQUERADE
на SNAT
позволила бы вам указать желаемый адрес с помощью --to-source
. См. документацию ‘man iptables-extensions’.
(Помимо этого, оба действия делают одно и то же; MASQUERADE просто автоматический SNAT.)
Ответ или решение
Чтобы перенаправить все трафик WireGuard с вашего ПК через VPS и затем через VPN-сервер, необходимо правильно настроить маршрутизацию и правила NAT на VPS. Давайте подробно разберем, как это сделать, основываясь на приведенной конфигурации и описании проблемы.
Шаг 1: Проблемы с маршрутизацией и NAT
Ваш VPS должен маскировать (NAT) весь трафик, который поступает к VPN-серверу, так чтобы он выглядел как исходящий с IP-адреса VPS, а не с IP-адреса вашегo ПК. Ваша текущая конфигурация использует правило MASQUERADE, но оно настроено для интерфейса eth0
, что не подходит в вашем случае, поскольку трафик идет через WireGuard (wg1
).
Шаг 2: Настройка правил iptables
Вместо использования MASQUERADE для -o eth0
нужно настроить правила так, чтобы они применялись к wg1
. Ваша конфигурация должна выглядеть примерно так:
[Interface]
Address = 10.68.200.191/32,10.0.0.1/32
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wg1 -j SNAT --to-source 10.68.200.191
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wg1 -j SNAT --to-source 10.68.200.191
ListenPort = 51820
PrivateKey = <KEY>
Table = 123
PreUp = ip rule add iif wg1 table 123 priority 456
PostDown = ip rule del iif wg1 table 123 priority 456
[Peer]
PublicKey = <KEY>
AllowedIPs = 10.0.0.2/32
[Peer]
PublicKey = <KEY>
AllowedIPs = 0.0.0.0/0
Endpoint = <VPN_ADDR>:51820
Шаг 3: Промежуточные точки маршрутизации
Обратите внимание, что в условиях двух разных сетей важно следить за тем, как ваши маршруты настроены, особенно если вы используете несколько IP-адресов на одном интерфейсе. Правило SNAT указывает, что весь трафик, который выходит через wg1
, будет выглядеть так, как будто он исходит с адреса 10.68.200.191
.
Шаг 4: Проверка других настроек
-
Проверьте правила маршрутизации: Убедитесь, что на вашем VPS правильно настроены маршруты, позволяющие перенаправлять пакеты между интерфейсами.
-
Убедитесь в доступности VPN-сервера: Так как у вас нет доступа к настройкам VPN-сервера, проверьте его DHCP и разрешения на доступ, чтобы гарантировать, что он может получать трафик от IP-адреса
10.68.200.191
. -
Логи и диагностика: Используйте такие команды, как
wg show
иiptables -L -v -n
, чтобы проанализировать состояние трафика и выявить возможные проблемы с правилами.
Заключение
Управление сетевым трафиком через несколько узлов требует точной настройки и понимания маршрутизации с NAT. Следуя указанным шагам, вы сможете корректно настроить ваш VPS для перенаправления трафика через VPN, что должно улучшить доступ вашего ПК к интернету с использованием заданной конфигурации WireGuard. Если возникнут дополнительные вопросы или проблемы, не стесняйтесь искать помощь в специализированных форумах или у профессионалов в области сетевых технологий.