LINUX.ORG.RU
ФорумAdmin

iptables port knocking


1

4

Как закрывать за собой порт? Открываю следующим образом:

# open ssh
$IPTABLES -N INTO-PHASE2
$IPTABLES -A INTO-PHASE2 -m recent --name PHASE1 --remove
$IPTABLES -A INTO-PHASE2 -m recent --name PHASE2 --set
$IPTABLES -A INTO-PHASE2 -j LOG --log-prefix "INTO PHASE2: "

$IPTABLES -N INTO-PHASE3
$IPTABLES -A INTO-PHASE3 -m recent --name PHASE2 --remove
$IPTABLES -A INTO-PHASE3 -m recent --name PHASE3 --set
$IPTABLES -A INTO-PHASE3 -j LOG --log-prefix "INTO PHASE3: "

$IPTABLES -N INTO-PHASE4
$IPTABLES -A INTO-PHASE4 -m recent --name PHASE3 --remove
$IPTABLES -A INTO-PHASE4 -m recent --name PHASE4 --set
$IPTABLES -A INTO-PHASE4 -j LOG --log-prefix "INTO PHASE4: "

$IPTABLES -A INPUT -m recent --update --name PHASE1

# ports: 1, 2, 3, 4
$IPTABLES -A INPUT -p tcp --dport 1 -m recent --set --name PHASE1
$IPTABLES -A INPUT -p tcp --dport 2 -m recent --rcheck --name PHASE1 -j INTO-PHASE2
$IPTABLES -A INPUT -p tcp --dport 3 -m recent --rcheck --name PHASE2 -j INTO-PHASE3
$IPTABLES -A INPUT -p tcp --dport 4 -m recent --rcheck --name PHASE3 -j INTO-PHASE4

# open...
$IPTABLES -A INPUT -p tcp --dport 5 -m recent --rcheck --seconds 10 --name PHASE4 -j ACCEPT

# sftp
$IPTABLES -A INPUT -p tcp --dport 5 -m state --state NEW -m recent --rcheck --name PHASE4 -j ACCEPT


Какое-то у тебя непонятное нагромождение правил :) У меня нечто подобное сделано 1 цепочкой 2 правилами.

Не понятно только, зачем после себя закрывать порты? Ведь в случае с recent, порты должны открываться только для твоего ip адреса... Можно сделать что-бы они «закрывались» после неактивности, в разрешающее правило вписать что-то типа: -m recent --update --seconds 600

Rost ★★★★★ ()
Ответ на: комментарий от oskar0609

вероятно, чтоб не велосипедить и описать правила в конфиге?
не хочешь - не юзай, я не заставляю ;)

мне вообще эта технология кажется странной. эдакое security by obscurity. а это всегда defective by design.

aol ★★★★★ ()
Ответ на: комментарий от oskar0609

Как-то так...

# Сбрасываем всё
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Разрешаем локальное
iptables -A INPUT -p all -i lo -j ACCEPT
iptables -A OUTPUT -p all -o lo -j ACCEPT

# Определяем время блокировки, если пришёл пакет не соответствующий условиям - 327 секунд
iptables -A INPUT -p icmp -m recent --name BLOCK --rcheck --seconds 327 -j DROP

# Если пришёл пакет не соответствующий условию "длина пакета 289" отправляем это запрос и другие от него в блок.
iptables -A INPUT -p icmp --icmp-type echo-request -m length ! --length 289 -m recent --name BLOCK --set -j DROP

# Если же пришёл пакет длиной 289 и временем жизни не менее 95, то открываем порт 3791 на 30 секунд
iptables -A INPUT -p tcp --dport 3791 -m state --state NEW -m recent --name OPEN --rcheck --seconds 30 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 289 -m ttl --ttl-gt 95 -m recent --name OPEN --set

# Порты которые оставляем открытыми multiport --dports 80 и т. п.
iptables -A INPUT -p tcp --syn -m multiport --dports 80 -j ACCEPT

# Разрешаем уже установленные соединения
iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

ping server.name.com -s 317 -c 1 -t 110

После этого порт 3791 будет открыт на 30 секунд, за это время можно успеть подключиться к ssh на порте.

kp ()
Ответ на: комментарий от oskar0609

Вероятно за тем-же, зачем файлы и драйвера, а так-же шелл вместо бинарников - для декомпозиции. Но настоящие гуру конечно делают все на iptables или даже патчат ядро...

P.S. iptables не осилил. Делал в своё время на ipfw и knockd ;)

anonymous ()
Ответ на: комментарий от anonymous

Какой толк делать то что не понимаешь? Эм, iptables и так через ядро работает, iptables просто инфетрейс к фаерволу который является частью ядра.

oskar0609 ()
Ответ на: комментарий от oskar0609

Какой толк делать то что не понимаешь?

требуемый уровень понимания всегда различен. или ты хочешь сказать что для организации порткнокинга нужно знать в подробностях весь TCP и то как ядро пакеты обрабатывает?

Эм, iptables и так через ядро работает, iptables просто инфетрейс к фаерволу который является частью ядра.

а зачем крутым перцам интерфейс. может лучше сразу ядро немного пропатчить?

anonymous ()
Ответ на: комментарий от anonymous

Убежден что без понимания того что делаешь - этого делать не стоит. Зачем холиварить, если по теме вопроса ничего не говорите?

oskar0609 ()

Я не совсем понял правило:

$IPTABLES -A INPUT -p tcp --dport 5 -m recent --rcheck --seconds 10 --name PHASE4 -j ACCEPT

Это если перестать постоянно слать по ssh пакеты, то соединение оборвётся?

Вы не уточнили по каким критериям вам нужно закрывать за собой порт. Может в ручную удалять ip-адреса из списка или по таймауту или knock-последовательность нужна для каждого коннекта.

Зачем последовательность в 4 порта не понятно. Точнее не понятно, зачем вы её привели здесь, для примера хватило бы двух портов, чтобы не загромождать пост большим списком правил.

mky ★★★★★ ()
Ответ на: комментарий от mky

Текущие соединениния (успешные) не обрываются. Не стал нагромождать тот кусок правил что здесь всем листингом. Хотелось что бы порт закрывался (для ip) например по обратной последовательности портов.

oskar0609 ()
Ответ на: комментарий от oskar0609

Обратной последовательностью? Это же сложно, выделили бы отдельный порт, хотя вам виднее. Пишите аналогичные правила только управляющие другими списками (допустим oPHASE1-oPHASE4) в другом порядке. Последним правилом чистите PHASE4.

Только это будет такая куча правил, что потом сами запутаетесь, если захочется что-нибудь изменить.

mky ★★★★★ ()
Ответ на: комментарий от mky

Так и собирался, но из-за дублирования кода решил здесь спросить. Спасибо

oskar0609 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.