Построение безопасной корпоративной сети между головным офисом и филиалами на основе туннелей WireGuard. Это самая современная из технологий VPN, вобравшая в себя обширный опыт разработки и использования предыдущих типов — как позитивный, так и негативный. Он превосходит по производительности IPsec и OpenVPN, исключительно проста в настройке, устойчива при работе на ненадёжных каналах связи.
В качестве центрального шлюза используется устройство NSG–2040, в филиале — NSG–1750. К головному офису могут также подключаться одиночные пользователи с ПК или мобильных устройств (клиенты для ОС Linux входят в состав всех основных дистрибутивов, для остальных систем доступны на сайте разработчика и в соответствующих магазинах приложений). Требуется, чтобы любой хост (в офисе, в филиале или удалённый сотрудник) был доступен для любого другого.
Конфигурация сервера:
ip : route : : 1 : : : gateway = "123.45.67.90" : : : network = "0.0.0.0/0" : : 2 : : : device = "wg1" : : : network = "172.16.1.0/24" : : 3 : : : device = "wg1" : : : network = "172.16.2.0/24" port : eth0 : : ifAddress : : : prefix = "123.45.67.89/30" : eth1 : : ifAddress : : : prefix = "172.16.0.1/24" tunnel : wireguard : : wg1 : : : ifAddress : : : : prefix = "172.16.2.1/24" : : : interface : : : : listen-port = 51901 : : : : private-key = "закрытый_ключ_сервера" : : : peer : : : : 1 : : : : : allowed-ips : : : : : : 1 = "172.16.2.2/32" : : : : : : 2 = "172.16.1.0/24" : : : : : public-key = "открытый_ключ_клиента_в_филиале" : : : : 2 : : : : : allowed-ips : : : : : : 1 = "172.16.2.3/32" : : : : : public-key = "открытый_ключ_удалённого_пользователя" .....................
Конфигурация клиента в филиале:
ip : route : : 1 : : : device = "wg1" : : : network = "172.16.0.0/24" : : 2 : : : device = "wg1" : : : network = "172.16.2.0/24" port : eth0 : : ifAddress : : : configurable = "dhcp" : eth1 : : ifAddress : : : prefix = "172.16.1.1/24" tunnel : wireguard : : wg1 : : : ifAddress : : : : prefix = "172.16.2.2/32" : : : interface : : : : private-key = "закрытый_ключ_клиента" : : : peer : : : : 1 : : : : : allowed-ips : : : : : : 1 = "172.16.0.0/24" : : : : : : 2 = "172.16.2.0/24" : : : : : endpoint = "123.45.67.89:51901" : : : : : persistent-keeplive = 25 : : : : : public-key = "открытый_ключ_сервера"
Конфигурационный файл для одиночного удалённого пользователя (указанного выше в конфигурации сервера). Формат файла одинаков для всех систем и пригоден для импорта в любые клиенты WireGuard. В некоторых системах могут использоваться дополнительные необязательные настройки, такие как DNS.
[Interface] Address = 172.16.2.3/32 PrivateKey = закрытый_ключ_пользователя [Peer] PublicKey = открытый_ключ_сервера AllowedIPs = 172.16.0.0/22 Endpoint = 123.45.67.89:51901 PersistentKeepalive = 25
ВНИМАНИЕ! Переносить конфигурационный файл на машину пользователя необходимо безопасным способом (например, при личной явке в офис), поскольку в нём содержится закрытый ключ пользователя.
Дополнительные замечания:
Пример скрипта для автоматизации добавления новых удалённых пользователей. Исполняется на сервере под root. Скрипт добавляет пользователя в конфигурацию сервера и генерирует конфигурационный файл для пользователя. Единственный аргумент скрипта — имя пользователя, используемое для административных целей. Предполагается, что число пользователей не более 252. Файл ПОЛЬЗОВАТЕЛЬ.conf необходимо передать ему и импортировать в клиента WireGuard на его устройстве.
!#/bin/bash #Постоянные значения PUBLIC_ADDRESS="123.45.67.89" PUBLIC_PORT="51901" SRV_PUB_KEY=$(nsgsh -qr tunnel.wireguard.wg1.interface.public-key._print) TUNNEL_NET=172.16.2 CLIENT_ALLOWED_IPS="172.16.0.0/22" nsgsh -qr "tunnel.wireguard.wg1.peer._print" > /tmp/peers # подсчёт числа существующих клиентов N=$(cat /tmp/peers | grep ^[1-9] | wc -l) N=$((N+1)) # поиск свободного адреса IP="3" until [[ -z $(grep "$TUNNEL_NET.$IP" /tmp/peers) ]]; do if [[ $IP = "255" ]]; then echo "Адреса кончились! Используйте другую подсеть..." exit fi IP=$((IP+1)) done rm /tmp/peers # имя клиента if [[ -n $1 ]]; then CLIENT=$1 else read -p "Имя нового клиента: " CLIENT fi # генерация ключей для клиента wg genkey | tee /tmp/wgprivate.key | wg pubkey > /tmp/wgpublic.key # генерация файла для клиента echo "[Interface]" > /tmp/wireguard.conf echo "Address = $TUNNEL_NET.$IP/32" >> /tmp/wireguard.conf echo "PrivateKey = $(cat /tmp/wgprivate.key)" >> /tmp/wireguard.conf echo -e "\n[Peer]" >> /tmp/wireguard.conf echo "PublicKey = $SRV_PUB_KEY" >> /tmp/wireguard.conf echo "AllowedIPs = $CLIENT_ALLOWED_IPS" >> /tmp/wireguard.conf echo "Endpoint = $PUBLIC_ADDRESS:$PUBLIC_PORT" >> /tmp/wireguard.conf echo "PersistentKeepalive = 25" >> /tmp/wireguard.conf mv /tmp/wireguard.conf /root/$CLIENT.conf # генерация настроек для сервера CMD="peer.+$N" CMD="$CMD peer.$N.description='$CLIENT'" CMD="$CMD peer.$N.public-key='$(cat /tmp/wgpublic.key)'" CMD="$CMD peer.$N.allowed-ips.+1" CMD="$CMD peer.$N.allowed-ips.1='$TUNNEL_NET.$IP'" nsgsh -qf30 "tunnel.wireguard.wg1($CMD _apply) _write" rm /tmp/wg*.key echo "Добавлена конфигурация tunnel.wireguard.wg1.peer.$N :" nsgsh -qr "tunnel.wireguard.wg1.peer.$N._print" echo -e "\n" echo "Передайте файл wg_clients/$CLIENT.conf пользователю" echo "*** БЕЗОПАСНЫМ СПОСОБОМ ***" echo "и импортируйте его в Wireguad for Windows, Android, etc."