On Fri, Jun 12, 2020 at 09:27:18PM +0200, Tobias Heider wrote:
> On Fri, Jun 12, 2020 at 03:31:56PM +0200, Patrik Ragnarsson wrote:
> > Hi,
> > 
> > We have two OpenBSD machines acting as gateways for our network using
> > CARP and IPsec (IKEv2).
> > 
> > When the machines were running OpenBSD 6.6, from an IPSec client, you
> > were able to reach the passive gateway while being connected to the
> > active gateway. On OpenBSD 6.7, it seems this is no longer possible.
> > 
> > The setup looks like this:
> > 
> > - The two servers share <SHARED EXTERNAL IP> using CARP (carp10
> > (carpdev trunk1))
> > - The two servers share 10.200.200.1 using CARP  (carp20   (carpdev 
> > vlan2000))
> > - The active (MASTER) gateway has 10.200.200.2   (vlan2000 (parent trunk0))
> > - The passive (BACKUP) gateway has 10.200.200.3  (vlan2000 (parent trunk0))
> > 
> > iked.conf looks like this on both machines:
> > 
> >     $ cat /etc/iked.conf
> >     local_endpoint  = "<SHARED EXTERNAL IP>"
> >     roadwarrior_net = "10.100.100.0/24"
> > 
> >     ikev2 "roadwarrior-psk" ipcomp esp \
> >                     from 10.200.200.0/24 to 0.0.0.0/0 \
> >                     peer any local $local_endpoint \
> >             srcid $local_endpoint \
> >             psk "<SECRET>" \
> >             config address $roadwarrior_net \
> >             config netmask 255.255.255.0\
> >             tag "$name-$id"
> > 
> > sasyncd.conf from the active gateway:
> > 
> >     $ cat /etc/sasyncd.conf
> >     interface carp10
> >     listen on 10.200.200.2
> >     peer 10.200.200.3
> >     control iked
> >     sharedkey <SECRET>
> > 
> > sasyncd.conf from the passive gateway:
> > 
> >     $ cat /etc/sasyncd.conf
> >     interface carp10
> >     listen on 10.200.200.3
> >     peer 10.200.200.2
> >     control iked
> >     sharedkey <SECRET>
> > 
> > The PF rules on both gateways looks like this:
> > 
> >     block drop log all
> >     pass on vlan2000 proto carp all keep state (no-sync)
> >     pass on trunk1 proto carp all keep state (no-sync)
> >     pass on vlan2000 all no state
> >     pass out on trunk1 all flags S/SA
> >     pass in on trunk1 inet proto tcp from any to (trunk1:0) port = 22
> > flags S/SA keep state (no-sync)
> >     pass in on trunk1 inet proto udp from any to (trunk1:0) port
> > 60000:61000 keep state (no-sync)
> >     pass out on trunk1:0 all flags S/SA keep state (no-sync)
> >     pass in on trunk1 inet proto icmp all
> >     block return in on trunk1 proto udp from any to any port 33434:33534
> >     pass out on trunk1 from (vlan2000:network) to any flags S/SA
> > nat-to (carp10:0)
> >     pass in on trunk1 inet proto udp from any to <SHARED EXTERNAL IP> port 
> > = 500
> >     pass in on trunk1 inet proto udp from any to <SHARED EXTERNAL IP>
> > port = 4500
> >     pass out on trunk1 inet proto udp from <SHARED EXTERNAL IP> to any
> > port = 500
> >     pass out on trunk1 inet proto udp from <SHARED EXTERNAL IP> to any
> > port = 4500
> >     pass in on trunk1 inet proto esp from any to <SHARED EXTERNAL IP>
> >     pass out on trunk1 inet proto esp from <SHARED EXTERNAL IP> to any
> >     pass in on enc0 inet from 10.100.100.0/24 to 10.200.200.0/24 flags
> > S/SA keep state (if-bound)
> >     pass in on enc0 inet proto ipencap from any to <SHARED EXTERNAL
> > IP> keep state (if-bound)
> >     pass out on enc0 inet from 10.200.200.0/24 to 10.100.100.0/24
> > flags S/SA keep state (if-bound)
> >     pass out on enc0 inet proto ipencap from <SHARED EXTERNAL IP> to
> > any keep state (if-bound)
> > 
> > On both gateways, I can see that the same flows and SAs have been
> > created after the client have connected to the VPN. (ipsecctl -s all)
> > 
> > A client (macOS) can reach 10.200.200.1 and 10.200.200.2 (and other
> > servers in 10.200.200.0/24) but not 10.200.200.3:
> > 
> >     $ ping -c5 10.200.200.3
> >     PING 10.200.200.3 (10.200.200.3): 56 data bytes
> >     Request timeout for icmp_seq 0
> >     Request timeout for icmp_seq 1
> >     Request timeout for icmp_seq 2
> >     Request timeout for icmp_seq 3
> > 
> >     --- 10.200.200.3 ping statistics ---
> >     5 packets transmitted, 0 packets received, 100.0% packet loss
> > 
> > I can see the ICMP echo requests reach the vlan2000 interface on the
> > passive gateway (tcpdump -netti vlan2000 icmp)
> > 
> >     1591718254.738903 ac:1f:6b:6b:65:c6 ac:1f:6b:6b:64:a6 0800 98:
> > 10.100.100.173 > 10.200.200.3: icmp: echo request
> >     1591718255.740275 ac:1f:6b:6b:65:c6 ac:1f:6b:6b:64:a6 0800 98:
> > 10.100.100.173 > 10.200.200.3: icmp: echo request
> >     1591718256.740455 ac:1f:6b:6b:65:c6 ac:1f:6b:6b:64:a6 0800 98:
> > 10.100.100.173 > 10.200.200.3: icmp: echo request
> >     1591718257.743593 ac:1f:6b:6b:65:c6 ac:1f:6b:6b:64:a6 0800 98:
> > 10.100.100.173 > 10.200.200.3: icmp: echo request
> > 
> > Running iked in the foreground (iked -dv) on the passive gateway, I
> > can see the following when I try to ping 10.200.200.3 from the client:
> > 
> >     pfkey_process: acquire request (peer <CLIENT EXTERNAL IP>)
> >     pfkey_process: flow in from 10.200.200.0/255.255.255.0 to
> > 10.100.100.173/255.255.255.255 via <CLIENT EXTERNAL IP>
> >     ikev2_acquire_sa: flow wasn't found
> > 
> > I've also tried disabling PF on the passive gateway, I still couldn't
> > reach 10.200.200.3.
> > 
> > Appreciate it if anyone has any ideas of what's going on.
> > 
> > Thanks!
> 
> Probably related to the following change documented in
> https://www.openbsd.org/faq/upgrade67.html:
> 
> iked(8)/isakmpd(8). The type of incoming ipsec(4) flows installed by iked(8) 
> or
> isakmpd(8) was changed from "use" to "require". This means unencrypted traffic
> matching the flows will no longer be accepted. Flows of type "use" can still 
> be
> set up manually in ipsec.conf(5). 
> 
> The problem is that the incoming packet on 10.200.200.3 matches the installed
> IPsec flow which only accepts encrypted packets.
> 

You could try adding the following flow to ipsec.conf on 10.200.200.3:

flow from 10.100.100.0/24 to 10.200.200.0/24 type bypass

This should explicitly match and allow traffic coming from the internal
roadwarrior_net.

Reply via email to