Apologies, correction:

obsd3# pfctl -f /etc/pf.conf

Should be:

obsd2# pfctl -f /etc/pf.conf

Joe
On Sat, May 12, 2018 at 9:37 PM Joseph Crivello <josephcrive...@gmail.com>
wrote:

> I cannot get reply-to working with if-bound under any circumstances. It
> works fine with floating, though.

> Is this expected behavior? The (similar) route-to option works fine with
> if-bound rules, and I cannot find any documentation that states reply-to
> cannot be used with if-bound rules.

> Assuming that this is NOT expected behavior, then this is a bug in at
least
> 6.2 through -current.

> I set up three virtual machines running -current today, in order to
> reproduce this with a basic test case:

> obsd1# echo "inet 10.84.31.10 255.255.255.0" > /etc/hostname.vmx1
> obsd1# echo "inet 10.84.32.10 255.255.255.0" > /etc/hostname.vmx2
> obsd1# echo "net.inet.ip.forwarding=1" > /etc/sysctl.conf
> obsd1# reboot
> ...
> obsd1# route add -net 10.84.33.0/24 10.84.31.11

> obsd2# echo "inet 10.84.31.11 255.255.255.0" > /etc/hostname.vmx1
> obsd2# echo "inet 10.84.32.11 255.255.255.0" > /etc/hostname.vmx2
> obsd2# echo "inet 10.84.33.11 255.255.255.0" > /etc/hostname.vmx3
> obsd2# echo "net.inet.ip.forwarding=1" > /etc/sysctl.conf
> obsd2# reboot
> ...
> obsd2# echo "pass in log on vmx1 inet from 10.84.31.10 to 10.84.33.12 keep
> state (if-bound) reply-to 10.84.32.10@vmx2" >> /etc/pf.conf
> obsd3# pfctl -f /etc/pf.conf

> Host "obsd3" has just one interface, with IP 10.84.33.12.

> No other changes were made to the hosts besides selecting typical
> installation options.

> If we test this setup with an ICMP echo to 10.84.33.12 from obsd1, here is
> what we observe:

> obsd1# ping -c 1 10.84.33.12
> PING 10.84.33.12 (10.84.33.12): 56 data bytes
> ^C
> --- 10.84.33.12 ping statistics ---
> 1 packets transmitted, 0 packets received, 100.0% packet loss

> obsd2# tcpdump -nvvpi vmx1 icmp
> tcpdump: listening on vmx1, link-type EN10MB
> 21:20:08.710088 10.84.31.10 > 10.84.33.12: icmp: echo request (id:306e
> seq:0) [icmp cksum ok] (ttl 255, id 23663, len 84)
> ^C
> 1 packets received by filter
> 0 packets dropped by kernel

> obsd2# tcpdump -nvvpi vmx2 icmp
> tcpdump: listening on vmx2, link-type EN10MB
> ^C
> 0 packets received by filter
> 0 packets dropped by kernel

> obsd2# tcpdump -nvvpi vmx3 icmp
> tcpdump: listening on vmx3, link-type EN10MB
> 21:20:08.710136 10.84.31.10 > 10.84.33.12: icmp: echo request (id:306e
> seq:0) [icmp cksum ok] (ttl 254, id 23663, len 84)
> 21:20:08.710249 10.84.33.12 > 10.84.31.10: icmp: echo reply (id:306e
seq:0)
> [icmp cksum ok] (ttl 255, id 8694, len 84)
> 21:20:08.710272 10.84.33.11 > 10.84.33.12: icmp: 10.84.31.10 protocol 1
> port 40981 unreachable [icmp cksum ok] for 10.84.33.12 > 10.84.31.10:
icmp:
> echo reply (id:306e seq:0) (ttl 254, id 8694, len 84, bad ip cksum 44f5!
->
> 45f5) (ttl 255, id 637, len 56)
> ^C
> 3 packets received by filter
> 0 packets dropped by kernel

> If we change the PF rule we created on obsd2 to "floating" and run the
same
> test again, then the test case works exactly as expected:

> obsd1# ping -c 1 10.84.33.12
> PING 10.84.33.12 (10.84.33.12): 56 data bytes
> 64 bytes from 10.84.33.12: icmp_seq=0 ttl=254 time=0.528 ms

