Задача: Проработать сперва в лабораторных условиях как настраивается туннель Wireguard для начала на операционной системе Ubuntu 20.04 Server. Хочу для себя понять тонкости, нюансы, ошибки. Но в процессе лабораторная превратилась в боевую инсталляцию с разбором дополнительных нюансов которых не было в лабораторной. По итогу я получил среду, на которую в последствии установил собственный почтовый сервер (почта ходит и принимается). Об этом будет последующая заметка. сейчас инфраструктура.

Схема:

Схема организации Wireguard VPN туннеля

Hostname: mail.ekzorchik.com (Wireguard — центральная часть), купленная VPS система по ссылке и купленное доменное имя ekzorchik.com.

OS: Ubuntu 20.04 LTS Server

  • Eth: 1 ethernet
  • IP: 2.57.186.62
  • RAM: 1Gb
  • HDD: 30Gb
  • CPU: 1 (2cores)

Hostname: srv-client (Wireguard — узел подключающийся к центральной части

OS: Ubuntu 18.04 Server

  • IP: 172.35.35.9
  • Eth: 1 ethernet
  • RAM: 2Gb
  • HDD: 60Gb
  • CPU: 1 (2cores)

Wireguard network:

  • Ethernet: 10.0.0.0/24

Шаг №1: На систему mail.ekzorchik.com устанавливаю Wireguard и надстройку над правилами iptables => firewalld:

На заметку: WireGuard работает как модуль ядра, который скомпилирован как модуль DKMS.

root@ekzorchik:~# apt-cache show wireguard | grep Version
Version: 1.0.20200513-1~20.04.2
Version: 1.0.20200319-1ubuntu1
root@ekzorchik:~#
root@ekzorchik:~# sudo apt-get install -y wireguard-dkms wireguard-tools firewalld

Шаг №2: Чтобы на системе (mail.ekzorchik.com) которая выступает, как сервер wireguard работал NAT, нужно включить IPпересылку:

root@ekzorchik:~# nano /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.src_valid_mark=1
root@ekzorchik:~# sudo sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.src_valid_mark=1
root@ekzorchik:~# 

Шаг №3: Создадим пару закрытого и открытого ключа на системе mail.ekzorchik.com которая выступает, как сервер Wireguard:

На заметку: Закрытый ключ никогда не должен передаваться никому.

root@ekzorchik:~# wg genkey | sudo tee /etc/wireguard/privatekey
eL6pwVqU14NTsAO9Lxgrtq10TxjQ5nSdV7bLtyK1fnI=

root@ekzorchik:~# sudo bash -c "wg pubkey < /etc/wireguard/privatekey > /etc/wireguard/pubkey"

root@ekzorchik:~# sudo bash -c "cat /etc/wireguard/pubkey"
YKYQPLRrwK1oTBsXOS+kC2rW93E67JIcSNvBlp6jl3c=

Шаг №4: На систему srv-client устанавливаю Wireguard:

ekzorchik@srv-client:~$ sudo apt-get install -y wireguard-dkms wireguard-tools 

На заметку: А чтобы wireguard мог изменить сетевые настройки клиентов, нужно установить пакет resolvconf

ekzorchik@srv-client:~$ sudo apt-get install resolvconf

Шаг №5: Создадим пару закрытого и открытого ключа для системы srv-client которая выступает, как клиент Wireguard:

На заметку: Закрытый ключ никогда не должен передаваться никому.

ekzorchik@srv-client:~$ wg genkey | sudo tee /etc/wireguard/privatekey
WHtksuOAY+q7uCfg4r429tcnOack4tMRRoopeheCNn8=

ekzorchik@srv-client:~$ sudo bash -c "wg pubkey < /etc/wireguard/privatekey > /etc/wireguard/pubkey"

ekzorchik@srv-client:~$ sudo bash -c "cat /etc/wireguard/pubkey"
1IL/tdn/l72JELiLLD8syIP71WQ7L6er9gI/hAxcjlk=
ekzorchik@srv-client:~$

Шаг №6: Настраиваем туннельное устройство, которое будет маршрутизировать трафик VPN на клиенте системы srv-client:

ekzorchik@srv-client:~$ sudo nano /etc/wireguard/wg0.conf
[Interface]
#PrivateKey = CLIENT_PRIVATE_KEY
# cat /etc/wireguard/privatekey
PrivateKey = WHtksuOAY+q7uCfg4r429tcnOack4tMRRoopeheCNn8=
# Адрес и маска [Peer] должны быть одинаковыми и на клиенте и на сервере
Address = 10.0.0.2/32
DNS = 8.8.8.8

[Peer]
#PublicKey = SERVER_PUBLIC_KEY
#cat /etc/wireguard/pubkey
PublicKey = YKYQPLRrwK1oTBsXOS+kC2rW93E67JIcSNvBlp6jl3c=
#Endpoint = SERVER_IP_ADDRESS:PORT
Endpoint = mail.ekzorchik.com:31194
AllowedIPs = 0.0.0.0/0
#Key connection alive ##
PersistentKeepalive = 15

Шаг №7: Настраиваем туннельное устройство (on mail.ekzorchik.com), которое будет маршрутизировать трафик VPN между системами mail.ekzorchik.com & srv-client:

[Interface]
#указываю имя приватного ключа, sudo bash -c "cat /etc/wireguard/privatekey"
PrivateKey = eL6pwVqU14NTsAO9Lxgrtq10TxjQ5nSdV7bLtyK1fnI=
#Внутренний адрес сервера
Address = 10.0.0.1/24
#Порт на котором мой сервер будет принимать подключения
ListenPort = 31194
#в качестве брандмауэера я буду использовать надстройку над правилами iptables => firewalld
#ip r | awk '{print $5}' | head -n1
#eth0
PostUp = firewall-cmd --zone=external --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o eth0 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE; firewall-cmd --add-port=31194/udp
PostDown = firewall-cmd --zone=external --remove-masquerade; firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i wg0 -o eth0 -j ACCEPT; firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE; firewall-cmd --remove-port=31194/udp

#Секция настройки клиента
#Client
[Peer]
# Подставьте сюда публичный ключ клиента
#sudo bash -c "cat /etc/wireguard/publickey
PublicKey = 1IL/tdn/l72JELiLLD8syIP71WQ7L6er9gI/hAxcjlk=
# внутренний ip адрес клиента (client1)
# и здесь же указывается подсеть за клиентом чтобы можно было настроить и заработал проброс порта
AllowedIPs = 10.0.0.2/32, 172.33.2.0/24

Шаг №8: Файлы wg0.conf и privatekey не должны быть доступны для чтения для обычных пользователей на обоих системах: mail.ekzorchik.com & srv-client:

root@ekzorchik:~# sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}

ekzorchik@srv-client:~$ sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}

