Date: Thu, 18 Oct 2018 11:11:52 -0700 From: "Kristof Provost" <kristof@sigsegv.be> To: "Andreas Longwitz" <longwitz@incore.de> Cc: freebsd-pf@freebsd.org Subject: Re: rdr pass for proto tcp sometimes creates states with expire time zero and so breaking connections Message-ID: <C4D1F141-2979-4103-957F-F0314637D978@sigsegv.be> In-Reply-To: <5BC51424.5000309@incore.de> References: <5BC51424.5000309@incore.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On 15 Oct 2018, at 15:26, Andreas Longwitz wrote: > On two of my FreeBSD 10 (r338093) firewall servers some incoming ssh > connections stopped to work because pf started to create states with > expire time zero (instead of 86400 sec) for translation statements > like > > rdr pass on em0 proto tcp from any to myip port 8022 --> 10.0.0.254 > > Therefore a command given on a remote server like > > ssh -p 8022 myip sleep 15 > > did not return, because the created state for the connection was > purged > by pf (interval 10 sec) before 15 seconds. If I replace the rdr pass > rule with a rdr rule and a separate filter pass rule then the created > state always has expire time 24h and everything is ok. > > I have tried to analyze the bug in the rdr pass rule. Immediately > after > starting the above ssh command on the remote sever I see with pfctl > -vss > the sreated state on my firewall machine: > > all tcp 10.0.0.254:8022 (myip:8022) <- remoteip:59233 > ESTABLISHED:ESTABLISHED > [1443872812 + 66608] wscale 6 [1365307391 + 66560] wscale 3 > age 00:00:00, expires in 00:00:00, 13:12 pkts, 2955:3306 bytes > > and a DTrace script running at the same time gives > > 3 19323 pfsync_state_export:entry > creation=4491391. expire=4491391, state_timeout=2 > 3 16459 pf_state_expires:entry > state_timeout=86400, > start_timeout=6000, end_timeout=12000 states=882 > 3 17624 counter_u64_fetch:entry > 3 17625 counter_u64_fetch:return > returncode (states_cur)=4294967248 = 0xffffffd0 > 3 16460 pf_state_expires:return > returncode=4491391 > 3 19324 pfsync_state_export:return > creation=0. expire=0, syncstate_timeout=2 > 0 12730 pfioctl:return > returncode=0, time_uptime=4491391 > > So pf_state_expires() returns the value time_update and therefore > pfsync_state_export() gives expire zero. Reason for this is the very > big > (means negative) value returned by the function counter_u64_fetch() > for > states_cur. This variable is of type uint64_t and only incremented and > decremented by the macros STATE_INC_COUNTERS and STATE_DEC_COUNTERS. > I wonder if there’s an integer overflow in the of_state_expires() calculation. The OpenBSD people have a cast to u_int64_t in their version: timeout = (u_int64_t)timeout * (end - states) / (end - start); Perhaps this would fix your problem? (Untested, not even compiled) if (end && states > start && start < end) { if (states < end) { timeout = (uint64_t)timeout * (end - states) / (end - start); return (state->expire + timeout; } else return (time_uptime); } return (state->expire + timeout); } Best regards, Kristof From owner-freebsd-pf@freebsd.org Fri Oct 19 20:56:13 2018 Return-Path: <owner-freebsd-pf@freebsd.org> Delivered-To: freebsd-pf@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 08703FE5BBC for <freebsd-pf@mailman.ysv.freebsd.org>; Fri, 19 Oct 2018 20:56:13 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from mailman.ysv.freebsd.org (mailman.ysv.freebsd.org [IPv6:2001:1900:2254:206a::50:5]) by mx1.freebsd.org (Postfix) with ESMTP id 990088D39E for <freebsd-pf@freebsd.org>; Fri, 19 Oct 2018 20:56:12 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: by mailman.ysv.freebsd.org (Postfix) id 5A782FE5BBA; Fri, 19 Oct 2018 20:56:12 +0000 (UTC) Delivered-To: pf@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1EBC4FE5BB6 for <pf@mailman.ysv.freebsd.org>; Fri, 19 Oct 2018 20:56:12 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from mxrelay.ysv.freebsd.org (mxrelay.ysv.freebsd.org [IPv6:2001:1900:2254:206a::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.ysv.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id B43068D39C for <pf@FreeBSD.org>; Fri, 19 Oct 2018 20:56:11 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.ysv.freebsd.org (Postfix) with ESMTPS id 0DB75F4F7 for <pf@FreeBSD.org>; Fri, 19 Oct 2018 20:56:11 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id w9JKuApd016861 for <pf@FreeBSD.org>; Fri, 19 Oct 2018 20:56:10 GMT (envelope-from bugzilla-noreply@freebsd.org) Received: (from www@localhost) by kenobi.freebsd.org (8.15.2/8.15.2/Submit) id w9JKuAvP016860 for pf@FreeBSD.org; Fri, 19 Oct 2018 20:56:10 GMT (envelope-from bugzilla-noreply@freebsd.org) X-Authentication-Warning: kenobi.freebsd.org: www set sender to bugzilla-noreply@freebsd.org using -f From: bugzilla-noreply@freebsd.org To: pf@FreeBSD.org Subject: [Bug 122773] [pf] pf doesn't log uid or pid when configured to Date: Fri, 19 Oct 2018 20:56:11 +0000 X-Bugzilla-Reason: AssignedTo X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 7.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: kp@freebsd.org X-Bugzilla-Status: Open X-Bugzilla-Resolution: X-Bugzilla-Priority: Normal X-Bugzilla-Assigned-To: pf@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: cc Message-ID: <bug-122773-16861-kSm4U5fbNs@https.bugs.freebsd.org/bugzilla/> In-Reply-To: <bug-122773-16861@https.bugs.freebsd.org/bugzilla/> References: <bug-122773-16861@https.bugs.freebsd.org/bugzilla/> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-pf@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Technical discussion and general questions about packet filter \(pf\)" <freebsd-pf.freebsd.org> List-Unsubscribe: <https://lists.freebsd.org/mailman/options/freebsd-pf>, <mailto:freebsd-pf-request@freebsd.org?subject=unsubscribe> List-Archive: <http://lists.freebsd.org/pipermail/freebsd-pf/> List-Post: <mailto:freebsd-pf@freebsd.org> List-Help: <mailto:freebsd-pf-request@freebsd.org?subject=help> List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/freebsd-pf>, <mailto:freebsd-pf-request@freebsd.org?subject=subscribe> X-List-Received-Date: Fri, 19 Oct 2018 20:56:13 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D122773 Kristof Provost <kp@freebsd.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kp@freebsd.org --- Comment #5 from Kristof Provost <kp@freebsd.org> --- It looks like the kernel side of this (at least for uid) is present. I've updated the patch: diff --git a/contrib/tcpdump/print-pflog.c b/contrib/tcpdump/print-pflog.c index 265efd3c866..38201c55ee3 100644 --- a/contrib/tcpdump/print-pflog.c +++ b/contrib/tcpdump/print-pflog.c @@ -97,8 +97,12 @@ pflog_print(netdissect_options *ndo, const struct pflogh= dr *hdr) else ND_PRINT((ndo, "rule %u.%s.%u/", rulenr, hdr->ruleset, subrulenr)); - ND_PRINT((ndo, "%s: %s %s on %s: ", - tok2str(pf_reasons, "unkn(%u)", hdr->reason), + ND_PRINT((ndo, "%s", tok2str(pf_reasons, "unkn(%u)", hdr->reason))); + + if (hdr->uid !=3D UID_MAX) + ND_PRINT((ndo, " [uid %u]", (unsigned)hdr->uid)); + + ND_PRINT((ndo, ": %s %s on %s: ", tok2str(pf_actions, "unkn(%u)", hdr->action), tok2str(pf_directions, "unkn(%u)", hdr->dir), hdr->ifname)); A simple ping now produces this: tcpdump: listening on pflog0, link-type PFLOG (OpenBSD pflog file), capture size 262144 bytes 00:00:00.000000 rule 0/0(match) [uid 1001]: pass out on vtnet0: (tos 0x0, = ttl 64, id 20885, offset 0, flags [none], proto UDP (17), length 55) 172.16.2.2.64345 > 172.16.2.1.53: [bad udp cksum 0x5c58 -> 0x964f!] 271= 30+ A? google.be. (27) 00:00:00.071014 rule 0/0(match) [uid 0]: pass out on vtnet0: (tos 0x0, ttl= 64, id 63862, offset 0, flags [none], proto ICMP (1), length 84) 172.16.2.2 > 172.217.18.163: ICMP echo request, id 35102, seq 0, length= 64 If anyone is still interested in this, can you test it and let me know if t= his works for you? --=20 You are receiving this mail because: You are the assignee for the bug.=
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?C4D1F141-2979-4103-957F-F0314637D978>