Реализация идеи динамического открытия доступа к 22 порту, при предварительном обращении telnet-ом на определенный сетевой порт (в примере 333 - открыть доступ и 334 - закрыть). Идея реализована средствами iptables, без привлечения дополнительных утилит и анализаторов логов.# Создаю цепочку с именем SSH
iptables -N SSH
# Правило по умолчанию в INPUT - DROP
iptables -P INPUT DROP
# Всё что пришло на 22 порт - в цепочку SSH
iptables -A INPUT -p tcp --dport 22 -j SSH
# Всё что пришло на 333 порт - в цепочку SSH
iptables -A INPUT -p tcp --dport 333 -j SSH
# Всё что пришло на 334 порт - в цепочку SSH
iptables -A INPUT -p tcp --dport 334 -j SSHРазделения на цепочки сделано для своего удобства, от этого можно и отказаться.
Теперь заполняем цепочку SSH.
# Проверяем на наличие имени "SSH" у IP адреса устанавливающего соединение на 22 порт.
# И если оно присутствует - то ACCEPT
iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 22 -m recent --rcheck --name SSH --rsource -j ACCEPT# Устанавливает имя SSH любому IP адресу с которого пришло новое TCP соединение на указанный порт. (порт 333)
iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 333 -m recent --set --name SSH --rsource -j DROP# Удаляет имя "SSH" с IP адреса установившего соединение на этот порт. (порт 334)
iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 334 -m recent --remove --name SSH --rsource -j DROPНасладимся итоговым результатом:
Делаем:
telnet ip_address_or_domain_name 333
После чего спокойно подключаемся по SSH.Когда прекращаем работу закрываем за собой 22 порт:
telnet ip_address_or_domain_name 334
URL: http://main-server.blogspot.com/2009/04/port-knocking.html
Обсуждается: http://www.opennet.me/tips/info/2265.shtml
Допиши самое главное - port < open_port < close_port
Хотя не... от обратного сканирования не спасёт.Лучше так:
close_port
port
close_port
open_portт. е. при линейном сканировании слева или справа, наш порт всегда будет закрыт.
порт закрытия, на 10011 порт
ssh на 10022
порт закрытия на 10033
открыть на любойИ ещё бы таймаут на ожидание соединения, между telnet host.org open_port и ssh host.org
А если будут сканировать во время активной сессии ssh?....
Там запоминается IP, если я сижу с IP 1.1.1.1 а скан идёт с 2.2.2.2 то 2.2.2.2 просто откроет/закроет себе порт.Кстати: Безопасность - это комплексное решение (С)Мой друг.
Port-knoking не панацея, но избавиться от ботовбрутфорсеров реально помогает. А за iptables находится ssh там где авторизация по ключам и т.д.
Анализ логов, также никто не отменял, и если в логах обнаружится брутфорс, то как минимум можно сменить порты.
P.S>
Не считайте, что эта технология на 100% защищает Ваш порт от стороннего проникновения.
параноик?
Прикольно, это мой блог :) я там всякую фигню пишу... :):):)Ну раз тут есть, то скажу ещё пару слов :)
Во первых, идея не совсем моя, я её чуть чуть переделал. В блоге авторство указано.Считывая файл cat /proc/net/ipt_recent/SSH (SSH в данном случае - имя цепочки) можно просматривать кто имеет доступ, или не закрыл его за собой. Естественно вся информация до перезагрузки.
>Прикольно, это мой блог :) я там всякую фигню пишу... :):):)А-га, вот ещё один блоггер:
http://roland.entierement.nu/blog/2008/08/19/netfilter-based...Порт-нокер _без_ демона или сканирования логов -- средствами "того самого" -m recent.
Спасибо за идею.
Изначально почерпнул ее из твоего блога, потом сходил на сайт разработчика и дополнительно почерпнул кое-что оттуда. :)Мне кажется, что лучше и проще делать так:
-A INPUT -p tcp --dport 3333 -m recent --rcheck --seconds 30 --name SSH -j ACCEPT
-A INPUT -p tcp --dport 64444 -m recent --set --name SSH -j REJECT --reject-with tcp-resetздесь SSH-демон слушает на порту 3333/tcp, а порт 64444/tcp используется для "открывания двери".
дверь открывается только на 30 сек. если в течение этого времени подключение не произойдет, она закроется. поэтому можно не беспокоиться о том, что нужно закрыть ее после себя.
при таком сильном разнесении портов и таком таймауте вероятность попадания "врага" в "порт открывания двери", а затем в порт ssh-демона почти нулевая.
-j REJECT --reject-with tcp-reset нужно для того, чтобы удобнее было "стукаться" в "порт открывания двери, например, telnet-клиентом (не будет висеть, сразу выйдет).P.S. минус всего этого дела в том, что не изо всяких мест могут быть доступны порты 3333/tcp и 64444/tcp.
Я придумал круче#!/bin/bush
name() {
local l=$1
[ "$l" == "" ] && l=20
tr -dc "A-Za-z0-9_.,:-" < /dev/urandom | head -c ${l} | xargs
}TABLE=`name`;
iptables -N "$TABLE";
iptables -A INPUT -p tcp --dport $(( 1025 + ( $RANDOM % (65534-1025)))) -m recent --rcheck --seconds $((( 10 + $RANDOM ) % 180)) --name "$TABLE" -j ACCEPT;
iptables -A INPUT -p tcp --dport $(( 1025 + ( $RANDOM % (65534-1025)))) -m recent --set --name "$TABLE" -j REJECT --reject-with tcp-reset;
iptables -L -n | gpg -ae -r sEcREtUSer@c00lADmiN.рф | mail -s "Penis Enlager" sEcREtUSer@c00lADmiN.рф#/*-----*/
# iptables -L
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:23377 recent: CHECK seconds: 86 name: u0MPqLRJvborre.FNgye side: source
REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:1742 recent: SET name: u0MPqLRJvborre.FNgye side: source reject-with tcp-reset
Chain u0MPqLRJvborre.FNgye (0 references)
target prot opt source destination
:)> минус всего этого дела в том, что не изо всяких мест
> могут быть доступны порты 3333/tcp и 64444/tcp.например?
>> минус всего этого дела в том, что не изо всяких мест
>> могут быть доступны порты 3333/tcp и 64444/tcp.
>
>например?существует масса сетей (от сетей мелких районных провайдеров до корпоративных сетей), в которых наружу закрыто все, кроме нескольких самых популярных портов вроде 80/tcp, 110/tcp, 5190/tcp и некоторых других. из таких мест в свою хитрую дверь не попадешь.
Занятно, но если не бояться насчёт возможности установления фактов соединений с секретными портами -- то заметно проще, заодно эффективней от сканов отодвинуть ssh на левый порт. А если бояться, то лучше даже не port knocking в классическом виде (например, http://zeroflux.org/knock умеет и последовательности tcp/udp-портов), а реализации SPA (single packet auth -- авторизация по одному криптопакету).
Более подробная и расширенная информация есть здесь - http://wiki.enchtex.info/howto/iptables/ssh-guard