22.02.11 @ 20:33 Alexey Karguine wrote:

Имеется машина с 8.1. ОС ставилась с нуля. Ядро GENERIC. Никакие переменные в sysctl.conf и loader.conf не заданы.

[mu] /var/crash % uname -a
FreeBSD mu.global-net.ru 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:55:53 UTC 2010 [email protected]:/usr/obj/usr/src/sys/GENERIC i386

[mu] /var/crash % kldstat
Id Refs Address    Size     Name
 1    8 0xc0400000 bb5504   kernel
 2    1 0xc5ea1000 37000    ipl.ko
 3    1 0xc60e6000 11000    ipfw.ko
 4    1 0xc60f8000 d000     libalias.ko


В машине установлены две интеловские гигабитные карточки. На одной из них подняты два влана. Работает quagga, забирает bgp-маршруты (не full-view). Также эта машина натит трафик с помощью ipnat.

А зачем ipfw/libalias, если ipnat?

Проблема заключается в том, что не реже одного раза в неделю эта машина ловит kernel panic и перегружается.

Менять пробовал всё, что только можно: сетевые карты, полностью компьютер с переустановкой ОСи начисто, блок питания, патч-корды.

Зачем это шаманство, если по dmesg явно видно активное сканирование tcp-портов?

#6  0xc0bb67bb in calltrap () at /usr/src/sys/i386/i386/exception.s:165
#7  0xc5ea206a in nat_new (fin=0xc5335968, np=0xc579ba00, natsave=0x0,

fault virtual address   = 0x4
fault code              = supervisor read, page not present

(kgdb) list *0xc5ea206a

0xc5ea206a is in nat_new (/usr/src/sys/modules/ipfilter/../../contrib/ipfilter/netinet/ip_nat.c:2610).
2605            nat->nat_ifps[1] = np->in_ifps[1];
2606            nat->nat_ptr = np;
2607            nat->nat_p = fin->fin_p;
2608            nat->nat_mssclamp = np->in_mssclamp;
2609            if (nat->nat_p == IPPROTO_TCP)
2610                    nat->nat_seqnext[0] = ntohl(tcp->th_seq);
2611    
2612            if ((np->in_apr != NULL) && ((ni->nai_flags & NAT_SLAVE) == 0))
2613                    if (appr_new(fin, nat) == -1)
2614                            return -1;
(kgdb)

Я не знаком с этим кодом, но, похоже, где-то битый указатель, то ли natsave, то ли tcp. Делать up в kgdb до тех пор, пока не будет в функции nat_new(), после чего сделать p nat и p tcp, если какой-то из них ненулевой, делать p *nat и p *tcp. Полученное вместе с трейсом в send-pr.

Опыта в отлове таких проблем у меня нет никакого, но чувствую, что дело в нате. Куда копать, что пробовать?

Пробовать лучше перейти на другой нат - ipfilter давно уже deprecated.
Покопать можно в сторону зарезки лишних пакетов (сканы портов).

--
WBR, Vadim Goncharov

Ответить