IP-фільтрація: whitelist, blacklist і real IP для nginx та Apache

Хибні блокування та підмінені адреси ламають доступ до сервісів у найневдаліший момент. Ми налаштовуємо IP whitelisting і blacklist під ключ: розбираємо реальні джерела трафіку та вибудовуємо перевірку на периметрі. Після впровадження кількість помилкових блокувань падає в рази, а доступ до ваших сервісів стає передбачуваним.
Часті запитання

IP whitelisting не працює: підмінені адреси та хибні блокування

Зворотний проксі або балансувальник перед веб-сервером ламає фільтрацію за ip — і це найчастіша причина, через яку IP whitelisting поводиться непередбачувано.

З'єднання до застосунку встановлює посередник, тому в правилах доступу замість клієнта опиняється адреса за проксі: одна й та сама для всіх відвідувачів — адреса шлюзу або балансувальника.

Наслідки симетричні й обидва погані. Білий список або пропускає всіх підряд, бо кожен запит приходить з однієї «довіреної» адреси, або відмовляє кожному — якщо посередника в списку немає.

Чорний список жорсткіший: заблокувавши одну адресу, ви закриваєте доступ цілому пулу клієнтів за цим балансувальником, і хибне блокування клієнта перетворюється на відмову всій площадці.

Другий шар проблеми — довіра до заголовків. Клієнт підставляє заголовок з адресою вручну, і якщо сервер приймає його без перевірки, підмінена ip адреса обходить і білий, і чорний список заодно.

Правило тут одне: заголовкам віримо лише від відомих посередників і розбираємо ланцюжок з кінця — перша адреса належить клієнту лише тоді, коли всі попередні входять до довірених діапазонів мережі.

Тому фільтрація за ip будується не на тому, що видно в сокеті, а на відновленій адресі клієнта.

Далі розбираємо, як це закривається: які діапазони оголосити довіреними, у якому порядку читати ланцюжок за кількох хопів і як перевірити політику так, щоб вона не пускала зайвих і не різала своїх.

Що змінюється після впровадження фільтрації на периметрі

Поки фільтрація живе лише на балансувальнику, реальна адреса клієнта губиться: у журналах усі запити приходять з адреси самого проксі. Правила за джерелом починають працювати наосліп — під відмову потрапляють легітимні користувачі за спільним проксі, а небажаний трафік проходить.

Лікується це на рівні конфігурації: довірені проксі перелічуються явно, заголовок з вихідною адресою приймається лише від них — у nginx це задається директивами модуля realip, в Apache — аналогічним механізмом.

Після налаштування рахуємо три величини, за якими видно, що змінилося на периметрі.

  • Частка хибних спрацювань — запити, відсічені правилом за легітимного джерела. Тримаємо її нижче відсотка й розбираємо кожну подію: правило уточнюється, а не вимикається цілком.
  • Час відновлення доступу — якщо список усе-таки зачепив співробітника або підрядника, адреса повертається за хвилини, без правки конфігурації й перезапуску сервісу.
  • Частка запитів з коректно визначеним джерелом — після налаштування прямує до повної. На цих даних працюють розбір інцидентів, обмеження частоти й точкові блокування.

Ефект тримається, поки списки живі. Лічильники на відмови й на зміни списків дають алерт за сплеску, а раз на тиждень склад переглядається: застарілі адреси підрядників ідуть, тимчасові доступи закриваються. Контроль джерел трафіку стає регламентом, а не разовим налаштуванням.

IP whitelisting: рівні фільтрації трафіку та їхні обмеження

Правило фільтрації можна вмикати на кількох рівнях: на мережевому екрані або балансувальнику, на зворотному проксі, у зовнішньому фільтрувальному шарі й у самому застосунку.

Чим ближче правило стоїть до джерела трафіку, тим дешевше відсікається сміття, але тим менше контексту доступно для рішення: на нижніх рівнях видно лише адресу, а не домен, шлях або обліковий запис.

Зворотний бік — правила на балансувальнику не розрізняють сервіси за однією адресою, тому для різних застосунків часто потрібен свій шар і свій список довірених вузлів.

Рівень Коли підходить Обмеження
Мережевий екран, балансувальник Потрібно відсікти трафік до потрапляння в застосунок Видно лише адресу: немає домену, шляху й методу; один список на всі сервіси
Зворотний проксі (nginx, Apache) Правила залежать від домену або шляху, потрібна реальна адреса клієнта Потребує переліку довірених проксі, інакше адреса в журналі підмінюється
Код застосунку Потрібні роль, права й контекст запиту, облік у журналі аудиту Запит уже пройшов мережу й чергу, правило дублюється в кожному сервісі
Зовнішній фільтрувальний шар Інфраструктура змінюється, потрібен єдиний список довірених вузлів Залежність від зовнішнього контуру й затримка на погодження правил

Рівні не замінюють, а доповнюють одне одного: мережевий відсікає явне сміття, проксі приводить адресу клієнта до реальної, застосунок ухвалює рішення за ролями.

