knock на нескольких интерфейсах

Все вопросы по установке, обновлению и эксплуатации FreeBSD: конфигурация и сопровождение.

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
fractal
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-01-14 10:02:26

knock на нескольких интерфейсах

Непрочитанное сообщение fractal » 2010-01-14 11:17:08

Здравствуйте, пишу по поводу knockd.
knock настраивал по статье http://www.lissyara.su/articles/freebsd ... t_knocking. Все вроде замечательно работает, только есть один момент, в котором никак не могу разобраться. В статье в конфиге указан только один интерфейс. Как бы сделать так чтобы knockd слушал пакеты с 3 интерфейсов.
Пробовал в конфиге указывать:

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

cat /usr/local/etc/knockd.conf

[options]
         logfile = /var/log/knockd.log
         interface = sk0
         interface = rl0
         interface = fxp0
Слушает только первый sk0 ну и соответственно, какой 1 укажешь с такого и слушает.
Читал man knockd там вроде тока про параметр -i говориться опять же только один интерфейс.
yandex полистал ничего дельного.
Может скриптик есть у кого или ссылка какая.
Подскажите куда копать.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: knock на нескольких интерфейсах

Непрочитанное сообщение hizel » 2010-01-14 11:27:50

исходники посмотрите
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
gonzo111
лейтенант
Сообщения: 648
Зарегистрирован: 2007-11-15 16:32:33
Откуда: China
Контактная информация:

Re: knock на нескольких интерфейсах

Непрочитанное сообщение gonzo111 » 2010-01-14 12:18:41

а шо там за статья ? пишет 404 - не найдено
Тяжело в учении легко в РАЮ!
беру зарплату гречкой и сахаром...
Наша комната - lissyara.su@conference.jabber.ru

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: knock на нескольких интерфейсах

Непрочитанное сообщение FreeBSP » 2010-01-14 18:36:45

в сырцах тока про 1 интерфейс говорится, насколько я помню.. смотрел неделю назад
имеет смысл пускать две копии брутблока
для этого надо скопировать и подредактировать его rc скрипт
подробнее напишу позднее, если интересно
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

fractal
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-01-14 10:02:26

Re: knock на нескольких интерфейсах

Непрочитанное сообщение fractal » 2010-01-15 13:14:55

Статья вот эта: http://www.lissyara.su/?id=1283

Залез в исходники да там действительно только про один интерфейс написано.
В С я не особо силен, но попробую перелапатить под 3 интерфейса. О результате напишу позже.

fractal
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-01-14 10:02:26

Re: knock на нескольких интерфейсах

Непрочитанное сообщение fractal » 2010-01-15 13:16:36

Хотелось бы конечно узнать о более простом способе.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: knock на нескольких интерфейсах

Непрочитанное сообщение FreeBSP » 2010-01-15 15:09:31

фрактал, не ломай стену, открой дверь - она рядом
скопируй rc скрипт, поменяй там штук 5 строк и допиши строки 3 в rc.conf

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

#grep knock /etc/rc.conf | sed "s/knockd/knockd2/g" >> /etc/rc.confъ
#cat /usr/local/etc/rc.d/knockd |  sed "s/knockd/knockd2/g" >> /usr/local/etc/rc.d/knockd2
#cat /usr/local/etc/rc.d/knockd2 | \
sed 's/command="\/usr\/local\/bin\/knockd2"/command="\/usr\/local\/bin\/knockd"/g > \
/usr/local/etc/rc.d/knockd2 
#cp /usr/local/etc/knockd.conf /usr/local/etc/knockd2.conf
PS Ъ обязателен
как детям блин...

потом пили /usr/local/etc/knockd2.conf
хотя его тоже можешь поменять
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

fractal
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-01-14 10:02:26

Re: knock на нескольких интерфейсах

Непрочитанное сообщение fractal » 2010-01-15 15:20:30

Спасибо :smile:. Буду пробовать.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: knock на нескольких интерфейсах

Непрочитанное сообщение FreeBSP » 2010-01-15 15:23:55

