Категории

WireGuard в pfSense — Полное руководство

2025-09-22 12:55:15 | Linux
Настройка конфигов WireGuard в pfSense

Для тех, кто не ламер, но впервые настраивает — и хочет, чтобы всё работало с первого раза. Ну или переборщил с пифком ))


📌 Основные понятия

❗ Важно: В pfSense нет поля "Allowed IPs" в настройках интерфейса. Всё управляется через Peer Configuration.

🔧 Настройка сервера (pfSense)

1. Создание туннеля (Interface)

ПолеЗначениеПример
DescriptionИмя туннеляSERVER_WIREGUARD
Private KeyАвтогенерируется (или вставь свой)
Public KeyАвтоматически
Listen PortПорт, на котором сервер ждёт подключений51821
AddressIP сервера в туннеле172.16.99.1/24
IP-адрес должен быть из той же подсети, что и клиент.
Например, если клиент будет 172.16.99.203/24 — сервер должен быть 172.16.99.1/24.

2. Настройка пира (клиента)

ПолеЗначениеПример
DescriptionИмя клиентаmob_rom
Public KeyПубличный ключ клиента
TunnelВыбери созданный туннельSERVER_WIREGUARD
Allowed IPsIP клиента в туннеле (не сеть!)172.16.99.203/32
EndpointОставь пустым или Dynamic (если клиент за NAT)
⚠️ Ошибка новичков: Писать в Allowed IPs сети вроде 11.11.34.0/24 — это неправильно.
Allowed IPs в пире — это IP клиента, а не сети, которые он должен видеть!

3. Разрешение сетей (через фаервол)

ПолеЗначение
ActionPass
ProtocolAny
SourceСеть клиента (например, 172.16.99.0/24)
DestinationЛюбая сеть, которую клиент должен видеть (например, 11.11.34.0/24)
DescriptionAllow client to access WG networks

4. Открытие порта на WAN

ПолеЗначение
ProtocolUDP
Destination Port51821
DescriptionAllow 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 — не на сервере в пире!

🌐 Настройка исходящего туннеля (офисный роутер)

Пир (офисный роутер)

ПолеЗначение
Public KeyКлюч офисного роутера
Allowed IPsIP офисного роутера в туннеле, например 192.168.200.2/32
Endpoint77.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 на этом порту
  • Совпадают ли ключи

✅ Проверка работоспособности

  1. Подключи клиента.
  2. Зайди: Status → WireGuard — должен быть Latest Handshake и Endpoint.
  3. Зайди: Status → Routes — должен быть маршрут к IP клиента через туннель.
  4. С клиента: ping 172.16.99.1 → должен отвечать.
  5. Если нужно — пингуй 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

⚙️ Автоматизированный скрипт: генерация 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"

📥 Что получает админ после запуска скрипта:

📤 Как раздавать клиентам безопасно:

  1. Файл .key.enc — отправляется по email / через портал / облако.
  2. Пароль — передаётся отдельно: SMS, Telegram, звонок, QR-код на встрече.
  3. Инструкция — прикладывается к письму или доступна в личном кабинете.

🔐 Безопасность: что делать после раздачи

💡 Интеграция с 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 (если доступно).

📌 Заключение

Комментарии

Джон Конор 22.09.2025 13:55
я просто в маске ошибся в пире на сервере, там надо аллоу айпи шлюз вейгарда клиента не 24 а 32 маску и н подсеть а конкретно айпи клиента
Джон Конор 24.09.2025 16:17
короч на сервере надо указать allow ip шлюз клиента WG с маской 32 и подсеть роутера клиента с маской 24
на клиенте WG укзать адрес интерфейса ВГ с маской 24, в пире allowip укзать подсеть WG сервера с маской24 и всю подсеть шлюзов ВГ с маской 24 как то так
Джон Конор 25.09.2025 09:52
а ну еще в файрволе на роутере клиента нужно разрешить весь трафик протокол IP на интерфейсе вейгарда, ато внутренняя сеть роутера не будет доступна

Оставить комментарий

← Назад к списку статей

Важно: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.

Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион