После взлома через бытовой роутер: pfSense для дизайн-студии

Задача клиента: вся студия за одним TP-Link

В декабре 2025 года нам в АйТи Фреш позвонил директор дизайн-студии «ВектраДизайн» из Краснодара — голос явно взволнованный: «Нас взломали, клиентские макеты утекли, и мы понятия не имеем, как это произошло». Студия с 35 сотрудниками — дизайнерами, аниматорами и разработчиками — работала над проектами крупных брендов. Утечка файлов грозила не просто штрафами, а репутационной катастрофой, после которой клиенты просто уходят.

Картина, которую мы увидели при расследовании, — до боли типичная для небольших компаний. Вся офисная сеть из 35 рабочих станций, NAS-хранилища с проектами, 3 принтеров и IP-телефонии держалась на бытовом роутере TP-Link Archer C80. Один SSID, один пароль на всех, UPnP включён, прошивка двухлетней давности с известными CVE. Атакующий вошёл через уязвимость в веб-интерфейсе роутера — тот торчал в интернет на порту 8080 — и получил доступ ко всей плоской сети сразу.

«Мы дизайнеры, а не айтишники. Поставили роутер, который достали из коробки, и забыли про него на два года. Теперь понимаем цену этой забывчивости» — директор «ВектраДизайн».

Аудит сетевой инфраструктуры

Наш инженер выехал на площадку и провёл полный аудит. Обнаруженное не удивило, но всё равно ужаснуло:

  • Плоская сеть — все устройства в одном сегменте 192.168.0.0/24, ни одного VLAN
  • Wi-Fi — один SSID с паролем, который знали все сотрудники, включая уволившихся
  • UPnP — включён, сам пробрасывал порты из LAN прямо в WAN
  • NAS Synology — открыт для всей сети, SMB без аутентификации на части шар
  • Нет IDS/IPS — трафик вообще никто не анализировал
  • Нет VPN — удалённые дизайнеры ломились к NAS через проброшенный порт напрямую
  • DNS — провайдерский, без какой-либо фильтрации
# Сканируем сеть для инвентаризации
nmap -sn 192.168.0.0/24 -oG - | grep "Up" | wc -l
# 58 устройств (35 рабочих + личные телефоны + IoT)

# Проверяем проброшенные порты на WAN
nmap -sS -p 1-65535 85.xx.xx.xx
# PORT      STATE SERVICE
# 80/tcp    open  http          ← веб-интерфейс роутера!
# 443/tcp   open  https
# 5000/tcp  open  upnp          ← Synology DSM
# 8080/tcp  open  http-proxy    ← роутер admin
# 32400/tcp open  plex          ← кто-то поставил Plex

# Пять открытых портов в интернет через UPnP — катастрофа

Выбор решения: pfSense

По итогам аудита сформировали список требований к новому сетевому решению:

  1. Полноценный stateful firewall с гранулярными правилами
  2. Сегментация сети через VLAN: рабочие станции, серверы, гостевой Wi-Fi — каждый в своём загоне
  3. VPN для удалённых сотрудников — никакого прямого доступа извне
  4. IDS/IPS для обнаружения атак в реальном времени
  5. DNS-фильтрация и ad-blocking
  6. Traffic shaping с приоритетом для VoIP — звонки не должны прерываться
  7. Высокая доступность (HA) — офис не может просто «упасть» из-за одного железа

Мы остановились на pfSense CE — open-source решении на базе FreeBSD, которое превращает обычный x86-сервер в полноценный корпоративный UTM-шлюз. В качестве железа взяли Protectli Vault FW4B (Intel Celeron J3160, 8 ГБ RAM, 120 ГБ SSD, 4 порта Intel GbE) — два таких устройства, чтобы собрать HA-кластер.

Установка pfSense и базовая настройка интерфейсов

Установка pfSense — дело 10 минут. Но правильная настройка интерфейсов — это фундамент, на котором держится вся безопасность. Мы разбили сеть на 4 изолированные зоны.

Установка и начальная конфигурация

Скачиваем образ pfSense CE, записываем на USB:

# На рабочей станции Linux
wget https://atxfiles.netgate.com/mirror/downloads/pfSense-CE-2.7.2-RELEASE-amd64.iso.gz
gunzip pfSense-CE-2.7.2-RELEASE-amd64.iso.gz

