Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Mar 2000 14:39:00 +0930
From:      Ian West <ian@niw.com.au>
To:        Ian West <freebsd-net@freebsd.org>
Subject:   Re: ipfw tee
Message-ID:  <20000328143900.L78585@rose.niw.com.au>
In-Reply-To: <20000328123243.I78585@rose.niw.com.au>; from ian@niw.com.au on Tue, Mar 28, 2000 at 12:32:43PM %2B0930
References:  <20000328123243.I78585@rose.niw.com.au>

next in thread | previous in thread | raw e-mail | index | archive | help
To add to previous, after a bit more testing, the following patch fixes
an issue where the ipfw rule number was not passed through to recvfrom
call in client. I now have a consumer of tee'd packets running, and it
still seems to be working without any problems. I have not yet tried
this in an environment with a real divert (say for nat) working yet.

Index: ip_fw.c
=========================================================================
RCS file: /cvs/freebsd/src/sys/netinet/ip_fw.c,v
retrieving revision 1.132
diff -u -r1.132 ip_fw.c
--- ip_fw.c     2000/03/14 14:11:53     1.132
+++ ip_fw.c     2000/03/28 05:05:35
@@ -1278,8 +1278,20 @@
                        *cookie = f->fw_number;
                        return(f->fw_divert_port);
                case IP_FW_F_TEE:
-                       *cookie = f->fw_number;
-                       return(f->fw_divert_port | IP_FW_PORT_TEE_FLAG);
+                       {
+                               struct mbuf *clone;
+                               struct ip *cip;
+                               u_int16_t divert_cookie;
+                               divert_cookie=ip_divert_cookie;
+                               ip_divert_cookie = f->fw_number;
+                               clone=m_dup(*m, M_DONTWAIT);
+                               cip = mtod(clone, struct ip *);
+                               HTONS(cip->ip_len);
+                               HTONS(cip->ip_off);
+                               divert_packet(clone,0,f->fw_divert_port);
+                               ip_divert_cookie=divert_cookie;
+                       }
+                       continue;
 #endif
                case IP_FW_F_SKIPTO: /* XXX check */
                        if ( f->next_rule_ptr )

=========================================================================
On Tue, Mar 28, 2000 at 12:32:43PM +0930, Ian West wrote:
> Hi, I have been looking at ipfw tee operation, specifically to see if I
> can make it tee to a divert socket without terminating. I would like to
> use this for logging traffic with more detail as to source and
> destination addresses without running through and processing syslog
> files :-).
> 
> My though is to be able to tee traffic outbound prior to nat, and inbound
> after nat so that I can see the real source and dest addresses.
> 
> It seems from a couple of hours (minimal) looking at it that by 'teeing'
> in the ip_fw_chk itself, we can just 'continue' as per count, and all
> works well. I have tested this briefly, and it doesn;t seem to kill
> anything. Can anyone point me at other important things to look at ?
> 
> vmstat -m does not show any mbuf's going missing. netstat -m shows no
> slow increase. Everything still seems to work :-)
> 
> Output from ipfw -a l on the box I am testing with..
> 
> 01000 110270 149841377 tee 12345 ip from any to any
> 65000 110270 149841377 allow ip from any to any
> 65535      0         0 deny ip from any to any
> 
> This suggests that it is doing roughly what I want, although I have not
> hooked anything onto the divert socket so I cannot say for sure.
> 
> Is what I am doing valid ? (close ?)
> 
> The diff that I have been testing with is below..
> 
> Index: ip_fw.c
> ===================================================================
> RCS file: /cvs/freebsd/src/sys/netinet/ip_fw.c,v
> retrieving revision 1.132
> diff -u -r1.132 ip_fw.c
> --- ip_fw.c     2000/03/14 14:11:53     1.132
> +++ ip_fw.c     2000/03/28 02:39:16
> @@ -1278,8 +1278,17 @@
>                         *cookie = f->fw_number;
>                         return(f->fw_divert_port);
>                 case IP_FW_F_TEE:
> -                       *cookie = f->fw_number;
> -                       return(f->fw_divert_port | IP_FW_PORT_TEE_FLAG);
> +                       {
> +                               struct mbuf *clone;
> +                               struct ip *cip;
> +                               *cookie = f->fw_number;
> +                               clone=m_dup(*m, M_DONTWAIT);
> +                               cip = mtod(clone, struct ip *);
> +                               HTONS(cip->ip_len);
> +                               HTONS(cip->ip_off);
> +                               divert_packet(clone,0,f->fw_divert_port);
> +                       }
> +                       continue;
>  #endif
>                 case IP_FW_F_SKIPTO: /* XXX check */
>                         if ( f->next_rule_ptr )
> 
> 
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-net" in the body of the message


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000328143900.L78585>