Port Knocking
- Деталі
- Категорія: Servers (uk)
- Опубліковано: Неділя, 06 січня 2019, 20:24
- Автор: Super User
- Перегляди: 2938
Не всі сервіси має сенс постійно виставляти в інтернет. Але, проте, доступ з інтернету до них все ж іноді потрібно мати. Можна, звичайно, зайти на сервер, наприклад, по 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 секунд нову сесію відкрити ми вже не зможемо.