# Записываем на USB-накопитель
sudo dd if=pfSense-CE-2.7.2-RELEASE-amd64.iso of=/dev/sdb bs=4M status=progress
sync

Загружаемся с USB на Protectli, проходим мастер установки — ZFS mirror здесь не нужен, высокую доступность обеспечивает CARP. После установки настраиваем интерфейсы через консоль:

# Консоль pfSense — назначение интерфейсов
# Option 1: Assign Interfaces

# igb0 (port 1) → WAN  — подключение к провайдеру
# igb1 (port 2) → LAN  — рабочие станции (VLAN 10)
# igb2 (port 3) → OPT1 → переименовываем в DMZ (серверы)
# igb3 (port 4) → OPT2 → переименовываем в MGMT (управление)

# Option 2: Set Interface IP Addresses
# WAN: DHCP от провайдера (или static, если выдан)
# LAN: 10.10.10.1/24
# DMZ: 10.10.20.1/24
# MGMT: 10.10.30.1/24

Настройка VLAN для сегментации

На LAN-интерфейсе поднимаем VLAN для разделения трафика внутри офиса. Managed-свитч Cisco SG350-28 настроен на trunk-порту к pfSense:

# pfSense Web GUI → Interfaces → VLANs

# VLAN 10 — Рабочие станции дизайнеров
# Parent: igb1 | Tag: 10 | Description: Workstations

# VLAN 20 — VoIP телефоны
# Parent: igb1 | Tag: 20 | Description: VoIP

# VLAN 30 — Гостевой Wi-Fi
# Parent: igb1 | Tag: 30 | Description: Guest WiFi

# VLAN 99 — Native/Management
# Parent: igb1 | Tag: 99 | Description: Network Management

# Назначаем IP-адреса интерфейсам:
# igb1.10 (Workstations): 10.10.10.1/24
# igb1.20 (VoIP):         10.10.20.1/24
# igb1.30 (Guest):        10.10.30.1/24
# igb1.99 (Management):   10.10.99.1/24
# igb2    (DMZ):          10.10.50.1/24

# На Cisco SG350 настраиваем trunk:
# interface gi1
#   switchport mode trunk
#   switchport trunk allowed vlan 10,20,30,99
#   switchport trunk native vlan 99

# Access-порты для рабочих станций:
# interface range gi2-28
#   switchport mode access
#   switchport access vlan 10

Теперь дизайнерские компьютеры в VLAN 10 физически изолированы от серверов в DMZ, VoIP-телефонов в VLAN 20 и гостевого Wi-Fi в VLAN 30. Взломали один сегмент — до остальных не доберёшься автоматически. Именно этого в старой конфигурации и не было.

Правила файрвола и NAT

По умолчанию pfSense блокирует весь трафик между интерфейсами, кроме LAN → WAN. Мы выстроили гранулярные правила для каждого сегмента по принципу least privilege: разрешено только то, без чего конкретная группа устройств реально не может работать.

Firewall Rules по зонам

Правила настраиваются через Firewall → Rules. Логика для каждого интерфейса выглядит так:

# ===== WAN Rules =====
# По умолчанию: BLOCK ALL (implicit deny)
# Разрешаем только ответный трафик (stateful)
# Никаких входящих подключений!

# ===== Workstations (VLAN 10) =====
# Pass | IPv4 | TCP/UDP | VLAN10 net → * | Port 80,443  | HTTP/HTTPS
# Pass | IPv4 | TCP     | VLAN10 net → DMZ net | Port 445 | SMB to NAS
# Pass | IPv4 | TCP     | VLAN10 net → DMZ net | Port 5000 | Synology DSM
# Pass | IPv4 | UDP     | VLAN10 net → * | Port 53 | DNS (через pfSense)
# Pass | IPv4 | ICMP    | VLAN10 net → DMZ net | ICMP | Ping servers
# Block | IPv4 | *      | VLAN10 net → VLAN20 net | * | No VoIP access
# Block | IPv4 | *      | VLAN10 net → VLAN30 net | * | No guest access
# Block | IPv4 | *      | VLAN10 net → MGMT net  | * | No mgmt access