в сырцах копаться конечно полезно, но так ведь проще
я тож в голубятне дырку проковырял, а оказалось проще редиректить почту и все
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

fractal
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-01-14 10:02:26

Re: knock на нескольких интерфейсах

Непрочитанное сообщение fractal » 2010-01-19 15:50:37

FreeBSP писал(а):фрактал, не ломай стену, открой дверь - она рядом
скопируй rc скрипт, поменяй там штук 5 строк и допиши строки 3 в rc.conf

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

#grep knock /etc/rc.conf | sed "s/knockd/knockd2/g" >> /etc/rc.confъ
#cat /usr/local/etc/rc.d/knockd |  sed "s/knockd/knockd2/g" >> /usr/local/etc/rc.d/knockd2
#cat /usr/local/etc/rc.d/knockd2 | \
sed 's/command="\/usr\/local\/bin\/knockd2"/command="\/usr\/local\/bin\/knockd"/g > \
/usr/local/etc/rc.d/knockd2 
#cp /usr/local/etc/knockd.conf /usr/local/etc/knockd2.conf
PS Ъ обязателен
как детям блин...

потом пили /usr/local/etc/knockd2.conf
хотя его тоже можешь поменять

Попробовал приведенный способ
в конфигах добавил 3 разных интерфейса
в итоге поднимаются три демона но все три почему то слушают один и тот же первый интерфейс


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

cat /etc/rc.conf
knockd_enable="YES"
knockd2_enable="YES"
knockd3_enable="YES"


cat /usr/local/etc/rc.d/knockd

#!/bin/sh
# PROVIDE: knockd
# REQUIRE: DAEMON
# BEFORE:  LOGIN
. /etc/rc.subr
name="knockd"
rcvar=`set_rcvar`
load_rc_config $name
knockd_enable=${knockd_enable:-"NO"}
knockd_flags=${knockd_flags:-"-d"}
command="/usr/local/bin/knockd"
pidfile="/var/run/knockd.pid"
required_files="/usr/local/etc/knockd.conf"
run_rc_command "$1"


cat /usr/local/etc/rc.d/knockd2

#!/bin/sh
# PROVIDE: knockd2
# REQUIRE: DAEMON
# BEFORE:  LOGIN
. /etc/rc.subr
name="knockd2"
rcvar=`set_rcvar`
load_rc_config $name
knockd2_enable=${knockd2_enable:-"NO"}
knockd2_flags=${knockd2_flags:-"-d"}
command="/usr/local/bin/knockd2"
pidfile="/var/run/knockd2.pid"
required_files="/usr/local/etc/knockd2.conf"
run_rc_command "$1"


cat /usr/local/etc/rc.d/knockd3

#!/bin/sh
# PROVIDE: knockd3
# REQUIRE: DAEMON
# BEFORE:  LOGIN
. /etc/rc.subr
name="knockd3"
rcvar=`set_rcvar`
load_rc_config $name
knockd3_enable=${knockd3_enable:-"NO"}
knockd3_flags=${knockd3_flags:-"-d"}
command="/usr/local/bin/knockd3"
pidfile="/var/run/knockd3.pid"
required_files="/usr/local/etc/knockd3.conf"


cat /usr/local/etc/knockd.conf

[options]
        logfile = /var/log/knockd.log
        interface = sk0
Правила .....


cat /usr/local/etc/knockd2.conf
[options]
        logfile = /var/log/knockd.log
        interface = rl0
Правила .....


cat /usr/local/etc/knockd3.conf
[options]
        logfile = /var/log/knockd.log
       interface = fxp0
Правила .....

ps waux | grep knock
root     846  0,0  0,1  3284  1800  ??  Ss   15:42     0:00,01 /usr/local/bin/knockd -d
root     851  0,0  0,1  3284  1800  ??  Ss   15:42     0:00,01 /usr/local/bin/knockd -d
root     858  0,0  0,1  3284  1800  ??  Ss   15:42     0:00,00 /usr/local/bin/knockd -d


cat /var/log/knockd.log

