NSG - Примеры конфигурации: Корпоративная сеть Wireguard
Оборудование для сетей передачи данных
+7 (495) 727-1959

Корпоративная сеть WireGuard

Построение безопасной корпоративной сети между головным офисом и филиалами на основе туннелей WireGuard. Это самая современная из технологий VPN, вобравшая в себя обширный опыт разработки и использования предыдущих типов — как позитивный, так и негативный. Он превосходит по производительности IPsec и OpenVPN, исключительно проста в настройке, устойчива при работе на ненадёжных каналах связи.

В качестве центрального шлюза используется устройство NSG–2040, в филиале — NSG–1750. К головному офису могут также подключаться одиночные пользователи с ПК или мобильных устройств (клиенты для ОС Linux входят в состав всех основных дистрибутивов, для остальных систем доступны на сайте разработчика и в соответствующих магазинах приложений). Требуется, чтобы любой хост (в офисе, в филиале или удалённый сотрудник) был доступен для любого другого.

Корпоративная сеть WireGuard

Конфигурация сервера:

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."