Darren Reed wrote:
Steve Clark wrote:
> Hi Darren,
...
..
Not unexpected.
See below for the patch I should have sent you the first time.
Darren
Index: ip_nat.c
===================================================================
RCS file: /devel/CVS/IP-Filter/ip_nat.c,v
retrieving revision 2.195.2.105
diff -c -r2.195.2.105 ip_nat.c
*** ip_nat.c 21 Dec 2007 23:03:24 -0000 2.195.2.105
--- ip_nat.c 7 Feb 2008 01:41:35 -0000
***************
*** 2587,2593 ****
nat->nat_ptr = np;
nat->nat_p = fin->fin_p;
nat->nat_mssclamp = np->in_mssclamp;
! if (nat->nat_p == IPPROTO_TCP)
nat->nat_seqnext[0] = ntohl(tcp->th_seq);
if ((np->in_apr != NULL) && ((ni->nai_flags & NAT_SLAVE) == 0))
--- 2587,2593 ----
nat->nat_ptr = np;
nat->nat_p = fin->fin_p;
nat->nat_mssclamp = np->in_mssclamp;
! if (nat->nat_p == IPPROTO_TCP && tcp != NULL)
nat->nat_seqnext[0] = ntohl(tcp->th_seq);
if ((np->in_apr != NULL) && ((ni->nai_flags & NAT_SLAVE) == 0))
***************
*** 3678,3704 ****
ifq2 = NULL;
if (nat->nat_p == IPPROTO_TCP && ifq2 == NULL) {
! u_32_t end, ack;
! u_char tcpflags;
! tcphdr_t *tcp;
! int dsize;
! tcp = fin->fin_dp;
! tcpflags = tcp->th_flags;
! dsize = fin->fin_dlen - (TCP_OFF(tcp) << 2) +
! ((tcpflags & TH_SYN) ? 1 : 0) +
! ((tcpflags & TH_FIN) ? 1 : 0);
! ack = ntohl(tcp->th_ack);
! end = ntohl(tcp->th_seq) + dsize;
! if (SEQ_GT(ack, nat->nat_seqnext[1 - fin->fin_rev]))
! nat->nat_seqnext[1 - fin->fin_rev] = ack;
! if (nat->nat_seqnext[fin->fin_rev] == 0)
! nat->nat_seqnext[fin->fin_rev] = end;
! (void) fr_tcp_age(&nat->nat_tqe, fin, nat_tqb, 0);
} else {
if (ifq2 == NULL) {
if (nat->nat_p == IPPROTO_UDP)
--- 3678,3706 ----
ifq2 = NULL;
if (nat->nat_p == IPPROTO_TCP && ifq2 == NULL) {
! if (!fin->fin_off) {
! u_32_t end, ack;
! u_char tcpflags;
! tcphdr_t *tcp;
! int dsize;
! tcp = fin->fin_dp;
! tcpflags = tcp->th_flags;
! dsize = fin->fin_dlen - (TCP_OFF(tcp) << 2) +
! ((tcpflags & TH_SYN) ? 1 : 0) +
! ((tcpflags & TH_FIN) ? 1 : 0);
! ack = ntohl(tcp->th_ack);
! end = ntohl(tcp->th_seq) + dsize;
! if (SEQ_GT(ack, nat->nat_seqnext[1 - fin->fin_rev]))
! nat->nat_seqnext[1 - fin->fin_rev] = ack;
! if (nat->nat_seqnext[fin->fin_rev] == 0)
! nat->nat_seqnext[fin->fin_rev] = end;
! (void) fr_tcp_age(&nat->nat_tqe, fin, nat_tqb, 0);
! }
} else {
if (ifq2 == NULL) {
if (nat->nat_p == IPPROTO_UDP)
Hi Darren,
Since I knew it was night time "down under" I went ahead and just
changed to code
to print a message and return -1 in nat_finalise() then the tcp
pointer was null.
The system has stayed up now almost 24 hours - where yesterday it had
20 panics.
Is there some reason we wouldn't want to just dump/ignore this packet,
since it seems to
me that the initial syn and at least the first packet of the
fragmented series had gotten lost
and eventually will be retried.
Steve