[2010-01-19 15:42] starting up, listening on sk0
[2010-01-19 15:42] starting up, listening on sk0
[2010-01-19 15:42] starting up, listening on sk0
может еще чего нибудь поменять надо или я что то забыл? :unknown:

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: knock на нескольких интерфейсах

Непрочитанное сообщение FreeBSP » 2010-01-19 17:56:31

брррр
надо было самому, так что подскажу
тока тсссс, никому ни-ни

делаю прям щас на своей системе

с нуля:
1) патчим knockd.c для работы на ng- интерфейсах. тебе наверное не надо, раз рулишь тока sk rl и fxp интерфейсы

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

# cd /usr/ports/security/knock
# make fetch extract patch
# vim work/knock-0.5.20051124/src/knockd.c
там вносим изменения, как в комментах учил товарищ KVIN, пересказывая слова уважаемого dth с форума http://forum.sysfaq.ru

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

 215         switch(lltype) {
 216                 case DLT_EN10MB:
 217                         dprint("ethernet interface detected\n");
 218                         break;
 219                 case DLT_LINUX_SLL:
 220                         dprint("ppp interface detected (linux \"cooked\" encapsulation)\n");
 221                         break;
 222                 case DLT_RAW:
 223                         dprint("raw interface detected, no encapsulation\n");
 224                         break;
 225                 case DLT_NULL:
 226                                 dprint("tun interface detected. pppoe on freebsd\n");
 227                         break;
 228                 default:
 229                         fprintf(stderr, "error: unsupported link-layer type: %d\n", lltype);
 230                         cleanup(1);
 231                         break;
 232         }
...

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

1204 #if defined(__FreeBSD__) || defined(__APPLE__)
1205                 eth = (struct ether_header*)packet;
1206                 if(ntohs(eth->ether_type) != ETHERTYPE_IP) {
1207                         return;
1208                 }
1209
1210                 ip = (struct ip*)(packet + sizeof(struct ether_header));
1211         } else if(lltype == DLT_LINUX_SLL) {
1212                 ip = (struct ip*)((u_char*)packet + 16);
1213         } else if(lltype == DLT_RAW) {
1214                 ip = (struct ip*)((u_char*)packet);
1215         } else if(lltype == DLT_NULL) {
1216                 ip = (struct ip*)((u_char*)packet + 4);
1217         }
1218
1219         if(ip->ip_v != 4) {
1220 #else
копировал из вима, так что даже нумерация строк есть .. для большей лучшести
потом бекапим это файлик, чтобы не потерялся

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

# cp work/knock-0.5.20051124/src/knockd.c ./
идем далее.
2) собираем и ставим

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

#make install clean
3)как я учил, копируем стартовый скрипт

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

#cat /usr/local/etc/rc.d/knockd |  sed "s/knockd/knockd2/g" >> /usr/local/etc/rc.d/knockd2
#cat /usr/local/etc/rc.d/knockd2 | \
sed 's/command="\/usr\/local\/bin\/knockd2"/command="\/usr\/local\/bin\/knockd"/g > \
/usr/local/etc/rc.d/knockd2 
и руками доводим его до такого состояния

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

# cat /usr/local/etc/rc.d/knockd2

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

#!/bin/sh

# PROVIDE: knockd2
# REQUIRE: DAEMON
# BEFORE:  LOGIN

. /etc/rc.subr

name="knockd2"
rcvar=`set_rcvar`
load_rc_config $name

knockd2_enable=${knockd2_enable:-"NO"}
knockd2_flags=${knockd2_flags:-"-d -c /usr/local/etc/knockd2.conf"}

command="/usr/local/bin/knockd"
pidfile="/var/run/knockd2.pid"
required_files="/usr/local/etc/knockd2.conf"

run_rc_command "$1"
обращаю нимание, бинарник мы оставили тот же, а ко флагам добавили конфиг
тут наверное и есть твоя загвоздка
тебе тут соответственно по образу и подобию надо получить третий файлик
4) получаем конфиги из тестового. свои текущие забекапь. будем пробовать на дефолтных

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

