pf's log(matches), essentially rule match tracing, is a great
debugging method. You probably don't want that to end up in your
regular pf logs tho. So just use a different pflog interface for that.
Didn't work yet, because the target pflog interface was taken from the
rule that matches, not the log(matches) rule triggering the logging.

Index: net/if_pflog.c
===================================================================
RCS file: /cvs/src/sys/net/if_pflog.c,v
retrieving revision 1.67
diff -u -p -r1.67 if_pflog.c
--- net/if_pflog.c      19 Dec 2014 17:14:39 -0000      1.67
+++ net/if_pflog.c      8 Feb 2015 05:08:57 -0000
@@ -241,7 +241,7 @@ pflogioctl(struct ifnet *ifp, u_long cmd
 
 int
 pflog_packet(struct pf_pdesc *pd, u_int8_t reason, struct pf_rule *rm,
-    struct pf_rule *am, struct pf_ruleset *ruleset)
+    struct pf_rule *am, struct pf_ruleset *ruleset, struct pf_rule *trigger)
 {
 #if NBPFILTER > 0
        struct ifnet *ifn;
@@ -249,9 +249,11 @@ pflog_packet(struct pf_pdesc *pd, u_int8
 
        if (rm == NULL || pd == NULL || pd->kif == NULL || pd->m == NULL)
                return (-1);
+       if (trigger == NULL)
+               trigger = rm;
 
-       if (rm->logif >= npflogifs || (ifn = pflogifs[rm->logif]) == NULL ||
-           !ifn->if_bpf)
+       if (trigger->logif >= npflogifs || (ifn = pflogifs[trigger->logif]) ==
+           NULL || !ifn->if_bpf)
                return (0);
 
        bzero(&hdr, sizeof(hdr));
@@ -270,7 +272,7 @@ pflog_packet(struct pf_pdesc *pd, u_int8
                        strlcpy(hdr.ruleset, ruleset->anchor->name,
                            sizeof(hdr.ruleset));
        }
-       if (rm->log & PF_LOG_SOCKET_LOOKUP && !pd->lookup.done)
+       if (trigger->log & PF_LOG_SOCKET_LOOKUP && !pd->lookup.done)
                pd->lookup.done = pf_socket_lookup(pd);
        if (pd->lookup.done > 0) {
                hdr.uid = pd->lookup.uid;
Index: net/if_pflog.h
===================================================================
RCS file: /cvs/src/sys/net/if_pflog.h,v
retrieving revision 1.25
diff -u -p -r1.25 if_pflog.h
--- net/if_pflog.h      9 Jul 2014 11:03:04 -0000       1.25
+++ net/if_pflog.h      8 Feb 2015 04:54:43 -0000
@@ -68,9 +68,9 @@ struct pflog_softc {
 };
 
 #if NPFLOG > 0
-#define        PFLOG_PACKET(a,b,c,d,e) pflog_packet(a,b,c,d,e)
+#define        PFLOG_PACKET(a,b,c,d,e,f) pflog_packet(a,b,c,d,e,f)
 #else
-#define        PFLOG_PACKET(a,b,c,d,e) ((void)0)
+#define        PFLOG_PACKET(a,b,c,d,e,f) ((void)0)
 #endif /* NPFLOG > 0 */
 #endif /* _KERNEL */
 #endif /* _NET_IF_PFLOG_H_ */
Index: net/pf.c
===================================================================
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.901
diff -u -p -r1.901 pf.c
--- net/pf.c    7 Feb 2015 09:15:25 -0000       1.901
+++ net/pf.c    9 Feb 2015 07:01:39 -0000
@@ -232,6 +232,9 @@ int                  pf_step_out_of_anchor(int *, stru
 void                    pf_counters_inc(int, struct pf_pdesc *,
                            struct pf_state *, struct pf_rule *,
                            struct pf_rule *);
+void                    pf_log_matches(struct pf_pdesc *, struct pf_rule *,
+                           struct pf_rule *, struct pf_ruleset *,
+                           struct pf_rule_slist *);
 
 extern struct pool pfr_ktable_pl;
 extern struct pool pfr_kentry_pl;
@@ -3249,9 +3252,10 @@ pf_test_rule(struct pf_pdesc *pd, struct
                                        REASON_SET(&reason, PFRES_TRANSLATE);
                                        goto cleanup;
                                }
-                               if (r->log || act.log & PF_LOG_MATCHES) {
+                               if (r->log) {
                                        REASON_SET(&reason, PFRES_MATCH);
-                                       PFLOG_PACKET(pd, reason, r, a, ruleset);
+                                       PFLOG_PACKET(pd, reason, r, a, ruleset,
+                                           NULL);
                                }
                        } else {
                                match = asd;
@@ -3259,12 +3263,11 @@ pf_test_rule(struct pf_pdesc *pd, struct
                                *am = a;
                                *rsm = ruleset;
                                arsm = aruleset;
-                               if (act.log & PF_LOG_MATCHES) {
-                                       REASON_SET(&reason, PFRES_MATCH);
-                                       PFLOG_PACKET(pd, reason, r, a, ruleset);
-                               }
                        }
 
+                       if (act.log & PF_LOG_MATCHES)
+                               pf_log_matches(pd, r, a, ruleset, &rules);
+
                        if (r->quick)
                                break;
                        r = TAILQ_NEXT(r, entries);
@@ -3293,8 +3296,10 @@ pf_test_rule(struct pf_pdesc *pd, struct
        }
        REASON_SET(&reason, PFRES_MATCH);
 
-       if (r->log || act.log & PF_LOG_MATCHES)
-               PFLOG_PACKET(pd, reason, r, a, ruleset);
+       if (r->log)
+               PFLOG_PACKET(pd, reason, r, a, ruleset, NULL);
+       if (act.log & PF_LOG_MATCHES)
+               pf_log_matches(pd, r, a, ruleset, &rules);
 
        if (pd->virtual_proto != PF_VPROTO_FRAGMENT &&
            (r->action == PF_DROP) &&
@@ -6543,12 +6548,12 @@ done:
                struct pf_rule_item     *ri;
 
                if (pd.pflog & PF_LOG_FORCE || r->log & PF_LOG_ALL)
-                       PFLOG_PACKET(&pd, reason, r, a, ruleset);
+                       PFLOG_PACKET(&pd, reason, r, a, ruleset, NULL);
                if (s) {
                        SLIST_FOREACH(ri, &s->match_rules, entry)
                                if (ri->r->log & PF_LOG_ALL)
                                        PFLOG_PACKET(&pd, reason, ri->r, a,
-                                           ruleset);
+                                           ruleset, NULL);
                }
        }
 
@@ -6677,4 +6682,19 @@ void
 pf_pkt_addr_changed(struct mbuf *m)
 {
        m->m_pkthdr.pf.statekey = NULL;
+}
+
+void
+pf_log_matches(struct pf_pdesc *pd, struct pf_rule *rm, struct pf_rule *am,
+    struct pf_ruleset *ruleset, struct pf_rule_slist *matchrules)
+{
+       struct pf_rule_item     *ri;
+
+       /* if this is the log(matches) rule, packet has been logged already */
+       if (rm->log & PF_LOG_MATCHES)
+               return;
+
+       SLIST_FOREACH(ri, matchrules, entry)
+               if (ri->r->log & PF_LOG_MATCHES)
+                       PFLOG_PACKET(pd, PFRES_MATCH, rm, am, ruleset, ri->r);
 }
Index: net/pfvar.h
===================================================================
RCS file: /cvs/src/sys/net/pfvar.h,v
retrieving revision 1.409
diff -u -p -r1.409 pfvar.h
--- net/pfvar.h 7 Feb 2015 06:27:46 -0000       1.409
+++ net/pfvar.h 8 Feb 2015 05:10:02 -0000
@@ -1814,7 +1814,7 @@ void      pf_change_a(struct pf_pdesc *, void
 int    pf_check_proto_cksum(struct pf_pdesc *, int, int, u_int8_t,
            sa_family_t);
 int    pflog_packet(struct pf_pdesc *, u_int8_t, struct pf_rule *,
-           struct pf_rule *, struct pf_ruleset *);
+           struct pf_rule *, struct pf_ruleset *, struct pf_rule *);
 void   pf_send_deferred_syn(struct pf_state *);
 int    pf_match_addr(u_int8_t, struct pf_addr *, struct pf_addr *,
            struct pf_addr *, sa_family_t);


-- 
Henning Brauer, h...@bsws.de, henn...@openbsd.org
BS Web Services GmbH, http://bsws.de, Full-Service ISP
Secure Hosting, Mail and DNS. Virtual & Dedicated Servers, Root to Fully Managed
Henning Brauer Consulting, http://henningbrauer.com/

Reply via email to