Построение безопасной корпоративной сети между головным офисом и филиалами на основе туннелей 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."