# cp /usr/local/etc/knockd.conf.sample /usr/local/etc/knockd2.conf 
# cp /usr/local/etc/knockd.conf.sample /usr/local/etc/knockd.conf
и руками доводим то такого состояния

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

 sh -c 'ls /usr/local/etc/ |grep -e "^knock.*conf$" |while read file; do echo "==> File $file"; cat $file; done'

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

==> File knockd.conf
[options]
        logfile = /var/log/knockd.log
        interface = ng0

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/ipfw -q add pass proto tcp src-ip %IP% dst-port 22
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/ipfw -q delete pass proto tcp src-ip %IP% dst-port 22
        tcpflags    = syn

==> File knockd2.conf
[options]
        logfile = /var/log/knockd.log
        PidFile = /var/run/knockd2.pid
        interface = rl0

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/ipfw -q add pass proto tcp src-ip %IP% dst-port 22
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/ipfw -q delete pass proto tcp src-ip %IP% dst-port 22
        tcpflags    = syn
от стандартных их отличают другие интерфейсы и наличие явного указания пидфайла во втором конфиге
он нужен чтобы работали множественные стартовые скрипты. иначе они все используют один конфиг и нормально выключается только один и демонов
4) устанавливаем возможность запуска демонов через стартовые скрипты:

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

# echo 'knockd_enable="YES"' >> /etc/rc.conf
# echo 'knockd2_enable="YES"' >> /etc/rc.conf
5) создаем и очищаем логфайл

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

# touch /var/log/knockd.log
# chmod 600 /var/log/knockd.log
# echo > /var/log/knockd.log
6) запускаем

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

[17:46]etc/# /usr/local/etc/rc.d/knockd start
Starting knockd.
[17:46]etc/# /usr/local/etc/rc.d/knockd2 start
Starting knockd2.
7) Проверяем

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

# ps -Awux |grep knock
root     71661  0,0  0,1  3284  1080  ??  Ss   17:46     0:00,00 /usr/local/bin/knockd -d
root     71669  0,0  0,1  3284  1080  ??  Ss   17:46     0:00,00 /usr/local/bin/knockd -d -c /usr/local/etc/knockd2.conf
# tail -2 /var/log/knockd.log
[2010-01-19 17:46] starting up, listening on ng0
[2010-01-19 17:46] starting up, listening on rl0
вот
заодно себе сделал "сим-сим откройся, сим-сим отдайся" а то все руки не доходили)
впереди натсройка конфигов по своему усмотрению
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

fractal
проходил мимо
Сообщения: 6
Зарегистрирован: 2010-01-14 10:02:26

Re: knock на нескольких интерфейсах

Непрочитанное сообщение fractal » 2010-01-20 9:54:46

Все работает :Yahoo!: !

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

[2010-01-20 09:23] starting up, listening on rl0
2010-01-20 09:23] starting up, listening on fxp0
[2010-01-20 09:23] starting up, listening on rl0
Спасибо тебе большое FreeBSP за то что помог получить наслаждение от UNIX :good: !

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: knock на нескольких интерфейсах

Непрочитанное сообщение FreeBSP » 2010-01-20 13:00:43

Вообще, если они слушают один и тот же интерфейс,то логично предположить что они читают один и тот же конфиг. Поэтому в man knockd находим параметр конфиг файла и вставляем его в параметры в rc скрипте

так же незачем менять имя бинарника и тем более трижды копировать его - во всех трех rc скриптах оставляем один и тот же бинарник, а во флаги добавляем указание конфига. кстати это же можно сделать и через rc.conf.

далее. запускаем всех демонов, они начинают слушать все нормально. пришибаем первый, второй не пришибается - дескать не запущен, ибо пидфайла нету. логично, что они все использовали один пидфайл и после прибития одного пидфайла не осталось. делаем killall knockd и лезем в тот же ман за параметром pidfile и указываем разные пидфайлы в конфигах. после чего все работает

итого вся работа сводится к выуживанию двух параметров из мана и применении их на практике. ну и немного логики на предмет "раз работает так, то дело в том то"
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!