# ===== VoIP (VLAN 20) =====
# Pass | IPv4 | UDP | VLAN20 net → * | Port 5060 | SIP signaling
# Pass | IPv4 | UDP | VLAN20 net → * | Port 10000-20000 | RTP media
# Pass | IPv4 | TCP | VLAN20 net → * | Port 443 | HTTPS (provisioning)
# Block | IPv4 | *  | VLAN20 net → RFC1918 | * | No local access

# ===== Guest WiFi (VLAN 30) =====
# Pass | IPv4 | TCP | VLAN30 net → * | Port 80,443 | Web only
# Pass | IPv4 | UDP | VLAN30 net → * | Port 53 | DNS
# Block | IPv4 | *  | VLAN30 net → RFC1918 | * | No local access!

# ===== DMZ =====
# Pass | IPv4 | TCP | DMZ net → * | Port 80,443 | Updates
# Pass | IPv4 | TCP | DMZ net → * | Port 53 | DNS
# Block | IPv4 | *  | DMZ net → LAN/VLAN nets | * | No reverse access

Главное, что хотелось закрепить: гостевой Wi-Fi и VoIP не имеют доступа к локальным сетям. Гость видит только интернет — и всё. Рабочие станции достают серверы в DMZ, но в сети VoIP и управления им хода нет.

NAT и Port Forwarding

В отличие от хаоса с UPnP, каждый проброс порта теперь явный и задокументированный:

# Firewall → NAT → Outbound
# Mode: Hybrid Outbound NAT
# Автоматические правила для всех LAN → WAN
# + ручное правило для VoIP с static port:

# Interface: WAN
# Source: VLAN20 net (VoIP)
# Destination: *
# Translation: Interface Address | Static Port ✓
# Описание: SIP requires consistent source port

# Firewall → NAT → Port Forward
# НИКАКИХ пробросов портов извне!
# UPnP: System → Advanced → Networking → ОТКЛЮЧЁН

# Вместо проброса портов для удалённого доступа — VPN
# (настраиваем в следующем разделе)

UPnP отключён навсегда. Любой доступ к внутренним ресурсам — исключительно через VPN, никаких других вариантов.

VPN: OpenVPN и WireGuard

У «ВектраДизайн» пятеро удалённых дизайнеров работают из дома. Раньше они подключались к NAS через проброшенный порт 5000 — напрямую, без каких-либо защитных мер. Теперь единственный способ попасть внутрь — VPN.

OpenVPN для удалённых сотрудников

OpenVPN-сервер поднимаем на pfSense через встроенный мастер:

# VPN → OpenVPN → Wizards

# Шаг 1: Certificate Authority
# Descriptive Name: VektraDesign-CA
# Key Length: 4096 bit
# Lifetime: 3650 days

# Шаг 2: Server Certificate
# Descriptive Name: VektraDesign-VPN-Server
# Key Length: 4096 bit

# Шаг 3: Server Setup
# Interface: WAN
# Protocol: UDP on IPv4 only
# Local Port: 1194
# Description: Remote Designers VPN
# Cryptographic Settings:
#   TLS Key: Auto-generate
#   DH Parameter Length: 4096
#   Encryption Algorithm: AES-256-GCM
#   Auth Digest: SHA256

# Tunnel Settings:
# Tunnel Network: 10.10.100.0/24
# Redirect IPv4 Gateway: ✓ (весь трафик через VPN)
# Local Network: 10.10.50.0/24 (DMZ — доступ к NAS)
# Concurrent Connections: 10
# Compression: Omit (no compression — безопаснее)
# DNS Server 1: 10.10.10.1 (pfSense DNS Resolver)

# Шаг 4: Firewall Rules
# ✓ Add rule to allow traffic from clients through VPN
# ✓ Add rule on OpenVPN interface to allow traffic to DMZ

Для каждого удалённого сотрудника создаём отдельную учётную запись — никаких общих ключей:

# System → User Manager → Add User
# Username: designer-ivanova
# Certificate: ✓ Click to create a user certificate
# → Certificate authority: VektraDesign-CA
# → Key Length: 2048

# Экспортируем конфиг:
# VPN → OpenVPN → Client Export
# Remote Access Server: Remote Designers VPN
# Host Name Resolution: Interface IP Address
# Скачиваем .ovpn файл для каждого пользователя