> --- 10.84.33.12 ping statistics ---
> 1 packets transmitted, 1 packets received, 0.0% packet loss
> round-trip min/avg/max/std-dev = 0.528/0.528/0.528/0.000 ms

> obsd2# tcpdump -nvvpi vmx1 icmp
> tcpdump: listening on vmx1, link-type EN10MB
> 21:25:24.970742 10.84.31.10 > 10.84.33.12: icmp: echo request (id:8aec
> seq:0) [icmp cksum ok] (ttl 255, id 27013, len 84)
> ^C
> 1 packets received by filter
> 0 packets dropped by kernel

> obsd2# tcpdump -nvvpi vmx2 icmp
> tcpdump: listening on vmx2, link-type EN10MB
> 21:25:24.971146 10.84.33.12 > 10.84.31.10: icmp: echo reply (id:8aec
seq:0)
> [icmp cksum ok] (ttl 254, id 13581, len 84)
> ^C
> 3 packets received by filter
> 0 packets dropped by kernel

> obsd2# tcpdump -nvvpi vmx3 icmp
> tcpdump: listening on vmx3, link-type EN10MB
> 21:25:24.970800 10.84.31.10 > 10.84.33.12: icmp: echo request (id:8aec
> seq:0) [icmp cksum ok] (ttl 254, id 27013, len 84)
> 21:25:24.970933 10.84.33.12 > 10.84.31.10: icmp: echo reply (id:8aec
seq:0)
> [icmp cksum ok] (ttl 255, id 13581, len 84)
> ^C
> 2 packets received by filter
> 0 packets dropped by kernel

> I am interested in any feedback on the question of whether or not this is
> expected behavior...

> Thank you.

> Joe

> On Thu, May 10, 2018 at 1:50 AM Joe Crivello <josephcrive...@gmail.com>
> wrote:

> > Hello!

> > I have a trunk0 interface on a router (#1) that is used for a singular
> > purpose -- to pass (IPsec protected) traffic for an IPIP tunnel (gif0)
to
> > another router (#2). I have configured PF rules on router #1 that
prevent
> > any other type of traffic from passing on trunk0. There are several
> routing
> > table entries that forward to router #2 on gif0.

> > My objective is to configure an additional pass rule that would allow
SSH
> > traffic destined for router #1 to pass in and out on trunk0.

> > The problem is that the aforementioned routes on gif0 cause packets sent
> in
> > reply to incoming SSH traffic to pass out on gif0 (after passing in on
> > trunk0). This ends up getting blocked by PF on router #1 because the
> > state-policy is set to if-bound (which is how I want it). I am trying to
> > use reply-to to enforce symmetric routing, but it isn't working.

> > As you will see below, my "reply-to" rule is matched, but the reply is
> > _still_ routed to gif0:

> > # tcpdump -nevvpi pflog0 tcp port 22
> > tcpdump: WARNING: snaplen raised from 116 to 224
> > tcpdump: listening on pflog0, link-type PFLOG
> > 01:27:46.503040 rule 5/(match) [uid 0, pid 16018] pass in on trunk0:
[uid
> > 4294967295, pid 100000] [SSH CLIENT IP].57427 > [TRUNK0 IP].22: S [tcp
sum
> > ok] 1707770457:1707770457(0) win 64240 <mss 1460,nop,wscale
> > 8,nop,nop,sackOK> (DF) (ttl 127, id 24244, len 52)
> > 01:27:46.503069 rule 4/(match) [uid 0, pid 16018] block out on gif1:
[uid
> > 4294967295, pid 100000] [TRUNK0 IP].22 > [SSH CLIENT IP].57427: S [tcp
sum
> > ok] 4100262020:4100262020(0) ack 1707770458 win 16384 <mss
> > 1460,nop,nop,sackOK,nop,wscale 3> (DF) (ttl 64, id 43497, len 52, bad ip
> > cksum 0! -> d71b)
> > ^C
> > 2 packets received by filter
> > 0 packets dropped by kernel

> > # pfctl -sr | grep @5
> > @5 pass in log quick on trunk0 inet proto tcp from any to [TRUNK0 IP]
port
> > = 22 flags S/SA keep state (if-bound) reply-to <ROUTER #2 IP>@trunk0

> > Router #1 is running OpenBSD 6.2.

> > Anyone have any idea why this isn't working the way I want it to?

> > Joe

Reply via email to