Как связать несколько локальных сетей через WireGuard на ubuntu?

Как объединить несколько локальных сетей через wireguard, чтобы устройства видели друг друга из разных сетей, при помощи wireguard?

Имеется сервер с wireguard, который выступает в качестве wireguard сервера, имеющий внешний ip на сетевой карте enp3s0. ОС ubuntu server.
Так же имеется виртуальное сетевое устройство wg0, имеющее IP 10.8.0.1.
В данный момент, подключенные клиенты могут спокойно через этот сервер выходить наружу.

Клиент-сервер (Client 2)в роли шлюза в локальной сети, имеет 2 физических сетевых адаптера и 1 от Wireguard.
enp4s0 который смотрит в интернет и через который подключается wireguard к серверу.
wg0 имеющий IP 10.8.0.2
enp3s0 имеющий ip и подсеть 192.168.10.1/23, который раздает сеть в локалку, пуская клиенты наружу через wireguard, через отдельно созданную таблицу маршрутизации inet_wg и:
ip rule add from 10.8.0.2 table inet_wg
ip rule add fwmark 4 table inet_wg
iptables -t nat -A POSTROUTING -s 192.168.10.0/23 ! -d 192.168.10.0/23 -o wg+ -j SNAT --to-source 10.8.0.2 .
И отмаркированный трафик, который необходимо через wireguard гнать.
К этому шлюзу через коммутатор подключены сетевые устройства, которые без проблем выходят в сеть через Wireguard сервер.

Аналогичный client 2 Клиент-сервер (Client 3)в роли шлюза в локальной сети, имеет 2 физических сетевых адаптера и 1 от Wireguard.
enp4s0 который смотрит в интернет и через который подключается wireguard к серверу.
wg0 имеющий IP 10.8.0.3
enp3s0 имеющий ip и подсеть 192.168.88.1/24, который раздает сеть в локалку, пуская клиенты наружу через wireguard, через отдельно созданную таблицу маршрутизации inet_wg и:
ip rule add from 10.8.0.3 table inet_wg
ip rule add fwmark 4 table inet_wg
iptables -t nat -A POSTROUTING -s 192.168.88.0/24! -d 192.168.88.0/24-o wg+ -j SNAT --to-source 10.8.0.3 .
И отмаркированный трафик, который необходимо через wireguard гнать.
К этому шлюзу через коммутатор подключены сетевые устройства, которые без проблем выходят в сеть через Wireguard сервер.

На картинке в графическом виде представлено, как это устроено.
66a90e6b22540207312099.jpeg

Как сделать так, чтобы устройства одной сети видели устройства в другой сети?
Проблема, так понимаю, заключается только в прописи маршрута и, как я понимаю, только на wireguard сервере?

Если не прописывать маршрут и сделать трасировку с любого устройства из сети Client 3 в сеть client 2 traceroute 192.168.10.1, то:
Трассировка маршрута к 192.168.10.1 с максимальным числом прыжков 30
1 1 ms 1 ms 1 ms 192.168.88.1
2 35 ms 36 ms 34 ms 10.8.0.1
А дальше уже попытки поиска уже снаружи нужного адреса.

Аналогично с client 2 на client3.

Если добавить маршрут на wireguard сервере из одной сети в другую и обратно:
route add -net 192.168.10.0/23 gw 10.8.0.2
route add -net 192.168.88.0/24 gw 10.8.0.3
то, tracert 192.168.10.1
Трассировка маршрута к 192.168.10.1 с максимальным числом прыжков 30
1 2 ms 1 ms 1 ms 192.168.88.1
2 34 ms 34 ms 35 ms 10.8.0.1
3 10.8.0.1 сообщает: Заданный узел недоступен.

Трассировка завершена.

Так же и с wireguard сервера получаем такое:
root@gwwg:/home/vpn# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
From 10.8.0.1 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Required key not available
ping: sendmsg: Required key not available
From 10.8.0.1 icmp_seq=2 Destination Host Unreachable
^C
--- 192.168.10.1 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1012ms

root@gwwg:/home/vpn# ping 192.168.88.1
PING 192.168.88.1 (192.168.88.1) 56(84) bytes of data.
From 10.8.0.1 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Required key not available
From 10.8.0.1 icmp_seq=2 Destination Host Unreachable
ping: sendmsg: Required key not available
^C
--- 192.168.88.1 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1004ms

