weather
<<  <  Июль 2025  >  >>
Пн Вт Ср Чт Пт Сб Вс
123456
78910111213
14151617181920
21222324252627
28293031

Категории

 

Новости

июн. 11, 2025

Internet через wireguard на удаленном сервере без статического ip


Про то как поднять WireGuard для VPN на удалённом сервере с динамическим IP.

sxema

Конфиг:

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.yaml
network:
  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

Как-то так.



This is a captcha-picture. It is used to prevent mass-access by robots. (see: www.captcha.net)