Port knocking у Mikrotik – що? навіщо? як?

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

[tds_info]Для прикладу:
ми хочемо отримати доступ з будь-якої точки до пристрою по ssh. Стандартний порт ssh 22. Якщо “викинути” пристрій назовні з білим IP, затяті брутфорсери не забаряться. Але ми цього не хочемо. Ви скажете, адже можна змінити порт на нестандартний, відрізати доступ всім зайвим firewall’ом, зрештою підключиться по VPN і звичайно ж будете праві. Але ідентифікувати службу можна і по нестандартному порту, а закривати доступ до Firewall не завжди зручно та гнучко або взагалі можливо, особливо при підключеннях з динамічних IP-адрес.
Port knocking не є єдиним рішенням для таких проблем. Це, по суті, один із безлічі можливих варіантів. Але за його допомогою можна робити дуже цікаві речі.[/tds_info]

Port knocking буквально означає “постукатися до порту”. У цьому й полягає вся суть. Ми закриваємо порт усім і відкриваємо лише тому, хто пройде певну процедуру. Ця процедура полягатиме в послідовному підключенні до трьох різних портів із занесенням IP-адреси джерела в Access List.

На цьому зупинимося докладніше.

Для прикладу, у нас є 2 правила в Firewall. Першим ми дозволяємо всі встановлені та пов’язані з’єднання (established, related), а другим забороняємо всім доступ до 22 порту ssh.
Переконаємося, що 22 порти у нас закриті. Проскануємо порти нашого пристрою. Для цього я використовую програму Advanced Port Scanner.

Як бачимо, порт зачинено. Далі йдемо в IP – Firewall – Filter rules і створимо чотири правила.

/ip firewall filter
add action=add-src-to-address-list address-list=acl1 address-list-timeout=20s chain=input dst-port=7637 in-interface=vlan156 protocol=tcp
add action=add-src-to-address-list address-list=acl2 address-list-timeout=20s chain=input dst-port=2641 in-interface=vlan156 protocol=tcp src-address-list=acl1
add action=add-src-to-address-list address-list=acl3 address-list-timeout=1h chain=input dst-port=1428 in-interface=vlan156 protocol=tcp src-address-list=acl2
add action=accept chain=input dst-port=22 in-interface=vlan156 protocol=tcp src-address-list=acl3

[ads_color_box color_background=”#eef7a6″ color_text=”#444″]Перше правило: додаємо адресу джерела в Access List “acl1” з тайм-аутом 20 секунд з вхідного tcp запиту на порт 7637 з порту vlan156 (цім інтерфейсом мій маршрутизатор “дивиться” в інтернет)
Друге правило: додаємо адресу джерела в Access List “acl2” з тайм-аутом 20 секунд з вхідного tcp запиту на порт 2641 з порту vlan156 та наявністю його у списку “acl1”
Третє правило: додаємо адресу джерела в Access List “acl3” з тайм-аутом 1 годину з вхідного tcp запиту на порт 1428 з порту vlan156 та наявністю його у списку “acl2”
Четверте правило: дозволяємо вхідні tcp підключення на порт 22 IP-адрес зі списку “acl3″[/ads_color_box]

Загальна картина виглядає приблизно так:

Таким чином, при послідовному підключенні до tcp-портів 7637, 2641, 1428 протягом 20 секунд, ми відкриваємо собі порт 22 рівно на 1 годину. Після закінчення цього часу IP-адреса, з якої ми здійснювали підключення, видаляється зі списку “acl3” і порт 22 автоматично ставати закритим, оскільки спрацьовує правило, що забороняє підключення до 22 порту.

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

Щодо того, як здійснювати такі підключення. Можна вручну довбати порти за допомогою того ж putty. А можна скористатися спеціально призначеними для цього утилітами, наприклад WinKnock, які автоматизують цей процес. Хоча, ніби якась з версій putty розуміє port knocking.

Це лише одна з можливих реалізацій port knocking. Можна піти набагато далі і використовувати не порти, а, наприклад, ICMP-запити з певними параметрами.

При вхідному icmp-пакеті розміром 255 байт додати адресу джерела в Accless List “acl_icmp”
/ip firewall filter
add action=add-src-to-address-list address-list=acl_icmp address-list-timeout=10m chain=input in-interface=vlan156 packet-size=255 protocol=icmp src-address-type="" tcp-flags=""

або те саме, тільки з певним значенням TTL
/ip firewall filter
add action=add-src-to-address-list address-list=acl_icmp address-list-timeout=10m chain=input in-interface=vlan156 protocol=icmp src-address-type="" tcp-flags="" ttl=equal:59

Але тут є певні нюанси.
При використанні розміру вхідного пакета слід пам’ятати, що до розміру пакета, який ми очікуємо на вході, додається ще 28 байт (20 байт – заголовок IP-пакету та ще 8 байт заголовок ICMP). Перевірити це можна, подивившись сніффером або за графіком статистики трафіку на самому пристрої Mikrotik.
Дозволимо вхідні icmp-запити і відправимо один icmp-пакет із зазначенням розміру 255 байт:
/ip firewall filter
add action=accept chain=input protocol=icmp

Як бачимо, ми зловили пакет розміром 283 байти. Якщо відняти з них 28, отримаємо 255. Таким чином, щоб на Mikrotik потрапив пакет розміром 255 байт, при запиті ми повинні відняти 255 – 28 = 227.
Тоді команда ping виглядатиме так:
ping -l 227 -n 1 192.168.156.238

При використанні TTL потрібно враховувати кількість хопів від нас до роутера. Кількість хопів можна переглянути командою
tracert, (для Windows) або traceroute, mtr (для Linux).

Для прикладу.
На маршрутизаторі ми очікуємо пакет з TTL 50. Між нашим комп’ютером та маршрутизатором (у моєму тестовому середовищі) 2 хопи.

C:\Users\pakholiuk>tracert -d 192.168.156.238

Трассировка маршрута к 192.168.156.238 с максимальным числом прыжков 30

1 <1 мс <1 мс <1 мс 192.168.1.1
2 <1 мс <1 мс <1 мс 192.168.156.238

Перший хоп, це мій шлюз, при проходженні якого забере одиниця від значення поля TTL. Відповідно нашому маршрутизатору Mikrotik потрапить пакет зі значенням поля TTL=TTL – 1. Тому команда ping буде виглядати так:

C:\Users\pakholiuk>ping 192.168.156.238 -i 51

Обмін пакетами з 192.168.156.238 по 32 байт даних:
Відповідь від 192.168.156.238: число байт=32 час 1мс TTL=63

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

На цьому все. Сподіваюся, стаття була для вас корисною.