Так как же сделать маршрутизацию трафика из одной локальной сети в другую, при посредничестве wireguard сервера, рабочей?
  • Вопрос задан
  • 1384 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dronmaxman
VoIP Administrator
Пример конфигурации объединения двух сете (Lan2Lan) через WireGuard VPN сервер с публикацией порта веб сервера (192.168.10.10:80) на WireGuard сервере через VPN без NAT (без маскарада реального IP клиента) !!!

Схему сети смотрите в вопросе.

# Сервер

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = <VPN_SERVER_PRIVATE_KEY>
Address = 10.8.0.1/24
ListenPort = 51820

[Peer]
PublicKey = <CLIENT2_PUBLIC_KEY>
AllowedIPs = 10.8.0.2/32, 192.168.10.0/24 ## маршруты сами прописываются в таблицу маршрутизации сервера

[Peer]
PublicKey = <CLIENT3_PUBLIC_KEY>
AllowedIPs = 10.8.0.3/32, 192.168.88.0/24 ## маршруты сами прописываются в таблицу маршрутизации сервера




## Forward
sudo sysctl -w net.ipv4.ip_forward=1


## Firewall 
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE 

## Публикуем порт и прокидываем его на сервер в локальной сети за Клиент 2 через VPN
iptables -t nat -A PREROUTING -i enp3s0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.10.10:80


# Клиент 2

[Interface]
Address = 10.8.0.2/32
PrivateKey = <CLIENT2_PRIVATE_KEY>
Table = 100
PostUp = ip rule add from 10.8.0.2 table 100; ip route add 192.168.88.0/24 dev wg0; ip route add 10.8.0.0/24 dev wg0; ip rule add fwmark 1/3 table 100
PostDown = ip rule del from 10.8.0.2 table 100; ip route del 192.168.88.0/24 dev wg0; ip route del 10.8.0.0/24 dev wg0; ip rule del fwmark 1/3 table 100

[Peer]
AllowedIPs = 0.0.0.0/0
PublicKey = <VPN_SERVER_PUBLIC_KEY>
Endpoint = <VPN_SERVER_IP>:51820




## Forward
sudo sysctl -w net.ipv4.ip_forward=1


## Firewall 
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE

## Вот эта строчка маркирует ответ от веб сервера, а потом на него 
## применяется правило (ip rule add fwmark 1/3 table 100) и  пакет попадает в таблицу 100 и 
## при такой конфигурации будет виден реальный IP клиента. 
## При этом сервер 192.168.10.10 в интернет будет выходить через gw (Клиент 2), 
## а ответы  отправлять в VPN.

iptables -t mangle -A PREROUTING -i wg0 -m conntrack --ctstate NEW -j CONNMARK --set-xmark 0x1/0x3
iptables -t mangle -A PREROUTING -i enp3s0 -m connmark ! --mark 0x0/0x3 -j CONNMARK --restore-mark --nfmask 0x3 --ctmask 0x3


# Клиент 3

[Interface]
Address = 10.8.0.3/32
PrivateKey = <CLIENT3_PRIVATE_KEY>
Table = 100
PostUp = ip rule add from 10.8.0.3 table 100; ip route add 192.168.10.0/24 dev wg0; ip route add 10.8.0.0/24 dev wg0; ip rule add fwmark 1/3 table 100
PostDown = ip rule del from 10.8.0.3 table 100; ip route del 192.168.10.0/24 dev wg0; ip route del 10.8.0.0/24 dev wg0; ip rule del fwmark 1/3 table 100

[Peer]
AllowedIPs = 0.0.0.0/0
PublicKey = <VPN_SERVER_PUBLIC_KEY>
Endpoint = <VPN_SERVER_IP>:51820



## Forward
sudo sysctl -w net.ipv4.ip_forward=1


## Firewall 
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE
Ответ написан
ValdikSS
@ValdikSS
Многопользовательские L3-туннели (в т.ч. OpenVPN TUN, WireGuard) не позволяют указывать IP-адрес, через который происходит маршрутизация (ip route … via 10.8.0.4) — эта опция требует L2-связности.
Используйте директиву AllowedIPs в WireGuard, она настроит и внутреннюю машрутизацию, и маршрутизацию ОС, и внутренний фильтр source IP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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