Установка WireGuard VPN сервера на Oracle VPS

Категория: Utilities

Установка и настройка VPN сервера WireGuard на VPS Oracle. Также установим клиент на локалку Manjaro.

Обещают, что WireGuard в 3 раза производительнее OpenVPN.

Клиент APK WireGuard весит ~3 mb, коннфиг для клиента всего 330 байт. 

WireGuard Linux клиент

Установка WireGuard клиента на Manjaro
sudo pacman -S wireguard-tools

Подключение клиента (создание интерфейса и туннеля):

sudo wg-quick up ./wg-ams1.conf
sudo wg-quick down ./wg-ams1.conf
## Или по имени конфига, если конфиг скопирован в /etc/wireguard/wg-ams1.conf
sudo wg-quick up wg-ams1
sudo wg-quick down wg-ams1
Конфиг WireGuard клиента:
[Interface]
Address = 10.0.0.2/32
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= (ключ из /etc/wireguard/client-private.key)
DNS = 10.0.0.1

[Peer]
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX= (ключ из /etc/wireguard/server-public.key)
Endpoint = XXX.XXX.XXX.XXX:XXXXX (Реальный/внешний IP сервера и порт)
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 21
Добавить соединение в интерфейс NetworkManager:Важно! Импортируйте конфиг через nmcli, а не через интерфейс NetworkManager!
sudo nmcli connection import type wireguard file ./wg-do-de-fra.conf
sudo ls -la /etc/NetworkManager/system-connections/ 

WireGuard Linux сервер

Установка WireGuard в Manjaro
sudo pacman -S wireguard-tools
#sudo modprobe wireguard && lsmod | grep wireguard

## Создаем 4 файла ключей
sudo -i
cd /etc/wireguard/
#umask 077
wg genkey | tee server-private.key | wg pubkey > server-public.key
wg genkey | tee client-private.key | wg pubkey > client-public.key
chmod 600 *.key

sysctl -w net.ipv4.ip_forward=1 && sudo sysctl -p

touch /etc/wireguard/wg0.conf && chmod 600 /etc/wireguard/wg0.conf

Сохраняем параметр net.ipv4.ip_forward=1 в /etc/sysctl.conf:

sudo nano /etc/sysctl.conf
##net.ipv4.ip_forward=1
sudo sysctl -p
Настройка интерфейса /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.66.66.1/24,fd42:42:42::1/64
ListenPort = XXXXX
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# - - - or:
#PostUp = iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#PostDown = iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# - - - or:
PostUp = iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE; iptables -I FORWARD 1 -i ens3 -o wg0 -j ACCEPT; iptables -I FORWARD 1 -i wg0 -j ACCEPT; iptables -I INPUT 1 -i ens3 -p udp --dport XXXXX -j ACCEPT; iptables -I INPUT 1 -i wg0 -j ACCEPT;
PostDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; iptables -D FORWARD -i ens3 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D INPUT -i ens3 -p udp --dport XXXXX -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT;

### Список клиентов ###
[Peer]
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
#PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128

[Interface] PrivateKey = содержимое: cat /etc/wireguard/server-private.key

[Peer] PublicKey = содержимое: cat /etc/wireguard/client-public.key

sudo systemctl enable --now wg-quick@wg0.service
Добавить ключ клиента на WireGuard сервер
wg set wg0 peer <client-public.key> allowed-ips 0.0.0.0/0,::/0

Запуск скриптом wireguard-install.sh

Запустить мастер установки WireGuard сервера: 

curl https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh -O
chmod +x wireguard-install.sh
sudo ./wireguard-install.sh
Пошаговая интерактивная установка WireGuard (мастер настройки):
IPv4 or IPv6 public address: XXX.XXX.XXX.XXX (может определить локальный IP, если вы за NAT! Укажите внешний IP)
Public interface: ens3
WireGuard interface name: wg0
Server's WireGuard IPv4: 10.66.66.1
Server's WireGuard IPv6: fd42:42:42::1
Server's WireGuard port [1-65535]: XXXXX
First DNS resolver to use for the clients: 94.140.14.14  (Это DNS сервера AdGuard)
Second DNS resolver to use for the clients (optional): 94.140.15.15 (..блочат рекламу, счетчики, фишинговые сайты)
Хорошо, это все что было нужно. Теперь мы готовы настроить ваш сервер WireGuard.
Вы сможете создать клиент в конце установки.
Press any key to continue...
-----------------------
Будут установлены НОВЫЕ пакеты:
libqrencode4 qrencode wireguard wireguard-tools
... configure ...
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.
-----------------------
Укажите имя клиента до 15 символов [a-z-_0-9]:
Client name: client-name
Client's WireGuard IPv4: 10.66.66.2
Client's WireGuard IPv6: fd42:42:42::2

Here is your client config file as a QR Code:
...
...
Этот QR код также доступен здесь: /home/user/wg0-client-name.conf
Для добавления клиента - запустите скрипт еще раз.

Если запустить скрипт повторно, вы увидите меню:

It looks like WireGuard is already installed.
What do you want to do?
   1) Add a new user
   2) Revoke existing user
   3) Uninstall WireGuard
   4) Exit
Select an option [1-4]:

Сервер WireGuard будет запускаться автоматически:

sudo systemctl status wg-quick@wg0.service
sudo systemctl restart wg-quick@wg0

Это все. Если не возникнет проблем с iptables policy или firewall.

