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!

Reply via email to