О проекте
Грамотная сегментация беспроводной сети — базовое требование сетевой безопасности. Нельзя допускать смешивания трафика сотрудников и гостей предприятия. Идеальное решение — создание изолированных VLAN с собственными правилами авторизации.
В качестве шлюза и контроллера доступа в моих проектах часто выступает pfSense. Его встроенный функционал Captive Portal позволяет гибко управлять доступом как для доменных пользователей, так и для временных посетителей.
1. Корпоративный SSID (VLAN + Доменная авторизация)
Для сотрудников создается отдельная сеть (например, VLAN 10), которая имеет доступ к внутренним ресурсам компании. Чтобы избежать утечки паролей от Wi-Fi (WPA2-PSK), авторизация настраивается индивидуально для каждого сотрудника через Active Directory.
Краткий алгоритм настройки:
- Интеграция с AD: В меню
System > User Manager > Authentication Serversдобавляется LDAP/RADIUS сервер (контроллер домена Windows Server). - Настройка Captive Portal: В разделе
Services > Captive Portalсоздается зона (Zone) и привязывается к интерфейсу корпоративного VLAN. - Метод аутентификации: В настройках портала выбирается
Authentication Method: RADIUS Authentication(или LDAP).
Теперь при подключении к корпоративному Wi-Fi сотрудник будет перенаправлен на страницу авторизации, где он введет свои стандартные доменные учетные данные. При увольнении сотрудника и блокировке его учетной записи в AD доступ к Wi-Fi отключается автоматически.
2. Гостевой SSID (VLAN + Система ваучеров)
Для клиентов и подрядчиков создается строго изолированная гостевая сеть (например, VLAN 20), имеющая доступ только в интернет. Чтобы ограничить время пребывания гостей в сети и вести учет подключений, используется система одноразовых ваучеров.
Краткий алгоритм настройки:
- Изоляция: В
Firewall > Rulesдля гостевого VLAN разрешается выход только в WAN, доступ к локальным подсетям блокируется (Block RFC1918). - Активация ваучеров: В настройках зоны Captive Portal (для гостевого VLAN) включается опция
Enable Vouchers. - Генерация: Вкладка
Vouchersпозволяет создать “рулон” (Roll) кодов. Я генерирую список 6-значных кодов с лимитом времени, например, 24 часа с момента активации. - Выдача: Файл с ваучерами (в формате CSV) распечатывается и передается на стойку регистрации (ресепшн).
🎨 Кастомизация страницы портала (Custom Portal Page)
Стандартная страница авторизации pfSense выглядит устаревшей. Для гостевой сети я разрабатываю кастомный дизайн с логотипом компании и скриптом перехвата ошибок.
Вот пример чистого и современного HTML-кода для загрузки в pfSense (раздел Portal page contents):
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Гостевой Wi-Fi</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f4f9; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }
.login-box { background: #fff; padding: 40px 30px; border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
h2 { color: #333; margin-top: 0; margin-bottom: 25px; }
.error-msg { color: #dc3545; font-weight: bold; margin-bottom: 15px; min-height: 20px; }
input[type="text"] { width: 100%; padding: 12px; margin-bottom: 20px; border: 1px solid #ccc; border-radius: 6px; box-sizing: border-box; font-size: 16px; text-align: center; letter-spacing: 2px; }
input[type="submit"] { width: 100%; padding: 14px; background-color: #007bff; color: white; border: none; border-radius: 6px; font-size: 16px; font-weight: bold; cursor: pointer; transition: background 0.3s; }
input[type="submit"]:hover { background-color: #0056b3; }
.help-text { font-size: 13px; color: #777; margin-top: 15px; }
</style>
</head>
<body>
<div class="login-box">
<!-- Company Logo -->
<img src="captiveportal-logo.png" alt="Логотип" style="max-width: 150px; height: auto; margin-bottom: 15px;">
<h2>Гостевой доступ</h2>
<!-- Error message placeholder -->
<div class="error-msg" id="portal-error">$PORTAL_MESSAGE$</div>
<script>
// The script intercepts the pfSense system error, removes duplicates, and translates the text
var errorDiv = document.getElementById('portal-error');
var errorText = errorDiv.innerText.toLowerCase();
if (errorText.includes('voucher invalid')) {
errorDiv.innerText = 'Неверный или просроченный код ваучера.';
} else if (errorText.trim() !== '') {
errorDiv.innerText = 'Ошибка подключения. Проверьте код.';
}
</script>
<!-- Mandatory pfSense form -->
<form method="post" action="$PORTAL_ACTION$">
<!-- Hidden field to redirect the user back to their originally requested URL -->
<input name="redirurl" type="hidden" value="$PORTAL_REDIRURL$">
<!-- Voucher input field (must be named auth_voucher) -->
<input name="auth_voucher" type="text" placeholder="Код ваучера" required autocomplete="off">
<!-- Submit button (must be name="accept") -->
<input name="accept" type="submit" value="Подключиться">
</form>
<div class="help-text">Получите код ваучера на стойке регистрации (ресепшн).</div>
</div>
</body>
</html>
Выводы
Использование pfSense Captive Portal позволяет решить сразу несколько задач бизнеса. Корпоративная сеть становится безопаснее благодаря привязке к Active Directory — отпадает необходимость менять общий Wi-Fi пароль после увольнения сотрудников. Гостевая сеть, работающая по системе ваучеров, защищает компанию от неконтролируемого использования интернет-канала соседями или прохожими, а брендированная страница авторизации повышает престиж компании в глазах посетителей.