Hbars's personal
Новости
Internet через wireguard на удаленном сервере без статического ip
Про то как поднять WireGuard для VPN на удалённом сервере с динамическим IP.
Конфиг:
A
Ubuntu server 24.04.2 LTS и т.п.
B
Debian GNU/Linux 12 (bookworm) и т. п.
Synology NAS. Проверялось на DS1512+.
На сервере A имеется статический internet-адрес, на B его нет, но в интернет будем ходить через него.
Сразу подразумевается, что на А и В интернет настроен и работает.
Везде, кроме Synology, настройка интерфейсов осуществляется через netplan.
ps: На Synology с DSM 6.2 не настраивается ipv6 из-за кастрированного iptable в ядре.
Создаем ключи для серверов wireguard:
Для сервера A:
wg genkey | tee vpn0_server_private.key | wg pubkey | tee vpn0_server_public.key
Для клиентского сервера A:
wg genkey | tee wg1_server_private.key | wg pubkey | tee wg1_server_public.key
Для клентов:
Для туннеля в internet:
wg genkey | tee vpn0-private.key | wg pubkey | tee vpn0-public.key
Для клиентов на сервере A:
wg genkey | tee cl1-wg1-private.key | wg pubkey | tee cl1-wg1-public.key
wg genkey | tee cl2-wg1-private.key | wg pubkey | tee cl2-wg1-public.key
На сервере А для WireGuard-сервера, который смотрит в интернет:
/etc/netplan/60-vpn.yamlnetwork:
version: 2
tunnels:
vpn0: #server
mode: wireguard
addresses:
- 10.11.10.254/24
- "fde7:1111:ac2a:a374::254/64"
key: <server private key vpn0_server_private.key>
# mark: 56
port: 1000
mtu: 1420 # def
routing-policy:
- from: 10.12.10.0/24
table: 210 # ID таблицы vpn0_route_v4
priority: 20000
- from: fde7:1111:ac2b:a374::/64
table: 220 # ID таблицы vpn0_route_v6
priority: 20000
routes:
- to: 0.0.0.0/0
via: 10.11.10.1
table: 210 # Привязка маршрута к таблице vpn0_route_v4
# - to: ::/0 # Для ipv6 — раскоментировать три строчки.
# via: fde7:1111:ac2a:a374::1
# table: 220 # Привязка маршрута к таблице vpn0_route_v6
peers:
- keys:
public: <client B public key vpn0-public.key>
allowed-ips:
- fde7:1111:ac2a:a374::1/128
# - ::/0 # Для ipv6 — раскоментировать и закоментировать предыдущую.
- 0.0.0.0/0
В /etc/iproute2/rt_tables добавляем две записи:
210 vpn0_route_v4
220 vpn0_route_v6
/etc/netplan/60-wg1.yaml
network:
version: 2
tunnels:
wg1: #server
mode: wireguard
addresses:
- 10.12.10.254/24
- "fde7:1111:ac2b:a374::254/64"
key: <internal server private key wg1_server_private.key>
# mark: 57
port: 1112
peers:
- keys:
public: <internal client 1 public key cl1-wg1-public.key>
allowed-ips:
- 10.12.10.10/32
- fde7:1111:ac2b:a374::10/128
- keys:
public: <internal client 2 public key cl2-wg1-public.key>
allowed-ips:
- 10.12.10.11/32
- fde7:1111:ac2b:a374::11/128
В /etc/iptables/rules.v4 (на A и B для настройки firewall используется netfilter-persistent):
в filter
-A INPUT -i enp2s0 -p udp -m conntrack --ctstate NEW -m udp --dport 1112 -m comment --comment "Allow udp wireguard wg1 connections" -j ACCEPT
-A INPUT -i enp2s0 -p udp -m conntrack --ctstate NEW -m udp --dport 1000 -m comment --comment "Allow udp wireguard vpn0 connections" -j ACCEPT
-A FORWARD -i wg1 -o vpn0 -j ACCEPT
Где enp2s0 интерфейс с интернетом и статическим ip.
в nat
-A POSTROUTING -s 10.12.10.0/24 -o vpn0 -j SNAT --to-source 10.11.10.254
Для ipv6, если нужно, в /etc/iptables/rules.v6 нужно добавить:
в filter
-A FORWARD -s fde7:1111::/32 -m conntrack --ctstate NEW -j ACCEPT
в nat
-A POSTROUTING -s fde7:1111:ac2b:a374::/64 -o vpn0 -j SNAT --to-source fde7:1111:ac2a:a374::254
На сервере B для WireGuard-сервера, который смотрит в интернет в сторону А:
/etc/netplan/20-wg.yaml
network:
version: 2
renderer: networkd
tunnels:
wg0: #client
mode: wireguard
addresses:
- "10.11.10.1/24"
- "fde7:1111:ac2a:a374::1/64"
optional: true
mtu: 1420
key: "<client private key vpn0-private.key>"
peers:
- endpoint: "<server A internet static IP>:1000"
keys:
public: "<server A public key vpn0_server_public.key>"
allowed-ips:
- "10.11.10.254/32"
- "fde7:1111:ac2a:a374::254/128"
keepalive: 21
В /etc/iptables/rules.v4 (на A и B для настройки firewall используется netfilter-persistent):
в filter
-A FORWARD -i wg0 -j ACCEPT
в nat
-A POSTROUTING -o eno1 -j MASQUERADE
где eno1 - интерфейс который смотрит в internet
Для ipv6, если нужно, в /etc/iptables/rules.v6 нужно добавить:
в filter
-A FORWARD -i wg0 -j ACCEPT
в nat
-A POSTROUTING -o eno1 -j MASQUERADE
где eno1 - интерфейс который смотрит в internet
На Synology:
/etc/wireguard/wg0.conf
[Interface]
Address = 10.11.10.1/24, fde7:1111:ac2a:a374::1/64
Privatekey = <client private key vpn0-private.key>
MTU = 1420
PostUp = iptables -t nat -A POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADE
Table = main
[Peer]
Publickey = <server A public key vpn0_server_public.key>
Endpoint = <server A internet static IP>:1000
AllowedIPs = 10.11.10.254/32, fde7:1111:ac2a:a374::254/128
PersistentKeepalive = 25
Пример конфига wireguard на клиентах:
[Interface]
Address = 10.12.10.10/32, fde7:1111:ac2b:a374::10/128
Privatekey = <internal client 1 private key cl1-wg1-private.key>
DNS = <ip адреса ваших DNS серверов>
MTU = 1384
[Peer]
Publickey = <internal server public wg1_server_public.key>
Endpoint = <server A internet static IP>:1112
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Если не нужно IPv6, или не работает, или работает криво, то всё, что касается IPv6-адресации, можно удалить.
После правильной настройки с сервера А должно быть так:
ping 10.11.10.1
PING 10.11.10.1 (10.11.10.1) 56(84) bytes of data.
64 bytes from 10.11.10.1: icmp_seq=1 ttl=64 time=52.8 ms
64 bytes from 10.11.10.1: icmp_seq=2 ttl=64 time=48.5 ms
И наоборот для сервера В.
Так же на сервере А должно работать:
ping -I vpn0 ya.ru
PING ya.ru (5.255.255.242) from 10.11.10.254 vpn0: 56(84) bytes of data.
64 bytes from ya.ru (5.255.255.242): icmp_seq=1 ttl=53 time=98.7 ms
64 bytes from ya.ru (5.255.255.242): icmp_seq=2 ttl=53 time=97.2 ms
Подключаемся к А клиентом и проверяем:
ping ya.ru
PING ya.ru (77.88.44.242) 56(84) bytes of data.
64 bytes from ya.ru (77.88.44.242): icmp_seq=1 ttl=52 time=100 ms
64 bytes from ya.ru (77.88.44.242): icmp_seq=2 ttl=52 time=96.6 ms
Как-то так.