Головне обмеження будь-якої фільтрації — спільна адреса: за одним вузлом може стояти й офіс цілком, і мобільний оператор, тому список довірених вузлів на мережевому рівні не розмежовує користувачів усередині. Ці обмеження приймають усвідомлено, а не обходять.

Порядок впровадження фільтрації: від аудиту трафіку до передачі

Порядок робіт важливіший за інструмент: правило IP whitelisting, увімкнене до інвентаризації джерел, відсікає живих партнерів і внутрішні сервіси. Тому йдемо від карти трафіку до конфігурації й на кожному кроці звіряємо результат з реальними запитами, а не з припущеннями.

  1. Інвентаризація джерел трафіку. Збираємо всі точки входу: зовнішні інтеграції, офісні й хмарні адреси, службові роботи, моніторинг. На виході — список підмереж із позначкою «блокувати», «обмежити за частотою», «не чіпати».

  2. Схема проходження трафіку. Розбираємо ланцюжок до застосунку: де стоїть балансувальник, скільки вузлів проксують запити, з якого заголовка читається адреса клієнта. Без цього фільтр бачить адресу проксі й ріже або всіх, або нікого.

  3. Налаштування правил доступу. Описуємо білий і чорний списки, окремо закриваємо адміністративні розділи. Довірені проксі налаштовуються в зв'язці з правилами — інакше вихідна адреса підмінюється першим же вузлом на шляху.

  4. Прогін у режимі логування. Правила вмикаємо так, що заборонені запити пишуться в журнал, але пропускаються. За кілька діб видно всю картину хибних спрацювань — їх вичищають до інциденту, а не після.

  5. Перевірка на бойовому контурі. Робочий режим вмикаємо спочатку на одному вузлі: звіряємо частку відсічених запитів і доступність сервісів. Відкат — правка одного файлу конфігурації й перезавантаження.

  6. Передача в експлуатацію. Віддаємо схему, конфігурації, порядок додавання нових адрес і розбір типових помилок. Підтримка розуміє, де змінювати список, а не шукає це по журналах у момент блокування.

Що замовник отримує на руки: конфігурації, схеми й регламенти

Ми передаємо роботу не описом «що зробили», а набором артефактів: їх можна перевірити, віддати іншій команді й оновлювати без нашої участі. Нижче — комплект, який залишається у вас після впровадження IP whitelisting на nginx і Apache.

  • Файли конфігурації — готові блоки для обох серверів: правила allow/deny, довірені проксі для відновлення реальної адреси клієнта, порядок застосування директив і точки, куди вставляти нові записи. З коментарями до кожного рядка, щоб правку вніс черговий, а не лише автор схеми.
  • Політика доступу — які контури закриті фільтрацією, кого пускаємо за замовчуванням, що робимо з рештою трафіку й де закінчується зона відповідальності мережі, а починається застосунку.
  • Схема проходження запитів — шлях від клієнта через балансувальник і проксі до застосунку: на якому вузлі видно справжню адресу, де вона підмінюється й як це перевірити однією командою.
  • Списки довірених вузлів — окремо за кожним контуром, з власником запису, датою додавання й позначкою, чи можна її знімати.
  • Інструкція для чергової зміни — сценарії на кожен випадок: додати адресу, зняти блокування, переконатися, що правило застосувалося, і що робити за хибного спрацювання поза робочими годинами.
  • Регламент перегляду правил — періодичність ревізії, хто підтверджує запис, як фіксується причина виключення й коли адреса видаляється автоматично.

Комплект розрахований на те, щоб правила жили без автора: інженер зміни може пояснити, чому конкретна адреса в списку і що буде, якщо її прибрати.

Кейс: як прибрали хибні блокування клієнтів за одну ітерацію

До: правила блокували не тих

Портал клієнта стояв за балансувальником і мережею доставки контенту Cloudflare: на бекенд усі запити приходили з адрес периметра, а не з адрес відвідувачів.

Блокувальні правила спрацьовували на адресу периметра, і під відсічення потрапляла ціла гілка трафіку довіреного клієнта, а не джерело аномалії. Пікові години стабільно давали 6–8% відмов довіреним клієнтам, і кожен такий випадок виглядав як «сайт працює, але не в мене».

Розбір інциденту впирався в журнали: у записах стояла одна й та сама адреса, логи доводилося зіставляти з вивантаженням із панелі мережі доставки, і пошук винуватця займав до 40 хвилин.

Частка запитів з коректною вихідною адресою не перевищувала 12% — статистика з фільтрації була непридатна для рішень.

Що змінили і що стало

Відновили вихідну адресу на обох фронтах: у nginx — модуль real_ip з явним списком довірених підмереж і заголовком X-Forwarded-For, в Apache — модуль RemoteIP з довіреними проксі.

Ланцюжок заголовків валідуємо за довжиною й за довірою до джерела, інакше підставлений вручну X-Forwarded-For обійшов би фільтр.

Порядок правил перевернули на користь білого списку: довірені підмережі й службові адреси периметра перевіряються раніше за блокування, а блокування рознесені за класами — парсери, сканери уразливостей, аномальна частота запитів.

