In some email I received from [EMAIL PROTECTED], sie wrote:
> (concerning 4.1):
> 
> > 3. a solaris server behind the firewall could
> not traceroute outside of the network (icmp nat).
> 
> 
> This is also true of 3.4.33 - traceroute from behind
> a NAT'ed firewall quit working.   It had worked in
> 3.4.31.   Traceroute from the firewall itself still
> works even on 3.4.33.

Try this patch for 3.4.33:

Index: ip_nat.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_nat.c,v
retrieving revision 2.37.2.80
diff -u -r2.37.2.80 ip_nat.c
--- ip_nat.c    2004/02/11 15:16:22     2.37.2.80
+++ ip_nat.c    2004/03/11 13:46:52
@@ -2028,7 +2028,7 @@
                if (sumd2) {
                        sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
                        sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
-                       if (nat->nat_dir == NAT_OUTBOUND) {
+                       if (nat->nat_dir == NAT_INBOUND) {
                                fix_outcksum(fin, &icmp->icmp_cksum, sumd2);
                        } else {
                                fix_incksum(fin, &icmp->icmp_cksum, sumd2);

And for 4.1+, use this patch:

Index: ip_nat.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_nat.c,v
retrieving revision 2.195.2.1
diff -u -r2.195.2.1 ip_nat.c
--- ip_nat.c    6 Mar 2004 14:33:03 -0000       2.195.2.1
+++ ip_nat.c    11 Mar 2004 13:47:00 -0000
@@ -2747,7 +2747,7 @@
                 *
                 * To further complicate: the TCP checksum is not in the first
                 * 8 bytes of the offending ip packet, so it most likely is not
-                * available. OSses like Solaris return enough bytes to
+                * available. Some OSses like Solaris return enough bytes to
                 * include the TCP checksum. So we have to check if the
                 * ip->ip_len actually holds the TCP checksum of the oip!
                 */
@@ -2843,7 +2843,7 @@
                                         * UDP checksum adjustment.
                                         */
                                        CALC_SUMD(sum1, sum2, sumd);
-                                       sumd2 += sumd2;
+                                       sumd2 += sumd;
                                }
 
                                /*
@@ -2870,7 +2870,7 @@
                if (sumd2 != 0) {
                        sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
                        sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
-                       if (nat->nat_dir == NAT_OUTBOUND) {
+                       if (nat->nat_dir == NAT_INBOUND) {
                                fix_outcksum(fin, &icmp->icmp_cksum, sumd2);
                        } else {
                                fix_incksum(fin, &icmp->icmp_cksum, sumd2);

Please test with redirect rules as well as unreachable messages.

Darren

Reply via email to