Ключевые слова:ipfw, freebsd, patch, (найти похожие документы)
Date: Fri, 02 Apr 2004 18:42:46 +0600
From: Vladimir Kurtukov <Vladimir_Kurtukov@p1.f9.n5006.z2.fidonet.org>
Newsgroups: ftn.ru.unix.bsd
Subject: Патч для работы ipfw stateful + ipnat
достаточно ли для _полноценной_ работы 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
ИМХО, достаточно.
В ip_output.c между метками pass и done есть только sendorfree.
Переход на нее есть только в коде после метки pass.
Т.о. если пакет пригоден к отправке, управление всегда перейдет к коду у метки pass, что и нужно.