[Bug 268717] [pf] rdr rules don't work for traffic originating at localhost
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 06 Jan 2023 02:39:02 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268717 Kristof Provost <kp@freebsd.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kp@freebsd.org --- Comment #7 from Kristof Provost <kp@freebsd.org> --- (In reply to dfr from comment #6) I've been poking at this a bit as well (briefly, because I'm supposed to be on vacation), and I believe your diagnosis may be correct. To summarise what I've done so far: after turning your script into a atf-sh test case I can reproduce the problem, and poke at things with dtrace. The test script sets up a vnet jail (IP 192.0.2.1) with an rdr rule redirecting traffic for 192.0.2.1:8080 to 192.0.2.2:8080. The following D script: #!/usr/sbin/dtrace -s fbt:pf:pf_state_insert:entry { s = (struct pf_state_key *)arg2; printf("%x -> %x, %d:%d af %d proto %d\n", s->addr[0].pfa.v4.s_addr, s->addr[1].pfa.v4.s_addr, ntohs(s->port[0]), ntohs(s->port[1]), s->af, s->proto); s = (struct pf_state_key *)arg3; printf("%x -> %x, %d:%d af %d proto %d", s->addr[0].pfa.v4.s_addr, s->addr[1].pfa.v4.s_addr, ntohs(s->port[0]), ntohs(s->port[1]), s->af, s->proto); stack(); } fbt:pf:pf_find_state:entry { s = (struct pf_state_key *)arg1; printf("%x -> %x, %d:%d af %d proto %d", s->addr[0].pfa.v4.s_addr, s->addr[1].pfa.v4.s_addr, ntohs(s->port[0]), ntohs(s->port[1]), s->af, s->proto); } fbt:pf:pf_find_state:return { printf("=> %p", arg1); } produces dtrace: script '/home/kp/pf.dtrace' matched 3 probes CPU ID FUNCTION:NAME 5 80283 pf_find_state:entry 10200c0 -> 10200c0, 8080:40477 af 2 proto 6 5 80284 pf_find_state:return => 0 6 80283 pf_find_state:entry 10200c0 -> 10200c0, 40477:8080 af 2 proto 6 6 80284 pf_find_state:return => 0 6 80537 pf_state_insert:entry 10200c0 -> 10200c0, 40477:8080 af 2 proto 6 10200c0 -> 20200c0, 40477:8080 af 2 proto 6 pf.ko`pf_test_rule+0x282b pf.ko`pf_check_in+0x25 kernel`pfil_mbuf_in+0x55 kernel`ip_input+0x3c6 kernel`swi_net+0x191 kernel`ithread_loop+0x279 kernel`fork_exit+0x80 kernel`0xffffffff810a44ae 6 80283 pf_find_state:entry 20200c0 -> 10200c0, 8080:40477 af 2 proto 6 6 80284 pf_find_state:return => 0 So I think that matches your diagnosis, in that we're creating states (both the original 192.0.2.1 to 192.0.2.1 and rdr'd 192.0.2.1 to 192.0.2.2 traffic, but only on PF_IN. When the reply comes in we don't find a corresponding state, and things don't work. I'm rather wary of inserting special case handling for this in pf_test(). I wonder if we don't need to add a pfil call in the if_lo handling somewhere, to make that traffic match the normal (i.e. non-loopback) traffic patter. -- You are receiving this mail because: You are the assignee for the bug.