Index: pf.c =================================================================== RCS file: /cvs/src/sys/net/pf.c,v retrieving revision 1.1107 diff -u -p -r1.1107 pf.c --- pf.c 3 Feb 2021 07:41:12 -0000 1.1107 +++ pf.c 4 Feb 2021 22:43:11 -0000 @@ -6015,7 +6015,7 @@ pf_route(struct pf_pdesc *pd, struct pf_ rtableid = m0->m_pkthdr.ph_rtableid; rt = rtalloc(sintosa(dst), RT_RESOLVE, rtableid); - if (!rtisvalid(rt)) { + if (!rtisvalid(rt) || ISSET(rt->rt_flags, RTF_LOCAL)) { if (s->rt != PF_DUPTO) { pf_send_icmp(m0, ICMP_UNREACH, ICMP_UNREACH_HOST, 0, pd->af, s->rule.ptr, pd->rdomain); @@ -6025,7 +6025,7 @@ pf_route(struct pf_pdesc *pd, struct pf_ } ifp = if_get(rt->rt_ifidx); - if (ifp == NULL) + if (ifp == NULL || ISSET(ifp->if_flags, IFF_LOOPBACK)) goto bad; /* A locally generated packet may have invalid source address. */ @@ -6159,7 +6159,7 @@ pf_route6(struct pf_pdesc *pd, struct pf if (IN6_IS_SCOPE_EMBED(&dst->sin6_addr)) dst->sin6_addr.s6_addr16[1] = htons(ifp->if_index); rt = rtalloc(sin6tosa(dst), RT_RESOLVE, rtableid); - if (!rtisvalid(rt)) { + if (!rtisvalid(rt) || ISSET(rt->rt_flags, RTF_LOCAL)) { if (s->rt != PF_DUPTO) { pf_send_icmp(m0, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOROUTE, 0, @@ -6170,7 +6170,7 @@ pf_route6(struct pf_pdesc *pd, struct pf } ifp = if_get(rt->rt_ifidx); - if (ifp == NULL) + if (ifp == NULL || ISSET(ifp->if_flags, IFF_LOOPBACK)) goto bad; /* A locally generated packet may have invalid source address. */