WireGuard — коммуникационный протокол и бесплатное программное обеспечение с открытым исходным кодом, который реализует зашифрованные виртуальные частные сети. Данная технология лучше всего подходит для корпоративного удаленного доступа или удаленного мониторинга серверов филиалов, например.
Использование технологии VPN для получения доступа к запрещенному контенту или сайтам преследуется по закону! Призываю Вас соблюдать определенный комплаенс исходя из современной ситуации. Выполняйте требования контролирующих органов и соблюдайте закон.
Установку производим на Debian 12.
Обновим пакеты на сервере:
apt update && apt upgrade -y
Устанавим сам Wireguard
apt install wireguard
Сгеренерируем пару ключей для сервера (приватный и публичный):
wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey
Создадим начальную конфигурацию сервера. Можно иметь несклько работающих конфигураций Wireguard на разных виртуальных интерфейсах. Их название, и название сервиса и будет зависеть от названия файла конфигурации. Получается, если файл называется wg0.conf то и служба будет называться wg-quick@wg0.servuce, а сетевой интерфейс wg0
Итак, настроим минимальную конфигурацию:
nano /etc/wireguard/wg0.conf
Содержимое файла:
[Interface]
PrivateKey = <SERVER-PRIVATE-KEY>
Address = 10.0.0.1/24
ListenPort = 51830
Где:
PrivateKey приватный ключ сервера, мы генерировали его в самом начале.
Address адрес самого сервера внутри тонеля.
ListenPort порт, на котором слушает служба Wireguard (можно сменить на свой, работает кстати, по UDP)
В интернете я встречал инструкции, где в этот файл добавляются настройки iptables. Для меня это неудобно, я применяю настройки iptables через специальный скрипт. Об этом позже.
Необходимо выставить ограничения прав для файла конфигурации и приватного ключа. У меня без этого служба просто не запускалась.
chmod 600 /etc/wireguard/privatekey
chmod 600 /etc/wireguard/wg0.conf
Пробуем запустить сервис и проверить правильность минимальной настройки:
systemctl enable wg-quick@wg0.service
systemctl start wg-quick@wg0.service
systemctl status wg-quick@wg0.service
Для работы клиента тоже требуется пара ключей (приватный и публичный):
wg genkey | tee /etc/wireguard/client_privatekey | wg pubkey | tee /etc/wireguard/client_publickey
Конечно, имена файлов ключей могут быть другими и соответствовать именам абонентов.
Необходимо добавить клиента в конфигурационный файл сервиса:
nano /etc/wireguard/wg0.conf
Создаем раздел [Peer], куда доавляем настройки клиента:
[Peer]
PublicKey = <CLIENT-PUBLIC-KEY>
AllowedIPs = 10.0.0.2/32
Где:
PublicKey публичный ключ клиента
AllowedIPs IP-адрес, который клиент получит внутри тонеля.
Перезапускаем службу:
systemctl restart wg-quick@wg0
systemctl status wg-quick@wg0
Наконец, на клиенте создаем файл конфигурации:
[Interface]
PrivateKey = <CLIENT-PRIVATE-KEY>
Address = 10.0.0.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = <SERVER-PUBLIC-KEY>
Endpoint = <SERVER-IP>:51830
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 10
Вот тут параметр AllowedIPs будет играть любопытную роль. Если оставить 0.0.0.0/0, то весь трафик клиента будет завернут через Wireguard сервер. Если на сервере не будет настроен форвардинг пакетов в ядре, а так же NAT, то кроме как к самому серверу подключиться внутри тонеля не получится.
Для разрешения форвардинга и нужных правил iptables я использую скрипт:
net.ipv4.ip_forward=1
iptables -t nat -I POSTROUTING 1 -s 10.0.10.0/24 -o eth0 -j MASQUERADE
iptables -I INPUT -i wg0 -j ACCEPT
iptables -I FORWARD -i eth0 -o wg0 -j ACCEPT
iptables -I FORWARD -i wg0 -o eth0 -j ACCEPT
iptables -I INPUT -i eth0 -p udp --dport 51830 -j ACCEPT
Но это уже индивидуальный подход. Настроить форвардинг пакетов можно и в файле /etc/sysctl.conf