Шаг №9: Поднимаем интерфейс wg0 (имя файла конфигурации без расширения /etc/wireguard/wg0.conf) на системе mail.ekzorchik.com:

root@ekzorchik:~# sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 172.33.2.0/24 dev wg0
[#] firewall-cmd --zone=external --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o eth0 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE; firewall-cmd --add-port=31194/udp
success
success
success
success
root@ekzorchik:~#

root@ekzorchik:~# ip r
default via 2.57.186.1 dev eth0 proto static
2.57.186.0/23 dev eth0 proto kernel scope link src 2.57.186.62
10.0.0.0/24 dev wg0 proto kernel scope link src 10.0.0.1
172.33.2.0/24 dev wg0 scope link
root@ekzorchik:~#

Шаг №10: Запускаю на системе mail.ekzorchik.com команду wg show wg0 для проверки состояния интерфейса и конфигурации:

root@ekzorchik:~# sudo wg show wg0
interface: wg0
  public key: YKYQPLRrwK1oTBsXOS+kC2rW93E67JIcSNvBlp6jl3c=
  private key: (hidden)
  listening port: 31194

peer: 1IL/tdn/l72JELiLLD8syIP71WQ7L6er9gI/hAxcjlk=
  allowed ips: 10.0.0.2/32, 172.33.2.0/24
root@ekzorchik:~#

На заметку: Проще перезапускать wireguard делая wg-quick down wg0 && wg-quick up

Шаг №11: Настраиваю брандмауэер firewalld применительно к работе с Wireguard VPN туннелем:

root@ekzorchik:~# sudo firewall-cmd --info-zone=internal
internal (active)
  target: default
  icmp-block-inversion: no
  interfaces: wg0
  sources:
  services: dhcpv6-client mdns samba-client ssh
  ports: 31194/udp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

root@ekzorchik:~# sudo firewall-cmd --info-zone=external
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh
  ports: 31194/udp 8060/tcp 8070/tcp 22400/tcp
  protocols:
  masquerade: yes
  forward-ports: 
  source-ports:
  icmp-blocks:
  rich rules:

root@ekzorchik:~#

На заметку: на этой же VPS системе у меня развернут Aspia Relay + Aspia Router по заметке.

Т.е. у меня две зоны, одна смотрим в интернет, а другая в Wireguard туннель.

Шаг №12: Чтобы интерфейс WireGuard загружался с перезагрузкой сервера на системе mail.ekzorchik.com:

root@ekzorchik:~# sudo systemctl enable wg-quick@wg0.service
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.
root@ekzorchik:~#
root@ekzorchik:~# sudo reboot

Шаг №13: Поднимаем интерфейс wg0 (имя файла конфигурации без расширения .conf) на клиентской системе srv-client:

ekzorchik@srv-client:~$ sudo wg-quick up wg0

Поднимаем интерфейс wg0 на srv-client

На заметку: Если вы это проделываете, будучи подключенным к системе, которая выступает, как клиент, к примеру, по SSH то вы потеряете к ней доступ, а подключившись к ней, к примеру, через Console авторизовавшись, туннель будет установлен:

Адреса на srv-client и поднятый туннель

Шаг №14: Чтобы интерфейс WireGuard загружался с перезагрузкой сервера на системе srv-client:

ekzorchik@srv-client:~$ sudo systemctl enable wg-quick@wg0.service
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@wg0.service.
ekzorchik@srv-client:~$

ekzorchik@srv-client:~$ sudo reboot

Включаю интерфейс wg0 на srv-client и проверяю, что после перезагрузки сервис работает

Шаг №15: Проверяю, что, отправив обе системы в перезагрузку сервис wireguard поднимется и туннель вместе с ним:

обе системы успешно видят друг друга но видят только адреса туннель, а как чтобы mail.ekzorchik.com увидел внутренний адрес srv-client, т.е. 172.33.2.14, а для этого нужно на сервере wireguard в конфигурационном файле wg0 прописать в секции [Peer]

# внутренний ip адрес клиента (client1)

# и здесь же указывается подсеть за клиентом чтобы можно было настроить и заработал проброс порта

  • AllowedIPs = 10.0.0.2/32, 172.33.2.0/24

Шаг №:16: Задача: Как настроить чтобы при обращении на систему где сервер Wireguard порт перенаправлялся на клиентскую систему, т.е. схема будет:

mail.ekzorchik.com:8080 <wireguard-туннель> srv-client:80 (172.33.2.14:80)

on client (Hostname: srv-client)

root@ekzorchik:~# sudo firewall-cmd --zone=external --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=172.33.2.14 --permanent
success
root@ekzorchik:~# sudo firewall-cmd --reload
success
root@ekzorchik:~#

Проверяю, что обратившись на адрес http://mail.ekzorchik.com:8080 я попадаю на nginx установленный на 172.33.2.14

root@ekzorchik:~# curl http://mail.ekzorchik.com:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@ekzorchik:~#

Ответ, да перенаправление произведено успешно через wireguard туннель.

Шаг №17: Как сейчас осуществляется выход в интернет с клиентской srv-client системы. Ответ: через узел 10.0.0.1отлично.

Выход в интернет с srv-client идет через VPS

На заметку: Важный нюанс по данной заметке, у меня в заметках используется утилита firewalld версии 0.8.2OS: Ubuntu 20.04 где Wireguard работает в качестве сервера — все работает, как и написано в заметках моего блога), а начиная с версии 1.0

