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_v4220 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/64Privatekey = <client private key vpn0-private.key>MTU = 1420PostUp = iptables -t nat -A POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADEPostDown = iptables -t nat -D POSTROUTING -o `ip route | awk '/default/ {print $5; exit}'` -j MASQUERADETable = main
[Peer]Publickey = <server A public key vpn0_server_public.key>Endpoint = <server A internet static IP>:1000AllowedIPs = 10.11.10.254/32, fde7:1111:ac2a:a374::254/128PersistentKeepalive = 25
Пример конфига wireguard на клиентах:
[Interface]Address = 10.12.10.10/32, fde7:1111:ac2b:a374::10/128Privatekey = <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>:1112AllowedIPs = 0.0.0.0/0, ::/0PersistentKeepalive = 25
Если не нужно IPv6, или не работает, или работает криво, то всё, что касается IPv6-адресации, можно удалить.
После правильной настройки с сервера А должно быть так:
ping 10.11.10.1PING 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 ms64 bytes from 10.11.10.1: icmp_seq=2 ttl=64 time=48.5 ms
И наоборот для сервера В.
Так же на сервере А должно работать:
ping -I vpn0 ya.ruPING 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 ms64 bytes from ya.ru (5.255.255.242): icmp_seq=2 ttl=53 time=97.2 ms
Подключаемся к А клиентом и проверяем:
ping ya.ruPING 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 ms64 bytes from ya.ru (77.88.44.242): icmp_seq=2 ttl=52 time=96.6 ms
Как-то так.
