Для тех, кто не ламер, но впервые настраивает — и хочет, чтобы всё работало с первого раза. Ну или переборщил с пифком ))
tun_wg0).| Поле | Значение | Пример |
|---|---|---|
| Description | Имя туннеля | SERVER_WIREGUARD |
| Private Key | Автогенерируется (или вставь свой) | — |
| Public Key | Автоматически | — |
| Listen Port | Порт, на котором сервер ждёт подключений | 51821 |
| Address | IP сервера в туннеле | 172.16.99.1/24 |
172.16.99.203/24 — сервер должен быть 172.16.99.1/24.
| Поле | Значение | Пример |
|---|---|---|
| Description | Имя клиента | mob_rom |
| Public Key | Публичный ключ клиента | — |
| Tunnel | Выбери созданный туннель | SERVER_WIREGUARD |
| Allowed IPs | IP клиента в туннеле (не сеть!) | 172.16.99.203/32 |
| Endpoint | Оставь пустым или Dynamic (если клиент за NAT) | — |
Allowed IPs сети вроде 11.11.34.0/24 — это неправильно.| Поле | Значение |
|---|---|
| Action | Pass |
| Protocol | Any |
| Source | Сеть клиента (например, 172.16.99.0/24) |
| Destination | Любая сеть, которую клиент должен видеть (например, 11.11.34.0/24) |
| Description | Allow client to access WG networks |
| Поле | Значение |
|---|---|
| Protocol | UDP |
| Destination Port | 51821 |
| Description | Allow WireGuard Clients |
[Interface] PrivateKey = <ваш_приватный_ключ_клиента> Address = 172.16.99.203/24 DNS = 1.1.1.1 [Peer] PublicKey = <публичный_ключ_сервера> Endpoint = 189.128.244.45:51821 AllowedIPs = 172.16.99.0/24, 11.11.34.0/24 PersistentKeepalive = 25
11.11.34.0/24 — не на сервере в пире!
WIREGUARD_TO_OFFICE192.168.200.1/2451820| Поле | Значение |
|---|---|
| Public Key | Ключ офисного роутера |
| Allowed IPs | IP офисного роутера в туннеле, например 192.168.200.2/32 |
| Endpoint | 77.37.134.141:51820 (публичный IP офиса) |
[Interface] PrivateKey = <ключ_офиса> Address = 192.168.200.2/24 ListenPort = 51820 [Peer] PublicKey = <ключ_сервера> AllowedIPs = 192.168.0.0/16 Endpoint = 189.128.244.45:51820 PersistentKeepalive = 25
Latest Handshake и Endpoint.ping 172.16.99.1 → должен отвечать.11.11.34.1 (если есть доступ и фаервол разрешает).| Ошибка | Решение |
|---|---|
| Нет handshake | Проверь порт, Endpoint, ключи, фаервол |
| Handshake есть, но нет пинга | Проверь правила фаервола на интерфейсе туннеля |
| Клиент не видит сеть | Проверь AllowedIPs на клиенте — там должны быть нужные сети |
| Офисный роутер не подключается | Открой порт 51820, проверь конфиг, добавь PersistentKeepalive |
В пире на сервере указал сеть (172.16.99.0/24), а не IP клиента (172.16.99.203/32)
|
Исправь на /32 с конкретным IP клиента.В pfSense в Peer → Allowed IPs должно быть только IP клиента, например: 172.16.99.203/32.Сети вроде 11.11.34.0/24 указываются на клиенте, в его AllowedIPs.
|
При подключении 10, 50 или 100+ клиентов ручная генерация ключей на каждом устройстве становится неэффективной. Ниже — профессиональный подход: генерация на сервере, шифрование, безопасная раздача и автоматизация. Это не нарушение безопасности — это масштабирование с контролем.
#!/bin/bash
CLIENTS=100
OUTPUT_DIR="./wg_clients"
mkdir -p $OUTPUT_DIR
# Очистим предыдущие данные (если нужно)
> $OUTPUT_DIR/server-public-keys.txt
for i in $(seq 1 $CLIENTS); do
CLIENT_NAME="client_$i"
PRIV_KEY=$(wg genkey)
PUB_KEY=$(echo $PRIV_KEY | wg pubkey)
PASSWD=$(openssl rand -base64 12 | tr -d /=+ | cut -c1-12)
# Сохраняем публичный ключ для pfSense
echo "[$CLIENT_NAME]" >> $OUTPUT_DIR/server-public-keys.txt
echo "PublicKey = $PUB_KEY" >> $OUTPUT_DIR/server-public-keys.txt
echo "AllowedIPs = 172.16.99.$((i+100))/32" >> $OUTPUT_DIR/server-public-keys.txt
echo "" >> $OUTPUT_DIR/server-public-keys.txt
# Шифруем приватный ключ
echo "$PRIV_KEY" | openssl enc -aes-256-cbc -pbkdf2 -pass pass:"$PASSWD" -out "$OUTPUT_DIR/$CLIENT_NAME.key.enc"
# Генерируем файл с паролем и инструкцией для клиента
{
echo "=== WireGuard Ключ для $CLIENT_NAME ==="
echo "Пароль для расшифровки: $PASSWD"
echo ""
echo "Инструкция:"
echo "1. Скачайте файл: $CLIENT_NAME.key.enc"
echo "2. Расшифруйте ключ командой:"
echo " openssl enc -d -aes-256-cbc -pbkdf2 -in $CLIENT_NAME.key.enc -out private.key -pass pass:$PASSWD"
echo "3. Скопируйте содержимое private.key в поле PrivateKey конфига клиента."
echo ""
echo "[Interface]"
echo "PrivateKey = <вставьте_сюда_расшифрованный_ключ>"
echo "Address = 172.16.99.$((i+100))/24"
echo "DNS = 1.1.1.1"
echo ""
echo "[Peer]"
echo "PublicKey = <публичный_ключ_сервера>"
echo "Endpoint = 189.128.244.45:51821"
echo "AllowedIPs = 172.16.99.0/24, 11.11.34.0/24"
echo "PersistentKeepalive = 25"
} > "$OUTPUT_DIR/$CLIENT_NAME.config-instructions.txt"
done
echo "✅ Готово. Конфиги, ключи и инструкции сохранены в $OUTPUT_DIR"
server-public-keys.txt — готовый список пиров для вставки в pfSense → Peers.client_X.key.enc — зашифрованный приватный ключ.client_X.config-instructions.txt — пароль + готовый конфиг клиента для копирования..key.enc — отправляется по email / через портал / облако.Открой: VPN → WireGuard → Peers → Add
Для каждого клиента вставь данные из server-public-keys.txt:
Description: client_1 Public Key: zXaBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890= Tunnel: SERVER_WIREGUARD Allowed IPs: 172.16.99.101/32 Endpoint: (оставить пустым, если клиент за NAT)
→ Повторить для всех 100. Можно автоматизировать через pfSense API (если доступно).
172.16.99.203/32.AllowedIPs.
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
на клиенте WG укзать адрес интерфейса ВГ с маской 24, в пире allowip укзать подсеть WG сервера с маской24 и всю подсеть шлюзов ВГ с маской 24 как то так