Для тех, кто не ламер, но впервые настраивает — и хочет, чтобы всё работало с первого раза. Ну или переборщил с пифком ))
📌 Основные понятия
- Туннель (Interface) — виртуальный сетевой интерфейс (например,
tun_wg0). - Пир (Peer) — клиент или сервер, с которым вы соединяетесь.
- AllowedIPs — сети, которые разрешено отправлять через туннель.
- Endpoint — IP:порт, куда подключаться (для клиентов — сервер, для сервера — клиент, если он за NAT).
❗ Важно: В pfSense нет поля "Allowed IPs" в настройках интерфейса. Всё управляется через Peer Configuration.
🔧 Настройка сервера (pfSense)
1. Создание туннеля (Interface)
- Зайди: VPN → WireGuard → Local
- Нажми Add
- Заполни:
| Поле | Значение | Пример |
|---|---|---|
| Description | Имя туннеля | SERVER_WIREGUARD |
| Private Key | Автогенерируется (или вставь свой) | — |
| Public Key | Автоматически | — |
| Listen Port | Порт, на котором сервер ждёт подключений | 51821 |
| Address | IP сервера в туннеле | 172.16.99.1/24 |
IP-адрес должен быть из той же подсети, что и клиент.
Например, если клиент будет
Например, если клиент будет
172.16.99.203/24 — сервер должен быть 172.16.99.1/24.
2. Настройка пира (клиента)
- Зайди: VPN → WireGuard → Peers
- Нажми Add
- Заполни:
| Поле | Значение | Пример |
|---|---|---|
| Description | Имя клиента | mob_rom |
| Public Key | Публичный ключ клиента | — |
| Tunnel | Выбери созданный туннель | SERVER_WIREGUARD |
| Allowed IPs | IP клиента в туннеле (не сеть!) | 172.16.99.203/32 |
| Endpoint | Оставь пустым или Dynamic (если клиент за NAT) | — |
⚠️ Ошибка новичков: Писать в
Allowed IPs в пире — это IP клиента, а не сети, которые он должен видеть!
Allowed IPs сети вроде 11.11.34.0/24 — это неправильно.Allowed IPs в пире — это IP клиента, а не сети, которые он должен видеть!
3. Разрешение сетей (через фаервол)
- Зайди: Firewall → Rules → [имя туннеля]
- Добавь правило:
| Поле | Значение |
|---|---|
| Action | Pass |
| Protocol | Any |
| Source | Сеть клиента (например, 172.16.99.0/24) |
| Destination | Любая сеть, которую клиент должен видеть (например, 11.11.34.0/24) |
| Description | Allow client to access WG networks |
4. Открытие порта на WAN
- Зайди: Firewall → Rules → WAN
- Добавь правило:
| Поле | Значение |
|---|---|
| Protocol | UDP |
| Destination Port | 51821 |
| Description | Allow WireGuard Clients |
Если сервер в облаке — не забудь открыть порт в Security Group / ACL у провайдера!
📱 Настройка клиента (мобильный / ПК)
[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
✅ AllowedIPs на клиенте — это сети, которые он хочет видеть.
Именно здесь ты указываешь
Именно здесь ты указываешь
11.11.34.0/24 — не на сервере в пире!
🌐 Настройка исходящего туннеля (офисный роутер)
- Создаёшь новый туннель, например,
WIREGUARD_TO_OFFICE - IP сервера: например,
192.168.200.1/24 - Порт:
51820
Пир (офисный роутер)
| Поле | Значение |
|---|---|
| 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
⚠️ Проверь:
- Открыт ли порт 51820 на офисном роутере (фаервол + NAT)
- Слушает ли WireGuard на этом порту
- Совпадают ли ключи
✅ Проверка работоспособности
- Подключи клиента.
- Зайди: Status → WireGuard — должен быть
Latest HandshakeиEndpoint. - Зайди: Status → Routes — должен быть маршрут к IP клиента через туннель.
- С клиента:
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+ клиентов ручная генерация ключей на каждом устройстве становится неэффективной. Ниже — профессиональный подход: генерация на сервере, шифрование, безопасная раздача и автоматизация. Это не нарушение безопасности — это масштабирование с контролем.
📌 Почему это не "ламерство", а best practice для DevOps
- Генерация на клиенте — идеал для 1-5 пользователей.
- Генерация на сервере + шифрование — стандарт для 50+ клиентов, корпоративных развёртываний, BYOD-сред.
- Главное — приватный ключ НИКОГДА не передаётся в открытом виде и шифруется уникальным паролем.
⚙️ Автоматизированный скрипт: генерация 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 / через портал / облако. - Пароль — передаётся отдельно: SMS, Telegram, звонок, QR-код на встрече.
- Инструкция — прикладывается к письму или доступна в личном кабинете.
🔐 Безопасность: что делать после раздачи
- Удалите временные файлы с сервера (или переместите в защищённое хранилище).
- Никогда не храните пароли и зашифрованные ключи в одном месте.
- Если клиент потерял ключ — перевыпустите новую пару, не пытайтесь восстановить старую.
- Регулярно аудитируйте список пиров в pfSense — отзывайте неактивные.
💡 Интеграция с pfSense: как вставить 100 пиров
Открой: 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 (если доступно).
📌 Заключение
- Массовая настройка WireGuard — не повод жертвовать безопасностью. Шифрование приватных ключей, разделение каналов передачи и автоматизация через скрипты — это признак зрелой инфраструктуры. Теперь вы можете подключать 100, 500 или 1000 клиентов за час, не нарушая принципов zero-trust.
- На сервере в пире пиши только IP клиента —
172.16.99.203/32. - Сети, которые клиент должен видеть, указывай на клиенте в
AllowedIPs. - Открывай порты — и на сервере, и на клиенте (если он сервер).
- Не забывай про фаервол — и в pfSense, и в облаке, и на роутере.
Комментарии
на клиенте WG укзать адрес интерфейса ВГ с маской 24, в пире allowip укзать подсеть WG сервера с маской24 и всю подсеть шлюзов ВГ с маской 24 как то так