В процеccе настройки VPN сервера WireGuard я столкнулся с некоторыми особенностями и поэтому решил написать себе конспект о том, как выполняется установка WireGuard на CentOS 9 Stream. В основном я опубликовал эту статью для личных нужд, но если вы найдете в ней что-то полезное для себя, то пользуйтесь.
Если у кого-то есть мысли по оптимизации конфигурации – пишите комментарии. Остальным коллегам, которые будут читать эту стью такие советы могут быть очень к месту.
Я использовал VPS сервер под управлением CentOS 9 Stream. Почему именно этот дистрибутив? Потому что он легко помещается в VPS конфигурацию 1 vCore/1Gb/15Gb SSD.
Даже еще остается достаточный запас ресурсов.
Установка WireGuard на CentOS9 Stream
1. Сначала устанавливаем обновления:
dnf update
2. Устанавливаем WireGuard:
dnf install epel-release && dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm && dnf install akmod-wireguard wireguard && dnf install qrencode
3. Проверим, что нужные модули ядра загрузились:
modprobe wireguard && lsmod | grep wireguard
wireguard 118784 0
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 28672 1 wireguard
curve25519_x86_64 36864 1 wireguard
libcurve25519_generic 49152 2 curve25519_x86_64,wireguard
4. Следующие компоненты не обязательны, но я очень привык к этим инструментам и нахожу их очень удобными:
dnf install mc net-tools htop bmon tmux
5. Теперь необходимо добавить правила в брандмауэр.
В CentOS 8/9 по умолчанию используется firewalld. Я в течении часа не разобрался почему не работает маршрутизация при включенном firewalld. Поэтому я перешел на iptables. Если у вас хватило времени разобраться в первопричине – поделитесь секретом, если не сложно.
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
dnf install iptables-services
systemctl enable iptables
systemctl enable ip6tables
5. Запускаем службы iptables и проверяем её статус:
systemctl start iptables
systemctl status iptables
6. Сначала посмотрим правила по умолчанию:
iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
7. Добавляю нужные мне правила для удаленного управления и сохраняю настройки правил iptables:
iptables -I INPUT 4 -p tcp -s 1.1.1.1 --dport 22 -j ACCEPT
iptables -I INPUT 4 -p tcp -s 2.2.2.2 --dport 22 -j ACCEPT
8. Теперь нужно удалить правило публичного доступа к SSH и сохранить настройки:
iptables -D INPUT 6
service iptables save
9. Загружу скрипт, который автоматизирует процесс установки:
curl https://raw.githubusercontent.com/complexorganizations/wireguard-manager/main/wireguard-manager.sh --create-dirs -o /usr/local/bin/wireguard-manager.sh
10. И запущу его:
chmod +x /usr/local/bin/wireguard-manager.sh
bash /usr/local/bin/wireguard-manager.sh
Я буду использовать следующие настройки:
What IPv4 subnet do you want to use?
1) 10.0.0.0/8 (Recommended)
2) Custom (Advanced)
Subnet Choice [1-2]:2
Custom IPv4 Subnet:10.125.125.0/24
What IPv6 subnet do you want to use?
1) fd00:00:00::0/8 (Recommended)
2) Custom (Advanced)
Subnet Choice [1-2]:1
How would you like to detect IPv4?
1) Curl (Recommended)
2) Custom (Advanced)
IPv4 Choice [1-2]:1
How would you like to detect IPv6?
1) Curl (Recommended)
2) Custom (Advanced)
IPv6 Choice [1-2]:1
How would you like to detect NIC?
1) IP (Recommended)
2) Custom (Advanced)
Nic Choice [1-2]:1
What port do you want WireGuard server to listen to?
1) 51820 (Recommended)
2) Custom (Advanced)
Port Choice [1-2]:1
What do you want your keepalive interval to be?
1) 25 (Default)
2) Custom (Advanced)
Keepalive Choice [1-2]:1
What MTU do you want to use?
1) 1420|1280 (Recommended)
2) Custom (Advanced)
MTU Choice [1-2]:1
What IPv do you want to use to connect to the WireGuard server?
1) IPv4 (Recommended)
2) IPv6
IP Choice [1-2]:1
What traffic do you want the client to forward through WireGuard?
1) Everything (Recommended)
2) Custom (Advanced)
Client Allowed IP Choice [1-2]:1
Would you like to setup real-time updates?
1) Yes (Recommended)
2) No (Advanced)
Automatic Updates [1-2]:1
no crontab for root
Would you like to setup real-time backup?
1) Yes (Recommended)
2) No (Advanced)
Automatic Backup [1-2]:1
Which DNS provider would you like to use?
1) Unbound (Recommended)
2) Custom (Advanced)
DNS provider [1-2]:2
Which DNS do you want to use with the WireGuard connection?
1) Cloudflare (Recommended)
2) AdGuard
3) NextDNS
4) OpenDNS
5) Google
6) Verisign
7) Quad9
8) FDN
9) Custom (Advanced)
DNS [1-10]:11
DNS [1-10]:1
Let's name the WireGuard Peer. Use one word only, no special characters, no spaces.
Client name:common
Would you like to expire the peer after a certain period of time?
1) Every Year (Recommended)
2) No
Automatic config expire [1-2]:2
11. Проверяем статус сервиса:
systemctl status wg-quick@wg0
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; enabled; preset: disabled)
Active: active (exited) since Mon 2023-09-18 17:01:47 CEST; 2s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 48270 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 48270 (code=exited, status=0/SUCCESS)
CPU: 133ms
Sep 18 17:01:47 47171.example.com systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
Sep 18 17:01:47 47171.example.com wg-quick[48270]: [#] ip link add wg0 type wireguard
Sep 18 17:01:47 47171.example.com wg-quick[48270]: [#] wg setconf wg0 /dev/fd/63
Sep 18 17:01:47 47171.example.com wg-quick[48270]: [#] ip -4 address add 10.125.125.1/24 dev wg0
Sep 18 17:01:47 47171.example.com wg-quick[48270]: [#] ip -6 address add fd00:00:00::1/8 dev wg0
Sep 18 17:01:47 47171.example.com wg-quick[48270]: [#] ip link set mtu 1420 up dev wg0
Sep 18 17:01:47 47171.example.com wg-quick[48270]: [#] sysctl --write net.ipv4.ip_forward=1; sysctl --write net.ipv6.conf.all.forwarding=1; nft add table inet wireguar>
Sep 18 17:01:47 47171.example.com wg-quick[48300]: net.ipv4.ip_forward = 1
Sep 18 17:01:47 47171.example.com wg-quick[48302]: net.ipv6.conf.all.forwarding = 1
Sep 18 17:01:47 47171.example.com systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
12. Но со штатной конфигурацией у меня маршрутизация не заработала. Поэтому я скорректировал директивы PostUp и PostDown в конфигурационном файле.
nano /etc/wireguard/wg0.conf
Вот на такие:
PostUp = iptables -I FORWARD 1 -i %i -j ACCEPT; iptables -I FORWARD 1 -o %i -j ACCEPT; iptables -I INPUT 1 -p udp --dport 51820 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens1 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D INPUT -p udp --dport 51820 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens1 -j MASQUERADE
13. И перезапустил службы WireGuard:
systemctl restart wg-quick@wg0
14. Итого в моем случае получились следующие правила iptables после запуска службы WireGuard:
iptables -L
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:51820
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- xx.xx.xx.xx anywhere tcp dpt:ssh
ACCEPT tcp -- yy.yy.yy.yy anywhere tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Установка WireGuard на CentOS 9 Stream завершена.
Тестируем подключение с Android устройства
Подключение с Android устройств
1. Для Android клиентов есть приложение с клиентом WireGuard.
2. Проще всего настроить подключение через QR код.
3. Если вы закрыли терминал с QR кодом клиента, который мы с вами сгенерировали выше, то его всегда можно отобразить повторно:
qrencode -t ansiutf8 < /etc/wireguard/clients/common-wg0.conf
4. Сканируем QR код и указываем имя для нового профиля VPN подключения.
5. Проверяем работу подключения.
Подключение с Linux Mint
1. Устанавливаем клиент:
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt update
sudo apt install wireguard
sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf
2. Создаем конфигурационный файл с настройками клиента:
sudo touch /etc/wireguard/wg0.conf
3. В конфигурационный файл переносим настройки нужного клиента из директории /etc/wireguard/clients сервера WireGuard.
Содержимое моего конфигурационного файла:
# https://www.wireguard.com
[Interface]
Address = 10.125.125.6/24,fd00:00:00::6/8
DNS = 1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001
ListenPort = 65501
MTU = 1280
PrivateKey = xxx
[Peer]
AllowedIPs = 0.0.0.0/0,::/0
Endpoint = 185.130.225.195:51820
PersistentKeepalive = 25
PresharedKey = yyy
PublicKey = zzz
4. Сохраняем внесенные изменения в конфигурационный файл клиента.
5. Запускаем подключение:
sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.125.125.6/24 dev wg0
[#] ip -6 address add fd00:00:00::6/8 dev wg0
[#] ip link set mtu 1280 up dev wg0
[#] resolvconf -a wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n
6. Отключение интерфейса:
sudo wg-quick down wg0
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip -6 rule delete table 51820
[#] ip -6 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
[#] resolvconf -d wg0 -f
[#] iptables-restore -n
[#] ip6tables-restore -n
Добавление нового клиента
Последующее управление сервером WireGuard можно выполнять либо вручную, либо через скрипт, который мы с вами загрузили ранее:
bash /usr/local/bin/wireguard-manager.sh
Добавим нового клиента:
What do you want to do?
1) Show WireGuard
2) Start WireGuard
3) Stop WireGuard
4) Restart WireGuard
5) Add WireGuard Peer (client)
6) Remove WireGuard Peer (client)
7) Reinstall WireGuard
8) Uninstall WireGuard
9) Update this script
10) Backup WireGuard
11) Restore WireGuard
12) Update Interface IP
13) Update Interface Port
14) Purge WireGuard Peers
15) Generate QR Code
16) Check Configs
Select an Option [1-16]:5
Let's name the WireGuard Peer. Use one word only, no special characters, no spaces.
New client peer:roman
# https://www.wireguard.com
[Interface]
Address = 10.125.125.3/24,fd00:00:00::3/8
DNS = 1.1.1.1,1.0.0.1,2606:4700:4700::1111,2606:4700:4700::1001
ListenPort = 29977
MTU = 1280
PrivateKey = xx
[Peer]
AllowedIPs = 0.0.0.0/0,::/0
Endpoint = 185.130.225.195:51820
PersistentKeepalive = 25
PresharedKey = yy
PublicKey = zz
Client config --> /etc/wireguard/clients/roman-wg0.conf
Также скрипт сразу выведет на экран QR код для упрощения процедуры добавления клиента.