LINUX.ORG.RU
решено ФорумAdmin

Клиенты wireguard, соединения между собой

 ,


0

1

Камрады, столкнулся со странной проблемой, вроде делаю всё по букварю, но никак.

Есть сервер с реальным IP, есть клиенты (железки, стоящие на всяком интернете за nat’ом), к которым надо подключаться из разных мест (я выбрал wireguard), для упрощения соединения - людям, подключающимся через тот же wireguard откуда угодно (например, ноутбук)

На сервере wireguard запущен через systemd-шный юнит wg-quick@wg0.service, файл /etc/wireguard/wg0.conf:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = $PRIV
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source $SERVER_IP
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source $SERVER_IP
[Peer]
PublicKey = $PUB
PresharedKey = $PSK
AllowedIPs = 10.0.0.3/32 #laptop1
[Peer]
PublicKey = $PUB
PresharedKey = $PSK
AllowedIPs = 10.0.0.101/32 #client1
[Peer]
PublicKey = $PUB
PresharedKey = $PSK
AllowedIPs = 10.0.0.102/32 #client2
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         SERVER_IP   0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 wg0
SERVER_IP   0.0.0.0         255.255.255.240 U     0      0        0 eth0

Client1 поднимается так:

ip link add dev wg0 type wireguard
ip addr add 10.0.0.101/24 dev wg0
wg set wg0 private-key /etc/wireguard/client1.priv peer $PUB preshared-key /etc/wireguard/client1.psk endpoint SERVER_IP:51820 allowed-ips 10.0.0.0/24 persistent-keepalive 60
ip link set wg0 up
route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    205    0        0 eth3
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 wg0
192.168.0.0     0.0.0.0         255.255.255.0   U     205    0        0 eth3

Client2/3/4/etc отличаются только ключами и IP.

У laptop1 AllowedIPs прописан 0.0.0.0/0, при подключении он пингуется и с самого сервера и с клиентов.

C clientX можно пинговать только шлюз (или клиентов, у которых AllowedIPs = 0.0.0.0/0), с соседних клиентов его - никак. Если я пытаюсь подключить через wg-quick, меняя AllowedIPs на 0.0.0.0/0, то всё работает, но весь трафик идёт через vpn-сервер, а это не хотелось бы.

Как пустить только одну подсеть через wireguard? ЧЯДНТ?

★★★★★

Последнее исправление: Dimez (всего исправлений: 3)

Я не в курсе, как выглядит systemd сервис, но публичные ключи разные или одинаковые? Переменная одна. Вообще для того, чтобы клиент мог общаться только с самим сервером и такими же клиентами, конфиг должен быть примерно такой:

[Interface]
Address = 10.70.71.2/24
DNS = 1.1.1.1, 1.0.0.1
PrivateKey = peer_prv_key

[Peer]
Endpoint = serv_ip:serv_port
PublicKey = serv_pub_key
AllowedIPs = 10.70.71.0/24
PersistentKeepalive = 10

Тогда default gateway на клиенте не меняется, но добавляется маршрут в 10.70.71.0/24.

Entmatix
()
Последнее исправление: Entmatix (всего исправлений: 2)
Ответ на: комментарий от Dimez

Для того, чтобы клиенты с 0.0.0.0/0 могли получать интернет.

Почему бы просто не повесить маскарадинг на внешний интерфейс сервера? Зачем SNAT, который применяется ко всем пакетами из 10.0.0.0/24?

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source $SERVER_IP

Когда ты пингуешь 10.0.0.102 с 10.0.0.101 через 10.0.0.1, к echo request же тоже применяется это правило, то есть 10.0.0.102 получает echo request от $SERVER_IP, отвечает echo reply ему же через eth0, а не wg0

SERVER_IP 0.0.0.0 255.255.255.240 U 0 0 0 eth0

А вообще чего гадать, запусти на всех трёх хостах tcpdump -ni any icmp, и смотри, куда твои пинги улетают.

yumko ★★
()

Правильный конфиг должен выглядеть примерно так:

Сервер:

[Interface]
ListenPort = 51820
PrivateKey = server private
Address = 10.0.0.1/24

[Peer]
PublicKey = client 1 public
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = client 2 public
AllowedIPs = 10.0.0.3/32

Клиент 1

[Interface]
PrivateKey = client 1 private
Address = 10.0.0.2/32

[Peer]
Endpoint = publicaddress.com:51820
PublicKey = server public
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

Клиент 2

[Interface]
PrivateKey = client 2 private
Address = 10.0.0.3/32

[Peer]
Endpoint = publicaddress.com:51820
PublicKey = server public
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

Обрати внимание на PersistentKeepalive, без него клиенты за натом будут становиться недоступными через некоторое время (это нужно для тех клиентов, к которым будут соединяться).

На сервере должен быть включён net.ipv4.ip_forward=1. Никаких правил iptables настраивать не нужно, всё работает и так (должно быть ACCEPT для FORWARD, что включено по дефолту), сбросить то, что было настроено и всё.

Я советую начать с такого самого простого конфига, сделать так, чтобы оно работало, и потом уже сверху накручивать NAT для интернета (оно точно нужно?), фаервол по-нормальному и тд.

Ну или tcpdump курить.

vbr ★★★
()
Ответ на: комментарий от yumko

Почему бы просто не повесить маскарадинг на внешний интерфейс сервера? Зачем SNAT, который применяется ко всем пакетами из 10.0.0.0/24?

Заменил SNAT на MASQUERADE, всё заработало как и предполагалось, спасибо!

Dimez ★★★★★
() автор топика
Ответ на: комментарий от vbr

У меня так всё и выглядит, про keepalive давно знаю, net.ipv4.ip_forward=1 включен, конечно же, wireguard кручу уже пару лет. Но только в режиме "клиенты выходят в интернет через wg server, поэтому и не сталкивался.

должно быть ACCEPT для FORWARD

INPUT и FORWARD в ACCEPT - плохая идея для сервера в интернете.

Dimez ★★★★★
() автор топика