достаточно ли для _полноценной_ работы subj переместить блок с fr_checkp на позицию после метки pass? оно работает, но у меня нет возможности тестирование по полной программе устроить. переносить в netinet/ip_input.c, если надо иметь в ipfw внешние адреса (до nat на input и после nat на output); в netinet/ip_output.c, если надо иметь в ipfw внутренние адреса (после nat на input и до nat на output). например такой вот патчик, в ipfw имеем внутренние адреса ·-───────────────[ Begin of 1.diff ]──────────────--· -+- netinet/ip_output.c.std Sat Mar 13 17:44:24 2004 +++ netinet/ip_output.c Fri Apr 2 19:25:21 2004 @@ -724,14 +724,6 @@ * - Wrap: fake packet`s addr/port <unimpl.> * - Encapsulate: put it in another IP and send out. <unimp.> */ - if (fr_checkp) { - struct mbuf *m1 = m; - - if ((error = (*fr_checkp)(ip, hlen, ifp, 1, &m1)) || !m1) - goto done; - ip = mtod(m = m1, struct ip *); - } - /* * Check with the firewall... * but not if we are already being fwd`d from a firewall. @@ -964,6 +956,15 @@ } pass: + + if (fr_checkp) { + struct mbuf *m1 = m; + + if ((error = (*fr_checkp)(ip, hlen, ifp, 1, &m1)) || !m1) + goto done; + ip = mtod(m = m1, struct ip *); + } + /* 127/8 must not appear on wire - RFC1122. */ if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) { ·-───────────────[ End of 1.diff ]──────── Vladimir