Перенаправить весь трафик WireGuard на другого пира.

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

Допустим, у меня есть 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: Проверка других настроек

  1. Проверьте правила маршрутизации: Убедитесь, что на вашем VPS правильно настроены маршруты, позволяющие перенаправлять пакеты между интерфейсами.

  2. Убедитесь в доступности VPN-сервера: Так как у вас нет доступа к настройкам VPN-сервера, проверьте его DHCP и разрешения на доступ, чтобы гарантировать, что он может получать трафик от IP-адреса 10.68.200.191.

  3. Логи и диагностика: Используйте такие команды, как wg show и iptables -L -v -n, чтобы проанализировать состояние трафика и выявить возможные проблемы с правилами.

Заключение

Управление сетевым трафиком через несколько узлов требует точной настройки и понимания маршрутизации с NAT. Следуя указанным шагам, вы сможете корректно настроить ваш VPS для перенаправления трафика через VPN, что должно улучшить доступ вашего ПК к интернету с использованием заданной конфигурации WireGuard. Если возникнут дополнительные вопросы или проблемы, не стесняйтесь искать помощь в специализированных форумах или у профессионалов в области сетевых технологий.

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

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