Hello, I am trying to set-up an dual-stack IKEv2/IPsec VPN. The server is OpenBSD (obviously). The clients are macs (so far). IPv4 works, but I can't get IPv6 working for the clients. The clients get a v6 IP and a good route, but it seems routing doesn't work on OpenBSD's side.
I am using an /48 IPv6 tunnel from HE. Server IPv4:209.51.161.14 Server IPv6:2001:470:1f06:95f::1/64 Client IPv4:207.246.122.61 Client IPv6:2001:470:1f06:95f::2/64 Routed IPv6 Prefixes Routed /48:2001:470:8c78::/48 IPv6 connectivity works from OpenBSD: freedom# uname -a OpenBSD freedom.mgk.ro 6.4 GENERIC.MP#364 amd64 freedom# freedom# ifconfig gif0 # HE tunnel gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 index 4 priority 0 llprio 3 groups: gif egress tunnel: inet 207.246.122.61 -> 209.51.161.14 ttl 64 nodf inet6 fe80::42bc:4cfd:6395:7fe%gif0 -> prefixlen 64 scopeid 0x4 inet6 2001:470:1f06:95f::2 -> 2001:470:1f06:95f::1 prefixlen 128 freedom# freedom# route show -inet6 | grep default default tunnel521973.tunne UGS 0 3 - 8 gif0 default fe80::fc00:1ff:fed UGS 0 0 - 56 vio0 freedom# traceroute6 google.com traceroute6 to google.com (2607:f8b0:4006:81a::200e), 64 hops max, 60 byte packets 1 tunnel521973.tunnel.tserv4.nyc4.ipv6.he.net (2001:470:1f06:95f::1) 9.048 ms 7.025 ms 6.35 ms 2 ve422.core1.nyc4.he.net (2001:470:0:5d::1) 1.822 ms 1.727 ms 5.251 ms 3 core1-0-0-8.lga.net.google.com (2001:504:f::27) 1.836 ms 1.661 ms 1.659 ms 4 2001:4860:0:1125::1 (2001:4860:0:1125::1) 4.234 ms 3.801 ms 2001:4860:0:1127::1 (2001:4860:0:1127::1) 3.834 ms 5 2001:4860:0:1::17b (2001:4860:0:1::17b) 3.613 ms 2001:4860:0:1::995 (2001:4860:0:1::995) 2.823 ms 2001:4860:0:1::17b (2001:4860:0:1::17b) 2.854 ms 6 lga25s62-in-x0e.1e100.net (2607:f8b0:4006:81a::200e) 2.829 ms 2.764 ms 2.598 ms freedom# I created enc0 for IPsec, and assigned the /48 to it: freedom# cat /etc/hostname.enc0 inet 172.24.24.1 255.255.255.0 172.24.24.255 inet6 2001:470:8c78:a0:: 64 up I enabled IP forwarding: freedom# cat /etc/sysctl.conf hw.smt=1 net.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1 freedom# My iked.conf is freedom# cat /etc/iked.conf ikev2 "vpn" passive ipcomp esp \ from 0.0.0.0/0 to 0.0.0.0/0 \ local egress peer any \ psk "XXXXXXXX" \ config address 172.24.24.0/24 \ config address 2001:470:8c78:a0::/64 \ config name-server 172.24.24.1 \ config name-server 2001:470:8c78:a0:: \ tag "vpn" tap enc0 freedom# The mac clients "see" the IPv6 address, and create a route: emerald:aram$ ifconfig ipsec0 ipsec0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1400 inet 172.24.24.193 --> 172.24.24.193 netmask 0xff000000 inet6 fe80::3ac9:86ff:fe32:4e3f%ipsec0 prefixlen 64 scopeid 0xf inet6 2001:470:8c78:a0::82f8:21d4 prefixlen 64 nd6 options=201<PERFORMNUD,DAD> emerald:aram$ emerald:aram$ netstat -nr | grep default default link#15 UCS 110 0 ipsec0 default 192.168.0.1 UGScI 19 0 en0 default 192.168.0.1 UGScI 3 0 en1 default 2001:470:8c78:a0:: UGc ipsec0 default fe80::%utun0 UGcI utun0 default fe80::%utun1 UGcI utun1 default fe80::%utun2 UGcI utun2 I can do IPv4 from the clients, but not IPv6. emerald:aram$ ping 1.1.1.1 PING 1.1.1.1 (1.1.1.1): 56 data bytes 64 bytes from 1.1.1.1: icmp_seq=0 ttl=58 time=106.972 ms 64 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=107.661 ms 64 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=108.039 ms ^C --- 1.1.1.1 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 106.972/107.557/108.039/0.442 ms emerald:aram$ ping6 google.com PING6(56=40+8+8 bytes) 2001:470:8c78:a0::82f8:21d4 --> 2607:f8b0:4006:800::200e ^C --- google.com ping6 statistics --- 4 packets transmitted, 0 packets received, 100.0% packet loss emerald:aram$ ping6 2001:470:8c78:a0:: PING6(56=40+8+8 bytes) 2001:470:8c78:a0::82f8:21d4 --> 2001:470:8c78:a0:: ^C --- 2001:470:8c78:a0:: ping6 statistics --- 4 packets transmitted, 0 packets received, 100.0% packet loss emerald:aram$ emerald:aram$ As you can see I can't even ping the OpenBSD endpoint over IPv6. >From the OpenBSD side, I can't ping the client either on IPv6 (IPv4 works): freedom# ping6 2001:470:8c78:a0::82f8:21d4 PING 2001:470:8c78:a0::82f8:21d4 (2001:470:8c78:a0::82f8:21d4): 56 data bytes ping6: sendmsg: Message too long ping: wrote 2001:470:8c78:a0::82f8:21d4 64 chars, ret=-1 ping6: sendmsg: Message too long ping: wrote 2001:470:8c78:a0::82f8:21d4 64 chars, ret=-1 ^C --- 2001:470:8c78:a0::82f8:21d4 ping statistics --- 2 packets transmitted, 0 packets received, 100.0% packet loss freedom# ping 172.24.24.193 PING 172.24.24.193 (172.24.24.193): 56 data bytes 64 bytes from 172.24.24.193: icmp_seq=0 ttl=64 time=107.996 ms 64 bytes from 172.24.24.193: icmp_seq=1 ttl=64 time=106.241 ms ^C --- 172.24.24.193 ping statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 106.241/107.118/107.996/0.878 ms freedom# Also on the OpenBSD side, I can see the ICMP packets coming from the client and arriving on enc0: freedom# tcpdump -n -e -ttt -i enc0 tcpdump: listening on enc0, link-type ENC Feb 11 13:59:48.962485 (authentic,confidential): SPI 0x1e6e0c04: 2001:470:8c78:a0::82f8:21d4 > 2001:470:8c78:a0::: icmp6: echo request [flowlabel 0xdea34] (encap) Feb 11 13:59:49.963477 (authentic,confidential): SPI 0x1e6e0c04: 2001:470:8c78:a0::82f8:21d4 > 2001:470:8c78:a0::: icmp6: echo request [flowlabel 0xdea34] (encap) ^C So the packets come, but something happens to them. My pf.conf is: set skip on lo block return # block stateless traffic pass # establish keep-state # NAT match in all scrub (no-df random-id max-mss 1440) match out on egress inet from !(egress:network) to any nat-to (egress:0) pass quick proto udp from any to self port {isakmp, ipsec-nat-t} keep state pass on enc0 from any to self keep state (if-bound) # By default, do not permit remote connections to X11 block return in on ! lo0 proto tcp to port 6000:6010 # Port build user does not need network block return out log proto {tcp udp} user _pbuild And this is what pfctl -sr returns: freedom# pfctl -sr block return all pass all flags S/SA match in all scrub (no-df random-id max-mss 1440) match out on egress inet from ! (egress:network) to any nat-to (egress:0) round-robin pass quick inet6 proto udp from any to ::1 port = 500 pass quick on lo0 inet6 proto udp from any to fe80::1 port = 500 pass quick on vio0 inet6 proto udp from any to fe80::5400:1ff:fed3:aabd port = 500 pass quick inet6 proto udp from any to 2001:470:8c78:a0:: port = 500 pass quick on gif0 inet6 proto udp from any to fe80::42bc:4cfd:6395:7fe port = 500 pass quick inet6 proto udp from any to 2001:470:1f06:95f::2 port = 500 pass quick inet6 proto udp from any to ::1 port = 4500 pass quick on lo0 inet6 proto udp from any to fe80::1 port = 4500 pass quick on vio0 inet6 proto udp from any to fe80::5400:1ff:fed3:aabd port = 4500 pass quick inet6 proto udp from any to 2001:470:8c78:a0:: port = 4500 pass quick on gif0 inet6 proto udp from any to fe80::42bc:4cfd:6395:7fe port = 4500 pass quick inet6 proto udp from any to 2001:470:1f06:95f::2 port = 4500 pass quick inet proto udp from any to 127.0.0.1 port = 500 pass quick inet proto udp from any to 207.246.122.61 port = 500 pass quick inet proto udp from any to 172.24.24.1 port = 500 pass quick inet proto udp from any to 127.0.0.1 port = 4500 pass quick inet proto udp from any to 207.246.122.61 port = 4500 pass quick inet proto udp from any to 172.24.24.1 port = 4500 pass on enc0 inet from any to 127.0.0.1 flags S/SA keep state (if-bound) pass on enc0 inet from any to 207.246.122.61 flags S/SA keep state (if-bound) pass on enc0 inet from any to 172.24.24.1 flags S/SA keep state (if-bound) pass on enc0 inet6 from any to ::1 flags S/SA keep state (if-bound) pass on enc0 inet6 from any to 2001:470:8c78:a0:: flags S/SA keep state (if-bound) pass on enc0 inet6 from any to 2001:470:1f06:95f::2 flags S/SA keep state (if-bound) block return in on ! lo0 proto tcp from any to any port 6000:6010 block return out log proto tcp all user = 55 block return out log proto udp all user = 55 Any tips on what to do next? Do I need some special pf.conf configuration? Thanks!