Как настроить Wireguard VPN на CentOS 8
На этой странице
- Шаг 1. Обновление системы
- Шаг 2. Установите и включите репозиторий EPEL
- Шаг 3. Установите Wireguard
- Шаг 4. Настройка сервера Wireguard
- Шаг 5. Настройка брандмауэра
- Шаг 6. Включите переадресацию IPv4
- Шаг 7. Включите и запустите службу Wireguard
- Шаг 8. Установка и настройка клиента WireGuard
- Шаг 9. Настройте сервер для добавления клиента
- Шаг 10. Проверка
- Заключение
Wireguard — это кроссплатформенная реализация VPN с открытым исходным кодом, использующая современную криптографию. Он быстрее, проще и функциональнее протоколов IPSec и OpenVPN. Он разработан как VPN общего назначения для работы на встроенных интерфейсах и суперкомпьютерах и работает на Linux, Windows, macOS, iOS, Android, BSD и других платформах.
В этом руководстве рассказывается, как установить Wireguard VPN на сервер на базе CentOS 8 и подключиться к нему с помощью клиента Linux (CentOS/Fedora/Ubuntu).
Шаг 1 - Обновление системы
Прежде чем продолжить, необходимо обновить систему, чтобы установить последние обновления.
$ sudo dnf update
Шаг 2. Установите и включите репозиторий EPEL
Необходимые пакеты Wireguard можно найти в репозитории EPEL, поэтому нам нужно установить и включить его.
$ sudo dnf install epel-release
$ sudo dnf config-manager --set-enabled PowerTools
Мы также включили репозиторий PowerTools, так как от него зависят пакеты EPEL.
Шаг 3 — Установите Wireguard
Включите репозиторий Wireguard.
$ sudo dnf copr enable jdoss/wireguard
Установите WireGuard.
$ sudo dnf install wireguard-dkms wireguard-tools
На этом шаге также устанавливается компилятор GNU GCC, необходимый для сборки модулей ядра Linux.
Шаг 4. Настройте сервер Wireguard.
Создайте пустой файл конфигурации на сервере для настроек Wireguard с соответствующими разрешениями.
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
Команда Touch создает файл wg0-server.conf
в каталоге /etc/wireguard
.
Затем создайте пару закрытый/открытый ключ для сервера Wireguard.
$ cd /etc/wireguard
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
Это создает как открытый, так и закрытый ключ для Wireguard и записывает их в соответствующие файлы.
Просмотрите закрытый ключ, который мы только что создали.
$ sudo cat privatekey
Запишите ключ и скопируйте его, потому что он понадобится нам для настройки Wireguard.
Далее редактируем файл конфигурации.
$ sudo nano /etc/wireguard/wg0.conf
Добавьте следующий код.
[Interface]
## VPN server private IP address ##
Address = 192.168.10.1/24
## VPN server port - You can choose any port ##
ListenPort = 37822
## VPN server's private key i.e. /etc/wireguard/privatekey - the one from above ##
PrivateKey = GCEXafeZKqSsuLfvuHE+zLzMYwoH4qQyBh7MZ4f/3kM=
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true
Каждая конфигурация имеет один раздел с именем [Interface]
, где определяется серверная часть.
Он содержит закрытый ключ локального сервера WireGuard, порт UDP, который он должен прослушивать для входящих подключений, и собственные IP-адреса VPN.
Мы также устанавливаем для SaveConfig
значение true
. Это укажет службе Wireguard автоматически сохранять свою активную конфигурацию в этот файл при завершении работы.
Нажмите Ctrl + W, чтобы закрыть файл, и введите Y, когда будет предложено сохранить файл.
Шаг 5 — Настройте брандмауэр
Нам нужно открыть порт, который мы выбрали для Wireguard.
Во-первых, нам нужно определить службу Wireguard для брандмауэра. Для этого создайте файл wireguard.xml
с помощью редактора Nano.
$ sudo nano /etc/firewalld/services/wireguard.xml
Вставьте следующий код в файл.
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>wireguard</short>
<description>WireGuard open UDP port 37822 for client connections</description>
<port protocol="udp" port="37822"/>
</service>
Нажмите Ctrl + W, чтобы закрыть файл, и введите Y, когда будет предложено сохранить файл.
Затем включите службу Wireguard в брандмауэре.
$ sudo firewall-cmd --permanent --add-service=wireguard
Включите маскировку, чтобы весь входящий и исходящий трафик с 192.168.10.0/24 направлялся через наш общедоступный IP-адрес сервера 203.1.114.98/24.
$ sudo firewall-cmd --permanent --add-masquerade
Наконец, перезагрузите брандмауэр, чтобы активировать правила.
$ sudo firewall-cmd --reload
Перечислите текущие правила брандмауэра для подтверждения.
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: wireguard ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Шаг 6. Включите переадресацию IPv4.
Создайте файл /etc/sysctl.d/99-custom.conf
.
$ sudo nano /etc/sysctl.d/99-custom.conf
Вставьте следующий код в файл.
## Turn on bbr ##
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
## for IPv4 ##
net.ipv4.ip_forward = 1
## Turn on basic protection/security ##
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
## for IPv6 ##
net.ipv6.conf.all.forwarding = 1
Нажмите Ctrl + W, чтобы закрыть файл, и введите Y, когда будет предложено сохранить файл.
Объем кода в приведенном выше файле выходит за рамки этого руководства, поэтому пока просто используйте его как есть.
Перезагрузите изменения.
$ sudo sysctl -p /etc/sysctl.d/99-custom.conf
По умолчанию брандмауэр не позволяет интерфейсам wg0
и eth0
взаимодействовать друг с другом. Итак, нам нужно добавить интерфейс Wireguard во внутреннюю сеть и включить маскировку.
$ sudo firewall-cmd --add-interface=wg0 --zone=internal
$ sudo firewall-cmd --permanent --zone=internal --add-masquerade
Шаг 7. Включите и запустите службу Wireguard.
Далее нам нужно включить и запустить службу Wireguard.
$ sudo systemctl enable
$ sudo systemctl start
Вы можете проверить, запущен ли интерфейс Wireguard, wg0
, с помощью следующей команды.
$ sudo wg
interface: wg0
public key: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
private key: (hidden)
listening port: 37822
$ sudo ip a show wg0
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.10.1/24 scope global wg0
valid_lft forever preferred_lft forever
Шаг 8. Установите и настройте клиент WireGuard.
Вы можете найти инструкции по установке клиента Wireguard для вашего дистрибутива Linux на их официальной странице установки.
После установки клиента необходимо создать файл конфигурации клиента.
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
$ cd /etc/wireguard/
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
$ sudo cat privatekey
Обратите внимание на закрытый ключ, который вы получите в конце. Далее нам нужно отредактировать только что созданный файл конфигурации.
$ sudo nano /etc/wireguard/wg0.conf
Добавьте в файл следующие директивы.
[Interface]
## client private key ##
PrivateKey = OEM6D/zt2fVWOepVv3iEDD430V0gAshKp4+5oVVt5EE=
## client ip address ##
Address = 192.168.10.2/24
[Peer]
## CentOS 8 server public key ##
PublicKey = VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
## set ACL ##
AllowedIPs = 192.168.10.0/24
## Your CentOS 8 server's public IPv4/IPv6 address and port ##
Endpoint = 203.1.114.98:37822
## Key connection alive ##
PersistentKeepalive = 15
Обратите внимание, что мы назначили частный IP-адрес 192.168.10.1 серверу и 192.168.10.2 клиенту. Мы также добавили закрытый ключ клиента в файл.
В разделе [Peer]
вы вводите конфигурацию серверов, к которым будет подключаться клиент. Здесь мы добавили открытый ключ, общедоступный IP-адрес и набор разрешенных IP-адресов, который содержит частный IP-адрес нашего сервера. PersistentKeepalive
указывает WireGuard отправлять UDP-пакет каждые 15 секунд, это полезно, если вы находитесь за NAT и хотите поддерживать соединение.
Нажмите Ctrl + W, чтобы закрыть файл, и введите Y, когда будет предложено сохранить файл.
Теперь пришло время включить и запустить VPN-клиент.
$ sudo systemctl enable
$ sudo systemctl start
$ sudo systemctl status
Шаг 9. Настройте сервер для добавления клиента
Теперь нам нужно снова добавить конфигурацию клиентов на сервер, чтобы сообщить ему о клиенте.
Сначала остановите службу Wireguard.
$ sudo systemctl stop
Откройте файл wg0.conf для редактирования.
$ sudo nano /etc/wireguard/wg0.conf
Добавьте следующий код в конец файла.
[Peer]
## client VPN public key ##
PublicKey = dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
## client VPN IP address (note /32 subnet) ##
AllowedIPs = 192.168.10.2/32
Нажмите Ctrl + W, чтобы закрыть файл, и введите Y, когда будет предложено сохранить файл.
Разделы [Peer]
определяют других участников сети VPN. Вы можете добавить столько, сколько необходимо.
Они содержат свой открытый ключ, который должен совпадать с закрытым ключом пира в разделе [Interface]
.
Обратите внимание, что любое входящее соединение сначала аутентифицируется по одному из открытых ключей. Если соединение не от проверенного узла, входящие пакеты просто молча игнорируются. Поскольку соединения от хостов, у которых нет соответствующего закрытого ключа, вообще не отвечают, WireGuard VPN не только обеспечивает зашифрованную связь, но и остается скрытой от посторонних.
Снова запустите службу Wireguard.
$ sudo systemctl start
Шаг 10 - Тест
Давайте проверим, безопасно ли и клиент, и сервер подключены с помощью VPN. Чтобы проверить соединение, выполните следующие команды на своем клиенте.
$ ping -c 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=44.2 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=45.8 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=46.7 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=44.1 ms
--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2800ms
rtt min/avg/max/mdev = 41.729/47.829/48.953/5.046 ms
$ sudo wg
interface: wg0
public key: dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
private key: (hidden)
listening port:
peer: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
endpoint: 203.1.114.98:37822
allowed ips: 192.168.10.0/24
latest handshake: 1 minute, 40 seconds ago
transfer: 938 B received, 45.67 KiB sent
persistent: keepalive: every 15 seconds
Заключение
Это все, что есть в этом уроке. Теперь у вас должен быть VPN-сервер на основе Wireguard, основанный на сервере CentOS 8. Если у вас есть вопросы, задавайте их в комментариях ниже.