Маршрутизация только частной сети в Wireguard VPN

Маршрутизация только частной сети в Wireguard VPN

У меня есть несколько хостов за маршрутизатором NAT, к которым я хочу получить доступ через VPN Wireguard. Я смог успешно настроить частную сеть, но есть еще кое-что, что меня сбивает с толку.

Я хочу, чтобы каждый коллега:

  • получить доступ друг к другу ( 172.9.9.*) через VPN (через wg0)
  • получить доступ к любому другому хосту за пределами VPN (через eth0).

Вот схема сети и текущая конфигурация:

┌─────┐    ┌──────────┐    ┌─────┐
│  S  ├────┤ Internet ├────┤  A  │
└─────┘    └───┬──────┘    └─────┘
          ┌────┴─────┐
          │ NAT DHCP │
       ┌──┤  Router  ├──┐
       │  └──────────┘  │
       │                │
    ┌──┴──┐          ┌──┴──┐
    │  X  │          │  B  │
    └─────┘          └─────┘
  • Sявляется VPN-сервером и доступен в Интернете через статический IP;
  • Xявляется «вычислительным сервером», он может иметь доступ к Интернету, но находится за NAT, а его IP-адрес является динамическим и заранее неизвестен;
  • Aявляется «удалённым клиентом», который хочет подключиться к X;
  • Bявляется «локальным клиентом», который хочет подключиться Xи находится в той же локальной сети.

Я хочу этого Aи Bмогу подключиться Xчерез S, но все эти хосты должны использовать VPN только при взаимодействии друг с другом, а не при доступе в Интернет.

Так, например, Aможно напрямую пинговать google.com, но пинговать будет Xчерез S.

После поиска и прочтения документации мне так и не стало ясно, можно ли это сделать без использования iptablesконфигурации Wireguard или можно ли это сделать, используя только ее.

Текущая конфигурация следующая:

## S wg0.conf

[Interface]
PrivateKey = S-private-key
Address = 172.9.9.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
# A wg0.conf

[Interface]
Address = 172.9.9.100/24
PrivateKey = A-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0

BКонфигурация похожа на A, но с IP 172.9.9.101и другим закрытым ключом.

# X wg0.conf

[Interface]
Address = 172.9.9.10/24
PrivateKey = X-private-key
DNS = 1.1.1.1

[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25  # To keep the server reachable

Эта конфигурация работает, и все хосты могут получать доступ друг к другу через VPN, но я хочу, чтобы ТОЛЬКО трафик, направленный на хосты, 172.9.9.*проходил через этот VPN. Остальной трафик должен маршрутизироваться шлюзом по умолчанию.

Меня озадачивает то, что если я изменю конфигурацию Aтак, что

AllowedIPs = 172.9.9.0/24

тогда для Aпакеты маршрутизируются так, как и предполагалось (например, я могу curl ifconfig.meи получить Aпубличный IP-адрес ), но если я сделаю то же самое на X, это не сработает, и пакеты, которые не будут доставлены, 172.9.9.0/24не будут доставлены.

ПРАВКА №1

Забыл упомянуть, что мне бы также хотелось, чтобы при подключении к Xлокальные клиенты, например, Bне отправляли пакеты за пределы локальной сети, так B -> Router -> Xи не B -> Router -> S -> Router -> X.

решение1

Установите AllowedIPsнужные вам IP-адреса.маршрут к/через одноранговый узел.

В обычной конфигурации «звезда» на концентраторе (S) вы настраиваете AllowedIPsкаждый одноранговый узел так, как вы это делали, маршрутизируя пакеты каждому одноранговому узлу, только если они используют IP-адрес WireGuard однорангового узла в качестве адреса назначения; а на ваших лучах (A, B и X) вы настраиваете AllowedIPsCIDR вашей сети WireGuard ( 172.9.9.0/24), маршрутизируя пакеты на концентратор, только если они используют IP-адреса WireGuard другого однорангового узла в качестве адреса назначения.

Таким образом, при обычной конфигурации вы получите доступ к A из B или X, используя IP-адрес WireGuard A 172.9.9.100, к B из A или X — с помощью 172.9.9.101, а к X из A или B — с помощью 172.9.9.10.

Но если вы также хотите иметь возможность доступа к каждому серверу через IP-адрес, привязанный к физической сетевой карте сервера (например, eth0), вам необходимо настроить AllowedIPsкак концентратор, так и серверы, чтобы включить эти IP-адреса.

Например, если eth0адрес A — 198.51.100.65, B — 192.168.0.66, а X — 192.168.0.88, вам следует настроить пиры в конфигурации WireGuard концентратора следующим образом:

## S wg0.conf
...

[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32
AllowedIPs = 198.51.100.65/32

[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32
AllowedIPs = 192.168.0.66/32

[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
AllowedIPs = 192.168.0.88/32

И установите AllowedIPsв конфигурации каждого из лучей следующее:

AllowedIPs = 172.9.9.0/24
AllowedIPs = 198.51.100.65/32
AllowedIPs = 192.168.0.66/32
AllowedIPs = 192.168.0.88/32

(Обратите внимание, что вы также можете указать все блоки в одной строке, AllowedIPs = 172.9.9.0/24, 198.51.100.65/32, 192.168.0.66/32, 192.168.0.88/32если вам так удобнее.)


При текущей конфигурации, AllowedIPs = 0.0.0.0/0когда вы работаете curl 198.51.100.65с X, происходит следующее: X направляет пакеты, предназначенные для A (и всего остального), через свой туннель WireGuard в S, а затем S направляет эти пакеты в незашифрованном виде через Интернет в A (замаскированные под собственный публичный IP-адрес S); в ответ A отправляет незашифрованные пакеты через Интернет в S, которые S направляет через свой туннель WireGuard в X.

Если вы хотите убедиться, что Sникогда не делаетмаршрутизировать пакеты, проходящие через вашу сеть WireGuard, в Интернет, вы можете настроить правила iptables, чтобы предотвратить это; что-то вроде следующего, вероятно, поможет:

PostUp = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o eth0 -j DROP; iptables -A FORWARD -i eth0 -o wg0 -j DROP

решение2

У меня возникла проблема с DNS: использование AllowedIPs = 172.9.9.0/24позволяло мне пинговать 8.8.8.8, но не google.com.

Я решил включить интерфейс DNS в разрешенные IP-адреса, поэтому я получаю разрешение DNS через VPN, но трафик не проходит через VPN:

[Interface]
...
DNS = 1.1.1.1

[Peer]
...
AllowedIPs = 172.9.9.0/24, 1.1.1.1/32

Это не отвечает на второй вопрос, который у меня был: возможно ли сделать Xи Bобщаться напрямую, не проходя через S. Другой ответ помогает понять это.

РЕДАКТИРОВАТЬ

Похоже, это работает и при удалении DNSполя, поэтому для обоих интерфейсов следует использовать один и тот же DNS-сервер.

Связанный контент