Что конфигурит скрипт?
* Applying /etc/sysctl.d/10-console-messages.conf ...
kernel.printk = 4 4 1 7
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
kernel.kptr_restrict = 1
* Applying /etc/sysctl.d/10-link-restrictions.conf ...
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
kernel.sysrq = 176
* Applying /etc/sysctl.d/10-network-security.conf ...
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
* Applying /etc/sysctl.d/10-ptrace.conf ...
kernel.yama.ptrace_scope = 1
* Applying /etc/sysctl.d/10-zeropage.conf ...
vm.mmap_min_addr = 65536
* Applying /usr/lib/sysctl.d/50-default.conf ...
net.ipv4.conf.default.promote_secondaries = 1
sysctl: setting key "net.ipv4.conf.all.promote_secondaries": Invalid argument
net.ipv4.ping_group_range = 0 2147483647
net.core.default_qdisc = fq_codel
fs.protected_regular = 1
fs.protected_fifos = 1
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
kernel.pid_max = 4194304
* Applying /etc/sysctl.d/99-cloudimg-ipv6.conf ...
net.ipv6.conf.all.use_tempaddr = 0
net.ipv6.conf.default.use_tempaddr = 0
* Applying /etc/sysctl.d/99-sysctl.conf ...
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
* Applying /usr/lib/sysctl.d/protect-links.conf ...
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/scsi-log-level.conf ...
dev.scsi.logging_level = 68
* Applying /etc/sysctl.d/wg.conf ...
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
* Applying /etc/sysctl.conf ...
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
Конфигурация интерфейса /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf
#sudo chmod 755 /etc/wireguard/ # виден список файлов
[Interface]
Address = 10.66.66.1/24,fd42:42:42::1/64
ListenPort = XXXXX
PrivateKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
## Оригинальные политики:
#PostUp = iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#PostDown = iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
## or:
#PostUp = iptables -A FORWARD -i ens3 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE;
#PostDown = iptables -D FORWARD -i ens3 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE;
## Для Oracle:
PostUp = iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE; iptables -I FORWARD 1 -i ens3 -o wg0 -j ACCEPT; iptables -I FORWARD 1 -i wg0 -j ACCEPT; iptables -I INPUT 1 -i ens3 -p udp --dport XXXXX -j ACCEPT; iptables -I INPUT 1 -i wg0 -j ACCEPT;
PostDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; iptables -D FORWARD -i ens3 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D INPUT -i ens3 -p udp --dport XXXXX -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT;
## Не хватает правил iptables, если закрыт INPUT трафик:
#sudo iptables -I INPUT 1 -i ens3 -p udp --dport XXXXX -j ACCEPT # Подключение к серверу WG
#sudo iptables -I INPUT 1 -i wg0 -j ACCEPT # Трафик внутрь сети wg0 (не обязательно)

### Client client-01
[Peer]
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
PresharedKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128
Политики iptables
Пример скрипта настройки NAT: https://pastebin.com/raw/DWRcUjX2
INSERT: вставка правил, если по дефолту ACCEPT, а в конце REJECT:
#sudo iptables -t nat -I POSTROUTING 1 -o ens3 -j MASQUERADE -s 10.66.66.0/24;  ## NAT
sudo iptables -I INPUT 1 -i ens3 -p udp --dport XXXXX -j ACCEPT;  ## Соединение с самим сервером WG по порту
sudo iptables -I INPUT 1 -i wg0 -j ACCEPT;                        ## Входящий трафик на wg0 (не обязательно)
sudo iptables -I FORWARD 1 -i wg0 -j ACCEPT;
sudo iptables -I FORWARD 1 -i ens3 -o wg0 -j ACCEPT;
APPEND: дополнение правил, если по дефолту DROP:
sudo iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE;      ## NAT
sudo iptables -A INPUT -i ens3 -p udp --dport XXXXX -j ACCEPT;  ## Соединение с самим сервером WG по порту
#sudo iptables -A INPUT -i wg0 -j ACCEPT;                        ## Входящий трафик на wg0 (не обязательно)
sudo iptables -A FORWARD -i ens3 -o wg0 -j ACCEPT;
sudo iptables -A FORWARD -i wg0 -j ACCEPT;
* Можно переносить вконец REJECT, после дополнения правил:
sudo iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited
sudo iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
Просмотр iptables:
sudo iptables -S | grep -vEi 'Oracle|DOCKER|^-P'
Сохранение и отладка:
sudo iptables-save > ~/.iptables.rules
# ..правим rules..
sudo iptables-restore < ~/.iptables.rules && sudo iptables -S | grep -vEi 'Oracle|DOCKER|^-P'
Можно добавить нужные политики в cron:
crontab -e
@reboot  sleep 60 && cd /home/ubuntu/ && ./cron-reboot.sh >> ./cron.log 2>&1
@see https://www.cyberciti.biz/faq/how-to-set-up-wireguard-firewall-rules-in-linux/
 

Смотрите "политики iptables" если клиент не подключается или вы видите подобные логи:

curl: (7) Failed to connect to x.x.x.x port xxxxx after 92 ms: Нет маршрута до узла
## Это логи на официальном клиенте WireGuard
..Sending handshake initiation
..Handshake did not complete after 5 sec
* Если нет соединения проверьте iptables.
..Received handshake response
..Receiving keepalive packet

#vpn #wiireguard #iptables #net.ipv4.ip_forward

категория: Utilities