WireGuard для site-to-site и мобильных устройств

Параллельно настраиваем WireGuard — он заметно быстрее OpenVPN и удобнее на мобильных устройствах: подключение через QR-код без возни с конфигами:

# VPN → WireGuard → Tunnels → Add Tunnel
# Description: Mobile Access
# Listen Port: 51820
# Interface Keys: Generate
# Interface Addresses: 10.10.200.1/24

# VPN → WireGuard → Peers → Add Peer
# Description: Иванова — iPhone
# Public Key: (генерируется на устройстве)
# Allowed IPs: 10.10.200.2/32
# Peer WireGuard Address: 10.10.200.2/32

# Конфиг для iPhone (QR-код):
[Interface]
PrivateKey = (генерируется автоматически)
Address = 10.10.200.2/32
DNS = 10.10.10.1

[Peer]
PublicKey = (публичный ключ pfSense)
AllowedIPs = 10.10.50.0/24
Endpoint = 85.xx.xx.xx:51820
PersistentKeepalive = 25

На практике WireGuard работает в 2–3 раза быстрее OpenVPN при передаче файлов. Для дизайнеров, которые тянут PSD-файлы по 500 МБ с NAS, это принципиально важно — каждая минута ожидания раздражает.

Система обнаружения вторжений: Suricata и pfBlockerNG

Файрвол блокирует нежелательные подключения, но содержимое разрешённого трафика он не смотрит. Если зловред уже пролез внутрь по «легальному» каналу — файрвол этого не заметит. Именно поэтому мы установили IDS/IPS: он анализирует, что происходит внутри разрешённых потоков.

Установка и настройка Suricata

Suricata — IDS/IPS-движок, который разбирает трафик по сигнатурам атак. Ставим через штатный менеджер пакетов pfSense:

# System → Package Manager → Available Packages
# Ищем: suricata
# Install: suricata 7.0.3

# Services → Suricata → Global Settings
# Install ETOpen Emerging Threats rules: ✓
# Install Snort GPLv2 Community Rules: ✓
# Install Suricata rules: ✓ (если есть подписка)
# Rules Update Interval: 12 hours
# Remove Blocked Hosts After: 3600 seconds
# Log to System Log: ✓

# Services → Suricata → Interfaces → Add
# Interface: WAN
# Enable: ✓
# Block Offenders: ✓ (IPS-режим — не только обнаружение, но и блокировка)
# IPS Mode: Legacy Mode
# Detection Engine: Pattern matcher — Hyperscan

# Выбираем категории правил:
# ✓ emerging-attack_response
# ✓ emerging-exploit
# ✓ emerging-malware
# ✓ emerging-scan
# ✓ emerging-trojan
# ✓ emerging-web_server
# ✓ emerging-policy (обнаружение TOR, mining)
# ✓ emerging-dos

# Services → Suricata → Interfaces → WAN → WAN Categories
# Включаем нужные наборы правил
# Жмём "Start" на интерфейсе WAN

После этого Suricata смотрит весь входящий трафик на WAN. Сработала сигнатура — IP атакующего улетает в блок автоматически, без нашего участия.

pfBlockerNG: DNS-фильтрация и GeoIP-блокировка

pfBlockerNG — пакет, который фильтрует трафик сразу на двух уровнях: DNS и IP-адреса:

# System → Package Manager → Install: pfBlockerNG-devel

# Firewall → pfBlockerNG → DNSBL
# Enable DNSBL: ✓
# DNSBL Mode: Unbound python mode
# DNSBL Virtual IP: 10.10.1.1

# Списки блокировки DNS:
# ✓ EasyList (реклама)
# ✓ EasyPrivacy (трекеры)
# ✓ Malware Domain List
# ✓ Phishing Database
# ✓ Crypto-Mining Blocklist
# ✓ Steven Black's hosts (unified)

# Firewall → pfBlockerNG → IP → IPv4
# GeoIP Actions:
# Block Inbound: CN, KP, RU-excluded (блокируем входящий из CN, KP)
# Block Outbound: none