У журнал тепер пишеться вихідна адреса, ланцюжок проксі й ідентифікатор клієнта — інцидент розбирається за одним записом. Відмови довіреним клієнтам припинилися, частка запитів з коректною адресою виросла до 100%, пошук винуватця в журналах скоротився з 40 хвилин до 2–3.

Нові правила перед викатом проганяємо на копії бойових логів у тіньовому режимі — регресію видно до того, як її побачить клієнт.

Чим фільтрація на балансувальнику відрізняється від перевірки в застосунку

Правило на балансувальнику спрацьовує до того, як запит дійде до застосунку: з'єднання відсікається на вході, шифрований канал не піднімається, воркери не займають пам'ять і з'єднання з пулу.

Це і є раннє блокування — воно дешевше за будь-яку перевірку в коді, бо гасить навантаження в найвищій точці. Даних на цьому рівні мало: адреса клієнта, порт, ім'я вузла, лічильники частоти звернень.

Перевірка в застосунку бачить більше — токен, сесію, роль, ідентифікатор орендаря, шлях і тіло запиту. Зате платить повною вартістю обробки: запит уже прийнято, розібрано, піднято контекст.

Звідси й порядок перевірок: фільтр за адресою — на вході, пороги частоти — на балансувальнику, рішення за особистістю — уже в коді.

Головна пастка — дублювання правил. Якщо один і той самий список адрес живе і в конфігурації балансувальника, і в обробнику застосунку, вони розійдуться: правку внесуть в одне місце, друге залишиться з попередньою версією.

Гірше те, що відмова приходить без контексту — у логах застосунку запиту просто немає, і розбір починається з питання, чи був він взагалі.

Окремо про реальну адресу. За проксі клієнтська адреса підмінюється адресою посередника, і правило починає пропускати або різати не того.

Лікується це довірою до заголовка X-Forwarded-For лише від відомих проміжних вузлів і явним розбором ланцюжка — інакше адреса підробляється одним заголовком, і фільтр перестає щось значити.

Часті технічні сумніви під час налаштування доступу

Питання, які задають до старту, майже завжди стосуються не синтаксису правил, а поведінки системи під навантаженням і після змін. Нижче — короткі відповіді, які знімають більшу частину сумнівів до початку робіт.

Клієнти приходять із підміненою адресою — фільтр спрацює невірно?

Якщо трафік проходить через балансувальник або мережу доставки, у сокеті видно адресу посередника, а не клієнта. Реальну адресу відновлюємо за заголовком пересилання й директивами real_ip_header і set_real_ip_from, інакше правила застосовуються до проміжного вузла. Далі списки працюють уже за справжньою адресою.

Чи можемо ми заблокувати живих клієнтів?

Ризик є лише за різкого переходу в режим «заборонено все, крім списку». Тому спочатку вмикаємо запис без блокування, збираємо фактичний трафік і за ним формуємо білий список. Вимкнення — одним рядком конфігурації, без перезапуску сервісу.

У нас уже розгорнуто проксі — схема змінюється?

Змінюється вузол, на якому застосовуються правила: він має бути першим, хто приймає з'єднання. Якщо фільтр поставити після посередника, він побачить одну й ту саму адресу для всіх і або заблокує весь трафік, або не заблокує нічого.

Як часто переглядати списки?

За подіями — новий офіс, зміна провайдера в партнера, виведення сервісу з експлуатації. Плюс планова звірка раз на квартал і автоматичне старіння тимчасових записів, щоб список не перетворювався на звалище історичних виключень.

Як зрозуміти, що фільтр відсікає зайвих?

Ведемо лічильники відмов за кожним правилом і виводимо їх у моніторинг: зростання частки відмов на конкретному шляху — сигнал переглянути запис, а не чекати звернень. Хибні спрацювання розбираємо за логами з адресою, шляхом і часом.

Обговоримо вашу задачу фільтрації та повернемося з планом робіт

Щоб фільтрація працювала передбачувано, починаємо зі схеми проходження трафіку: де стоїть балансувальник, на якому вузлі завершується шифрування і в якій точці губиться реальна адреса клієнта.

На цій картині відразу видно, які заголовки доходять до nginx і Apache, де список дозволених адрес спрацює хибно, а де список заборонених залишить обхід.

Далі визначаємо склад етапів впровадження та межі робіт. План робіт з доступів погоджуємо до правок конфігурації — з порядком викату, точками відкату й відповідальними на вашому боці.

  • Схема проходження трафіку з точками, де визначається реальна адреса клієнта.
  • Правила для nginx і Apache з пріоритетами, виключеннями й порядком застосування.
  • Налаштування довірених проксі й заголовків, щоб реальну адресу не можна було підмінити ззовні.
  • Регламент оновлення списків доступу й порядок додавання нових адрес.
  • Перевірки на тестовому стенді й на бойовому трафіку, включно з відкатом правил.
  • Документація з конфігурації та передача вашій команді підтримки.

Опишіть задачу фільтрації: що вже налаштовано, де стоять проксі й які адреси потрібно пускати або блокувати. Повернемося з оцінкою робіт і планом, де за кожним етапом зазначено строки й результат.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142