брррр
надо было самому, так что подскажу
тока тсссс, никому ни-ни
делаю прям щас на своей системе
с нуля:
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) собираем и ставим
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
и руками доводим его до такого состояния
Код: Выделить всё
#!/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 системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!