# Threat feeds:
# ✓ Spamhaus DROP + EDROP
# ✓ DShield Block List
# ✓ Abuse.ch Feodo Tracker
# ✓ Emerging Threats Compromised IPs

# DNSBL Whitelist (чтобы не сломать работу):
# *.adobe.com
# *.figma.com
# *.behance.net
# *.googleapis.com

DNS-фильтрация отрезает рекламу, трекеры, фишинг и вредоносные домены прямо на уровне DNS-резолвера pfSense — до того, как запрос вообще уйдёт наружу. GeoIP-блокировка закрывает входящие подключения из стран, от которых «ВектраДизайн» не ждёт ни одного легитимного пакета.

Высокая доступность (CARP) и Traffic Shaping

Дизайн-студия — это не банк, но простой в 30 минут реально означает 35 человек, которые сидят без дела. Поэтому мы подняли отказоустойчивый кластер из двух pfSense-устройств и добавили управление полосой пропускания.

CARP-кластер: автоматическое переключение

CARP (Common Address Redundancy Protocol) — протокол, который заставляет два pfSense работать в паре active/passive. Падает primary — трафик уходит на secondary. За 2-3 секунды:

# На PRIMARY pfSense (FW-01):
# System → High Avail. Sync
# Synchronize States: ✓
# Synchronize Interface: MGMT (igb3)
# pfsync Synchronize Peer IP: 10.10.99.2
# Synchronize Config to IP: 10.10.99.2
# Remote System Username: admin
# Remote System Password: ********
# Toggle All: ✓ (синхронизируем все настройки)

# Создаём Virtual IPs (CARP):
# Firewall → Virtual IPs → Add

# WAN VIP:
# Type: CARP | Interface: WAN
# Address: 85.xx.xx.xx/24 (WAN IP от провайдера)
# VHID Group: 1 | Adv. Skew: 0 (primary)
# Password: CarpSecret123

# LAN VIP (Workstations):
# Type: CARP | Interface: VLAN10
# Address: 10.10.10.1/24
# VHID Group: 10 | Adv. Skew: 0

# DMZ VIP:
# Type: CARP | Interface: DMZ
# Address: 10.10.50.1/24
# VHID Group: 50 | Adv. Skew: 0

# На SECONDARY pfSense (FW-02):
# Те же VIP, но Adv. Skew: 100 (secondary — higher skew)
# Все правила, VPN, пакеты синхронизируются автоматически

# Проверяем статус:
# Status → CARP (failover)
# FW-01: MASTER on all VIPs
# FW-02: BACKUP on all VIPs

Отказывает FW-01 — все клиенты автоматически переходят на FW-02. Failback тоже автоматический, вручную ничего переключать не нужно. Мы проверяли вживую: вытаскиваем сетевой кабель из FW-01, пинг пропадает ровно на 2 секунды — и трафик уже идёт через FW-02.

Traffic Shaping: приоритет VoIP и ограничение гостей

100 Мбит/с на 35 сотрудников, VoIP-телефоны и гостевой Wi-Fi — это не так много, как кажется. Один дизайнер заливает тяжёлый проект на одобрение клиенту, и голосовая связь начинает сыпаться. Без QoS это вопрос времени. Решается так:

# Firewall → Traffic Shaper → Wizards
# Wizard Type: Multiple Lan/Wan

# WAN Upload: 95000 Kbit/s (95 Мбит из 100 — оставляем запас)
# WAN Download: 95000 Kbit/s
# Scheduler Type: PRIQ (Priority Queuing)

# Очереди по приоритету:
# Queue 1: qVoIP (Priority 7 — максимальный)
#   Match: Source VLAN20 net
#   Bandwidth: 20% (guaranteed)

# Queue 2: qWorkstations (Priority 5)
#   Match: Source VLAN10 net
#   Bandwidth: 60%

# Queue 3: qDefault (Priority 3)
#   Bandwidth: 15%

# Queue 4: qGuest (Priority 1 — минимальный)
#   Match: Source VLAN30 net
#   Bandwidth: 5%
#   Upper Limit: 10000 Kbit/s (жёсткий лимит 10 Мбит)

# Дополнительно ограничиваем гостей через Limiter:
# Firewall → Traffic Shaper → Limiters → Add
# Name: GuestDown | Bandwidth: 5 Mbit/s
# Name: GuestUp | Bandwidth: 2 Mbit/s
# Mask: Source Address (лимит на каждого гостя)

