kern/121743: ipfw in-kernel nat loses fragmented packets
Vadim Goncharov
vadim_nuclight at mail.ru
Mon Mar 17 12:30:04 UTC 2008
The following reply was made to PR kern/121743; it has been noted by GNATS.
From: Vadim Goncharov <vadim_nuclight at mail.ru>
To: Alexander Zagrebin <alexz at visp.ru>
Cc: bug-followup at freebsd.org
Subject: Re: kern/121743: ipfw in-kernel nat loses fragmented packets
Date: Mon, 17 Mar 2008 18:23:02 +0600
Hi Alexander Zagrebin!
On Mon, 17 Mar 2008 12:10:02 GMT; Alexander Zagrebin <alexz at visp.ru> wrote:
>>> --- sys/netinet/ip_fw2.c.orig 2008-02-28 11:28:09.000000000 +0300
>>> +++ sys/netinet/ip_fw2.c 2008-03-15 18:41:52.000000000 +0300
>>> @@ -3568,7 +3568,8 @@
>>> else
>>> retval =
>> LibAliasOut(t->lib, c,
>>> MCLBYTES);
>>> - if (retval != PKT_ALIAS_OK) {
>>> + if (retval != PKT_ALIAS_OK &&
>>> + retval !=
>> PKT_ALIAS_FOUND_HEADER_FRAGMENT) {
>>> /* XXX - should i
>> add some logging? */
>>> m_free(mcl);
>>> badnat:
>>
>> This is not so simple to fix as LibAlias API requires caller
>> to save packet
>> fragments somewhere and then at some time to feed them all
>> back. And kernel
>> infrastructure currently is not so suitable for that packet storage.
> /sbin/natd doesn't use this method too. But it is in source tree and works.
natd(8) relies on a divert(4) socket on doing reassembly, again in kernel - and
ppp(8) actually use this method.
> This patch will work at most cases.
> It is better to work with a bad patch, than to not work absolutely.
No, that's not FreeBSD way. Especially when you have workaround available.
>> As a workaround you can currently send packets with some ipfw
>> rule before NAT
>> to a divert socket on wich ng_ksocket listens and returns
>> packets back with
>> ng_echo (thus packets won't leave kernel), as divert sockets do packet
>> reassembly.
> So ng_ksocket has kernel memory for fragmented packet's buffer, but libalias
> not? :)
Yes, because libalias(3) was developed more than 10 years for ppp(8), and was
never ment to be ported to the kernel (it still has many-many quirks). Kernel
sockets, and divert(4) as well, all use finite reassembly space for packets
destined to this machine. This is not a problem with natd(8) as it is not so
fast, but for more intensive solutions with in-kernel libalias a better
solution should be found.
--
WBR, Vadim Goncharov. ICQ#166852181 mailto:vadim_nuclight at mail.ru
[Moderator of RU.ANTI-ECOLOGY][FreeBSD][http://antigreen.org][LJ:/nuclight]
More information about the freebsd-ipfw
mailing list