root@ekzorchik:~# dpkg -l | grep firewalld | head -n 1
ii firewalld 0.8.2-1 all dynamically managed firewall with support for network zones
root@ekzorchik:~#

по умолчанию блокируется транзитный трафик между зонами хоть и включена настройка net.ipv4.ip_forward=1, это дело не меняет. А в Ubuntu 22.04 уже устанавливается версия firewalld = 1.1.1-1ubuntu1 и все применяя к ней исходя из моих заметок получается что не работает, т.е. если Вы на Ubuntu 22.04 Server поднимаете Wireguard-сервер, в этом случае нужно разрешить прохождение трафика с помощью policy object, к примеру создав правило: client-to-inet

firewall-cmd --permanent --new-policy client-to-inet
firewall-cmd --permanent --policy client-to-inet --set-target ACCEPT
firewall-cmd --permanent --policy client-to-inet --add-ingress-zone internal
firewall-cmd --permanent --policy client-to-inet --add-egress-zone external
firewall-cmd --reload

после интернет при подключении через Wireguard с клиентской системы к Ubuntu 22.04 Server (Wireguard-сервер) начинает работать, а туннель как устанавливался так и устанавливается.

Итого я успешно разобрать как настраивается VPN туннель на базе Wireguard со всеми своими нюансами который у меня были в лабораторном окружении и боевом. На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.