Страница 1 из 1

Port knocking

Добавлено: 2012-01-07 21:52:12
SKAUT
Доброго часа всем!

Ситуация такова:
Прочитал статью Port knocking и решил реализовать, т.к. частенько на наш старый сервак ломятся "неизвестные". Отдельно готовлю новый и хотел бы его защитить, а самому заходить по ssh и править конфиги иногда.
Поставил серверную часть (knockd). Версия ОС 8.2-RELEASE. Ядро собрано с опциями для ipfirewall по статье с lissyara.su. Единственное то, что правило в нём пока одно - разрешающее, и нет DUMMYNET.

knockd.conf

Код: Выделить всё

[options]
         logfile = /var/log/knockd.log
         interface = em0

[opencloseSSH]

	sequence      = 1000,2000,3000
        seq_timeout   = 5
        tcpflags      = syn
        start_command = /sbin/pfctl -t good_hosts -T add %IP%
        cmd_timeout   = 10
        stop_command  = /sbin/pfctl -t good_hosts -T delete %IP%

[open22]
        sequence    = 4000,5000,6000
        seq_timeout = 5
        tcpflags    = syn
        command     = /sbin/pfctl -t good_hosts -T add %IP%

[close22]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        tcpflags    = syn
        command     = /sbin/pfctl -t good_hosts -T delete %IP%
В pf.conf прописал следующее:

Код: Выделить всё

table <good_hosts> persist

block in on $ext_if all
pass in on $ext_if inet proto tcp from <good_hosts> \
 to $ext_if port 22 keep state
Далее: /sbin/ipfw add 100 allow tcp from %IP% to me 22 keep-state
Ругнулось на unknown host "IP". Думаю что надо было здесь и в knockd.conf писать реальный адрес.
Ладно, плюнул, т.к. подключаться буду с компа через ADSL а там каждый раз другой адрес.
Нашёл WinKnock чтобы подключаться с win7. Конфиг для неё такой:

Код: Выделить всё

#opencloseSSH
ip xxx.xxx.xxx.xxx
open 1000:Tcp
open 2000:Tcp
open 3000:Udp
close 1000:Tcp
close 2000:Udp
close 3000:Tcp
#open22
ip xxx.xxx.xxx.xxx
open 4000:Tcp
open 5000:Tcp
open 6000:Tcp
#close22
ip xxx.xxx.xxx.xxx
close 7000:Tcp
close 8000:Tcp
close 9000:Tcp
Затем на сервере pfctl -f /etc/pf.conf и пытаюсь подключиться через WinKnock: вроде пишет что открыто, а putty сообщает о timeout error.

Вопрос: понимаю, что я не всё понял, как это должно работать, и прошу подсказать, каким же образом это всё осуществить в моём примере.

Re: Port knocking

Добавлено: 2012-01-07 22:41:45
FreeBSP
1) man knockd
2) что пользуем? ipfw или PF ??? или все вместе? а то заявлено про наличие ipfw в ядре, а кроме PF ничего не трогается
3) курим логи. если выложишь - можно покурить вместе

Re: Port knocking

Добавлено: 2012-01-07 22:53:23
SKAUT
1) man knockd
Хорошо. Почитаю
2) что пользуем? ipfw или PF ??? или все вместе? а то заявлено про наличие ipfw в ядре, а кроме PF ничего не трогается
Планирую ipfw потому и встраивал его в ядро, а по статье правила были как и для него так и для pf. Задать правило для ipfw не удалось (ошибка выше), а часть в pf.conf показана.
3) курим логи. если выложишь - можно покурить вместе
В понедельник на работу выйду, логи выложу, будим курить. Сейчас никак уже попасть не смогу на сервак. Сам же себе всё отрубил)
Сейчас пойду по инету гуглить ман по knockd)

Re: Port knocking

Добавлено: 2012-01-07 23:38:14
FreeBSP
http://www.freebsd.org/cgi/man.cgi?quer ... ormat=html
правила ipfw надо было писать не в консоль, а в конфиг кнокд

Re: Port knocking

Добавлено: 2012-01-08 0:27:08
dikens3
У Вас pf.conf только касательно ssh, он не полный. В нём всего два правила по сути:
1. Принимать соединения на порт 22 от некоторых хостов.
2. Блокировать всё.

Вам видимо нужно разрешить всё, и пускать только определённые IP на SSH. Пока не поймёте как работает firewall.

Код: Выделить всё

pass in on $ext_if all
block in quick on $ext_if inet proto tcp from !<good_hosts> \
to $ext_if port 22
Не помню как отрицание делается в pf, написал !

Re: Port knocking

Добавлено: 2012-01-09 7:23:32
SKAUT
вот такие вот логи имеются...
pf.log

Код: Выделить всё

