Задача: Проработать сперва в лабораторных условиях как настраивается туннель Wireguard
для начала на операционной системе Ubuntu 20.04 Server
. Хочу для себя понять тонкости, нюансы, ошибки. Но в процессе лабораторная превратилась в боевую инсталляцию с разбором дополнительных нюансов которых не было в лабораторной. По итогу я получил среду, на которую в последствии установил собственный почтовый сервер (почта ходит и принимается). Об этом будет последующая заметка. сейчас инфраструктура.
Схема:
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
На заметку: Если вы это проделываете, будучи подключенным к системе, которая выступает, как клиент, к примеру, по SSH
то вы потеряете к ней доступ, а подключившись к ней, к примеру, через Console
авторизовавшись, туннель будет установлен:
Шаг №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
Шаг №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
— отлично.
На заметку: Важный нюанс по данной заметке, у меня в заметках используется утилита firewalld
версии 0.8.2
(в OS: 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.