Port Knocking

Не всі сервіси має сенс постійно виставляти в інтернет. Але, проте, доступ з інтернету до них все ж іноді потрібно мати. Можна, звичайно, зайти на сервер, наприклад, по VPN і тимчасово змінити конфігурацію, зробити необхідні дії і повернути конфігурацію назад.

Для спрощення таких дій є досить проста, але, тим не менш, багата можливостями, технологія Port Knocking. Її суть полягає в тому, що відправивши пакети в певній послідовності на певні порти, ви ініціюєте якусь наперед сконфігуровану дію. Налаштування Port Knocking можна зробити самому в повністю ручному режимі за допомогою IPTables, однак простіше і зручніше для цього використовувати спеціальний демон knockd.

Встановимо його командою:

# apt-get install knockd

 

Налаштування сервісу робляться в файлі /etc/knockd.conf

За замовчуванням він виглядає так:

[options]

UseSyslog

[openSSH]

sequence = 7000,8000,9000

seq_timeout = 15

command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

tcpflags = syn

[closeSSH]

sequence = 9000,8000,7000

seq_timeout = 5

command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

tcpflags = syn

 

У цьому файлі описано дві дії - відкрити порт для ssh та закрити його ж.

Опис полів:

sequence — список портів, на які потрібно «постукати»

seq_timeout — максимальний час в секундах, який відводиться на «простукування» портів

command— команда, що буде виконана

tcpflags — флаги пакетів

 

Після встановлення так само слід дозволити запуск демона knockd. Для цього в файлі /etc/default/knockd треба прописати рядок:

START_KNOCKD=1

 

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

# iptables -P INPUT DROP

Та перезапустимо сервіс:

#service knockd restart

 

Тепер у нас за замовчуванням всі порти закриті. Для того, щоб з'єднатися з сервером потрібно до нього постукати. Звичайно, це можна зробити і за допомогою telnet, але є більш зручний спосіб.

Якщо ми намагаємося з'єднатися з Linux-комп'ютера, то встановимо на ньому той же самий knockd, але не будемо запускати сервіс, а скористаємося клієнтською частиною:

$ knock 192.168.0.140 7000 8000 9000

 

Після чого можна з'єднуватися з нашим сервером:

$ ssh user@ 192.168.7.140

 

Якщо ми використовуємо Windows-комп'ютер, то можна завантажити knock-утиліту

www.zeroflux.org/proj/knock/files/knock-cygwin.zip

 

І після її запуску з командного рядка (параметри такі ж як і в Linux) з'єднатися з сервером за допомогою Putty як завжди.

Після того, як ми «постукали» в syslog повинні з'явитися записи типу:

 

knockd: 192.168.0.5: openSSH: Stage 1

knockd: 192.168.0.5: openSSH: Stage 2

knockd: 192.168.0.5: openSSH: Stage 3

knockd: 192.168.0.5: openSSH: OPEN SESAME

knockd: openSSH: running command: /sbin/iptables -A INPUT -s 192.168.0.5 -p tcp --dport 22 -j ACCEPT

 

Після закінчення роботи потрібно не забути закрити порт:

$ knock 192.168.0.140 9000 8000 7000

 

Після цього knockd видаляє старі правила на відкриття 22 порту.

У такого підходу є деякі недоліки - не можна просто обірвати сесію з сервером і продовжити займатися іншими справами. В такому випадку порт на сервері буде відкритий або до перезавантаження, або поки ми не згадаємо і не скасуємо правило дозволу. Щоб уникнути такої ситуації правило на «стук» по портам можна записати в дещо іншому вигляді.

 

Приведемо файл /etc/knockd.conf до наступного вигляду:

[options]

UseSyslog

 

[openSSH]

sequence = 7000,8000,9000

seq_timeout = 15

tcpflags = syn

start_command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

cmd_timeout = 10

stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

 

 

Зараз у нас дещо змінився опис реакції на «стук» по портам:

start_command команда, що буде виконана

cmd_timeout час затримки в секундах

stop_commandкоманда, яка буде виконана через cmd_timeout секунд після виконання start_command.

 

Та перезапустимо сервіс knockd

#service knockd restart

 

Якщо ми зараз спробуємо «постукати» і приєднатися до сервера, то через 10 секунд наша сесія обірветься, так як спрацює правило закриття порту, і не факт, що ми встигнемо зробити все, що потрібно.

Для того, щоб сесія не обривалася на сервері в IPTables потрібно додати правило, яке дозволятиме вхідний трафік, за умови, що він відноситься до вже встановленого з'єднання:

# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

 

Ось після цього ми зможемо «постукати» і після цього нормально відкрити сесію і попрацювати скільки потрібно. Однак через 10 секунд нову сесію відкрити ми вже не зможемо.

Додати коментар

Захисний код
Оновити