00:00:00.000000 rule 4294967295/8(ip-option): pass in on em0: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
00:00:00.000011 rule 4294967295/8(ip-option): pass in on em1: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
00:00:06.999947 rule 4294967295/8(ip-option): pass in on em1: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
00:00:00.000042 rule 4294967295/8(ip-option): pass in on em0: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
19:30:50.868797 rule 4294967295/8(ip-option): pass in on em0: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
00:00:00.000012 rule 4294967295/8(ip-option): pass in on em1: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
00:00:06.999989 rule 4294967295/8(ip-option): pass in on em1: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
00:00:00.000041 rule 4294967295/8(ip-option): pass in on em0: 10.0.0.0 > 224.0.0.1: igmp query v3 [max resp time 1s]
knockd.log

Код: Выделить всё

[2012-01-06 15:06:49] starting up, listening on em0
[2012-01-06 19:51:08] 178.91.59.226: opencloseSSH: Stage 1
[2012-01-06 19:51:08] 178.91.59.226: opencloseSSH: Stage 2
[2012-01-06 19:56:14] 178.91.59.226: opencloseSSH: sequence timeout (stage 2)

[2012-01-06 19:56:14] 178.91.59.226: opencloseSSH: Stage 1
[2012-01-06 19:56:14] 178.91.59.226: opencloseSSH: Stage 2
[2012-01-06 19:56:29] 178.91.59.226: opencloseSSH: sequence timeout (stage 2)

[2012-01-06 19:56:29] 178.91.59.226: open22: Stage 1
[2012-01-06 19:56:29] 178.91.59.226: open22: Stage 2
[2012-01-06 19:57:26] 178.91.59.226: open22: sequence timeout (stage 2)

[2012-01-06 19:57:26] 178.91.59.226: close22: Stage 1
[2012-01-06 19:57:26] 178.91.59.226: close22: Stage 2
[2012-01-06 19:57:26] 178.91.59.226: close22: Stage 3
[2012-01-06 19:57:26] 178.91.59.226: close22: OPEN SESAME
[2012-01-06 19:57:26] close22: running command: /sbin/pfctl -t good_hosts -T delete 178.91.59.226
ipfw list

Код: Выделить всё

65535 allow ip from any to any
pf.conf

Код: Выделить всё

ext_if="em0"
int_if="em1"

table <good_hosts> persist
block in on $ext_if all
pass in on $ext_if inet proto tcp from <good_hosts> \
 to $ext_if port 22 keep state

set skip on lo
knockd.conf

Код: Выделить всё

[options]
        logfile = /var/log/knockd.log
        interface = em0

[opencloseSSH]
        sequence    = 1000,2000,3000
        seq_timeout = 5
        start_command     = /sbin/pfctl -t good_hosts -T add %IP%
        tcpflags    = syn
        cmd_timeout   = 10
        stop_command  = /sbin/pfctl -t good_hosts -T delete %IP%

[open22]
        sequence    = 4000,5000,6000
        seq_timeout = 5
        tcpflags    = syn
        command     = /sbin/pfctl -t good_hosts -T add %IP%

[close22]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/pfctl -t good_hosts -T delete %IP%
        tcpflags    = syn

Re: Port knocking

Добавлено: 2012-01-09 16:03:14
FreeBSP
разберись в реализации порткнокинга в knockd и в винкнок. а именно - как и что должно происходить и почему

или для ленивых:

Код: Выделить всё

kldunload pf
ipfw add check-state
ipfw add 200 deny ip from any to me ssh
knockd.conf:

Код: Выделить всё

# Глобальная секция(описание параметров демона)
[options]
		# Имя и путь к лог файлу
        logfile = /var/log/knockd.log
		# На каком интерфейсе демон 
		# будет ждать заданной последовательности
        interface = rl0

# Секция, описывающая открытия
# и закрытия определенного порта
[opencloseSSH]

		# Уникальная последовательность
        sequence      = 1000:udp,2000:tcp,3000:udp
		# Таймаут соединения с портами
        seq_timeout   = 5
		# Флаги, установленные в tcp пакетах
        tcpflags      = syn
		# Команда, которая выполнитсся при успешном соединение с портами в определенной последовательности
        start_command = /sbin/ipfw add 100 allow tcp from %IP% to me 22 keep-state
		# Через какое время будет выполнена stop_command, после выполнения start_command
        cmd_timeout   = 10
		# Команда, которая выполнится после timeout'а
        stop_command  = /sbin/ipfw delete 100

# Секция для открытия порта
[open22]
        sequence    = 4000:tcp,5000:tcp,6000:udp
        seq_timeout = 5
        tcpflags    = syn
		# Команда, которая выполнится при успешном  соединение с портами
        command     = /sbin/ipfw add 100 allow tcp from %IP% to me 22 keep-state

# Секция для закрытия порта
[close22]
        sequence    = 7000:udp,8000:tcp,9000:tcp
        seq_timeout = 5
        tcpflags    = syn
        command     = /sbin/ipfw delete 100
winknock.cfg

Код: Выделить всё

#openSSH and close automatically
ip xxx.xxx.xxx.xxx
open 1000:Udp
open 2000:Tcp
open 3000:Udp

#only open22
ip xxx.xxx.xxx.xxx
open 4000:Tcp
open 5000:Tcp
open 6000:Udp
#only close22
ip xxx.xxx.xxx.xxx
close 7000:Udp
close 8000:Tcp
close 9000:Tcp