# Применяем Limiter в правилах VLAN30:
# Pass | VLAN30 → * | Port 80,443
#   Advanced → In/Out pipe: GuestDown / GuestUp

Теперь VoIP получает гарантированную полосу в любой момент — даже когда все 35 дизайнеров одновременно заливают работы на Behance.

Результаты внедрения

Проект занял 5 рабочих дней: 2 дня ушло на аудит и планирование, ещё 2 — на установку и настройку, последний день — тестирование и обучение ответственного сотрудника. Что получили через 3 месяца:

МетрикаДо (TP-Link)После (pfSense)
Сегментация сети1 плоский сегмент5 VLAN + DMZ
Открытые порты в WAN5 (UPnP)0 (только VPN)
IDS/IPSОтсутствуетSuricata, 45 000+ правил
DNS-фильтрацияОтсутствуетpfBlockerNG, 1.2 млн доменов
VPN для удалёнщиковПроброс порта NASOpenVPN + WireGuard
ОтказоустойчивостьНет (single point of failure)CARP active/passive, failover 2 сек
Заблокировано атак (за 3 мес.)Неизвестно12 400+ (Suricata)
Заблокировано вредоносных DNS0847 000 запросов/мес

За 3 месяца работы pfSense — ноль инцидентов безопасности. Suricata за это время заблокировала больше 12 000 подозрительных подключений на WAN. pfBlockerNG ежемесячно отрезает 847 000 DNS-запросов к вредоносным и рекламным доменам. Удалённые дизайнеры, если честно, сами удивились: WireGuard работает заметно шустрее, чем старое прямое подключение к NAS.

Часто задаваемые вопросы

Да, масштабируется хорошо — от небольшого офиса до пары сотен пользователей. Всё упирается в железо. На 50 человек с включёнными IDS/IPS и VPN берите минимум 4-ядерный процессор и 8 ГБ RAM. На 200+ — уже 8 ядер и 16 ГБ. В нашей практике pfSense спокойно тянет офисы до 300 сотрудников с полным стеком: Suricata, pfBlockerNG, OpenVPN, traffic shaping — всё одновременно.

pfSense — open-source, лицензионных платежей нет. Fortinet и Cisco ASA каждый год выставляют счёт за обновления сигнатур, поддержку и лицензии — от $500 до $5 000 в год, а бывает и больше. pfSense даёт сопоставимый функционал бесплатно: stateful firewall, VPN, IDS/IPS через Suricata или Snort, DNS-фильтрация, HA. Есть и минусы — нет единой вендорской поддержки, хотя Netgate продаёт коммерческую, и интерфейс честно проигрывает Fortinet по лоску. Но для малого и среднего бизнеса соотношение возможностей и стоимости у pfSense, на наш взгляд, лучшее на рынке.

Веб-интерфейс у pfSense вполне вменяемый — большинство рутинных задач решается через GUI, без погружения в командную строку. Но первичную настройку: VLAN, IDS/IPS, VPN, HA — лучше доверить инженеру с опытом. Зато потом система практически живёт сама: правила Suricata обновляются автоматически, pfBlockerNG тянет свежие списки по расписанию, CARP переключается без участия человека. «ВектраДизайн» зовёт нас раз в квартал — аудит и обновление pfSense, 2-3 часа работы.

pfSense не умеет управлять Wi-Fi точками напрямую, но в паре с Ubiquiti UniFi, TP-Link Omada или Cisco Meraki работает отлично. В этом проекте мы поставили 4 точки UniFi U6 Pro, контроллер подняли на отдельной VM. Схема простая: pfSense отвечает за маршрутизацию и безопасность VLAN, UniFi — за радио и роуминг между точками. VLAN 10 (рабочий) и VLAN 30 (гостевой) разведены на точках как отдельные SSID.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#pfSense настройка офис#pfSense firewall правила#pfSense VPN OpenVPN WireGuard#pfSense Suricata IDS IPS#pfSense pfBlockerNG#pfSense VLAN DMZ настройка#pfSense CARP отказоустойчивость#pfSense traffic shaping QoS