Задача клиента: вся студия за одним 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
По итогам аудита сформировали список требований к новому сетевому решению:
- Полноценный stateful firewall с гранулярными правилами
- Сегментация сети через VLAN: рабочие станции, серверы, гостевой Wi-Fi — каждый в своём загоне
- VPN для удалённых сотрудников — никакого прямого доступа извне
- IDS/IPS для обнаружения атак в реальном времени
- DNS-фильтрация и ad-blocking
- Traffic shaping с приоритетом для VoIP — звонки не должны прерываться
- Высокая доступность (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 |
| Открытые порты в WAN | 5 (UPnP) | 0 (только VPN) |
| IDS/IPS | Отсутствует | Suricata, 45 000+ правил |
| DNS-фильтрация | Отсутствует | pfBlockerNG, 1.2 млн доменов |
| VPN для удалёнщиков | Проброс порта NAS | OpenVPN + WireGuard |
| Отказоустойчивость | Нет (single point of failure) | CARP active/passive, failover 2 сек |
| Заблокировано атак (за 3 мес.) | Неизвестно | 12 400+ (Suricata) |
| Заблокировано вредоносных DNS | 0 | 847 000 запросов/мес |
За 3 месяца работы pfSense — ноль инцидентов безопасности. Suricata за это время заблокировала больше 12 000 подозрительных подключений на WAN. pfBlockerNG ежемесячно отрезает 847 000 DNS-запросов к вредоносным и рекламным доменам. Удалённые дизайнеры, если честно, сами удивились: WireGuard работает заметно шустрее, чем старое прямое подключение к NAS.