Hi,

sysctl net.inet.ip.forwarding is checked before ip_input() passes
the packet to ip_forward().  But with an af-to rule, pf(4) calls
ip_forward() directly.  I think we should check the sysctl also in
pf to get consistent behaviour.

ok?

bluhm

Index: net/pf.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pf.c,v
retrieving revision 1.1098
diff -u -p -r1.1098 pf.c
--- net/pf.c    14 Jan 2021 09:44:33 -0000      1.1098
+++ net/pf.c    15 Jan 2021 11:08:31 -0000
@@ -7259,20 +7259,32 @@ done:
                pd.m->m_pkthdr.pf.flags |= PF_TAG_GENERATED;
                switch (pd.naf) {
                case AF_INET:
-                       if (pd.dir == PF_IN)
+                       if (pd.dir == PF_IN) {
+                               if (ipforwarding == 0) {
+                                       ipstat_inc(ips_cantforward);
+                                       action = PF_DROP;
+                                       break;
+                               }
                                ip_forward(pd.m, ifp, NULL, 1);
-                       else
+                       } else
                                ip_output(pd.m, NULL, NULL, 0, NULL, NULL, 0);
                        break;
                case AF_INET6:
-                       if (pd.dir == PF_IN)
+                       if (pd.dir == PF_IN) {
+                               if (ip6_forwarding == 0) {
+                                       ip6stat_inc(ip6s_cantforward);
+                                       action = PF_DROP;
+                                       break;
+                               }
                                ip6_forward(pd.m, NULL, 1);
-                       else
+                       } else
                                ip6_output(pd.m, NULL, NULL, 0, NULL, NULL);
                        break;
                }
-               pd.m = NULL;
-               action = PF_PASS;
+               if (action != PF_DROP) {
+                       pd.m = NULL;
+                       action = PF_PASS;
+               }
                break;
 #endif /* INET6 */
        case PF_DROP:

Reply via email to