On Fri, Mar 09, 2018 at 06:13:10PM +0100, Remi Locherer wrote: > On Sun, Mar 04, 2018 at 01:08:21PM +0200, Atanas Vladimirov wrote: > > Hi, > > > > I can't make OSPF to work on gif over IPsec. > > With tcpdump on gif I see the OSPFv2-hello only from localhost: > > > > # R1 > > [ns]~$ tcpdump -nei gif0 > > tcpdump: listening on gif0, link-type LOOP > > 23:19:29.181685 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid > > 192.168.1.1 area 0.0.0.1 [tos 0xc0] [ttl 1] > > 23:19:39.192025 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid > > 192.168.1.1 area 0.0.0.1 [tos 0xc0] [ttl 1] > > 23:19:49.202372 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid > > 192.168.1.1 area 0.0.0.1 [tos 0xc0] [ttl 1] > > 23:19:59.212730 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid > > 192.168.1.1 area 0.0.0.1 [tos 0xc0] [ttl 1] > > 23:20:09.223064 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid > > 192.168.1.1 area 0.0.0.1 [tos 0xc0] [ttl 1] > > 23:20:19.233393 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid > > 192.168.1.1 area 0.0.0.1 [tos 0xc0] [ttl 1] > > > > # R2 > > [hodor]~$ tcpdump -nei gif0 > > tcpdump: listening on gif0, link-type LOOP > > 12:51:59.316704 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone [tos 0xc0] [ttl 1] > > 12:52:09.327002 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone [tos 0xc0] [ttl 1] > > 12:52:19.337314 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone [tos 0xc0] [ttl 1] > > > > While on enc0 both hello's appears (not sure if `bad ip cksum` is the reason > > for my issues): > > > > # R1 > > [ns]~$ tcpdump -nvi enc0 > > tcpdump: listening on enc0, link-type ENC > > 12:24:37.625873 (authentic,confidential): SPI 0x11af4dae: 93.123.39.67 > > > 95.87.227.232: 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone E mask 255.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] > > (id 25841, len 64) (ttl 60, id 37752, len 84) > > 12:24:41.882173 (authentic,confidential): SPI 0x1a3fbc6d: 95.87.227.232 > > > 93.123.39.67: 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid 192.168.1.1 > > backbone E mask 255.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] > > (id 27818, len 64) (ttl 64, id 60563, len 84, bad ip cksum 32d7! -> c614) > > 12:24:47.636188 (authentic,confidential): SPI 0x11af4dae: 93.123.39.67 > > > 95.87.227.232: 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone E mask 255.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] > > (id 36067, len 64) (ttl 60, id 65348, len 84) > > 12:24:51.892467 (authentic,confidential): SPI 0x1a3fbc6d: 95.87.227.232 > > > 93.123.39.67: 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid 192.168.1.1 > > backbone E mask 255.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] > > (id 5127, len 64) (ttl 64, id 12476, len 84, bad ip cksum 201! -> 81ec) > > 12:24:57.646535 (authentic,confidential): SPI 0x11af4dae: 93.123.39.67 > > > 95.87.227.232: 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone E mask 255.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] > > (id 39220, len 64) (ttl 60, id 1938, len 84) > > > > # R2 > > [hodor]~$ tcpdump -nvi enc0 | grep OSPF > > tcpdump: listening on enc0, link-type ENC > > 12:28:57.894007 (authentic,confidential): SPI 0x11af4dae: 93.123.39.67 > > > 95.87.227.232: 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone E mask 255.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] > > (id 3667, len 64) (ttl 64, id 14037, len 84, bad ip cksum 2b6d! -> 7bd3) > > 12:29:02.151763 (authentic,confidential): SPI 0x1a3fbc6d: 95.87.227.232 > > > 93.123.39.67: 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid 192.168.1.1 > > backbone E mask 25 > > 5.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] (id 16974, len > > 64) (ttl 60, id 21648, len 84) > > 12:29:07.904315 (authentic,confidential): SPI 0x11af4dae: 93.123.39.67 > > > 95.87.227.232: 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone E mask 255 > > .255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] (id 45590, len 64) > > (ttl 64, id 35262, len 84, bad ip cksum 2743! -> 28ea) > > 12:29:12.162049 (authentic,confidential): SPI 0x1a3fbc6d: 95.87.227.232 > > > 93.123.39.67: 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid 192.168.1.1 > > backbone E mask 25 > > 5.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] (id 19966, len > > 64) (ttl 60, id 3134, len 84) > > 12:29:17.914621 (authentic,confidential): SPI 0x11af4dae: 93.123.39.67 > > > 95.87.227.232: 10.255.255.1 > 224.0.0.5: OSPFv2-hello 44: rtrid 172.16.1.1 > > backbone E mask 255 > > .255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] (id 36161, len 64) > > (ttl 64, id 53105, len 84, bad ip cksum fcb8! -> e336) > > 12:29:22.172468 (authentic,confidential): SPI 0x1a3fbc6d: 95.87.227.232 > > > 93.123.39.67: 10.255.255.2 > 224.0.0.5: OSPFv2-hello 44: rtrid 192.168.1.1 > > backbone E mask 25 > > 5.255.255.255 int 10 pri 1 dead 40 nbrs [tos 0xc0] [ttl 1] (id 36221, len > > 64) (ttl 60, id 29514, len 84) > > > > If I set a static routes the regular traffic flows as it should. > > > > The configs are the same on both routers: > > > > # R1 > > [ns]~$ doas cat /etc/ipsec.conf > > local_ip="95.87.227.232" > > remote_ip="93.123.39.67" > > ike esp transport from $local_ip to $remote_ip > > > > # R2 > > [hodor]~$ doas cat /etc/ipsec.conf > > local_ip="93.123.39.67" > > remote_ip="95.87.227.232" > > ike esp transport from $local_ip to $remote_ip > > > > # R1 > > [ns]~$ doas cat /etc/hostname.gif0 > > up > > mtu 1400 > > tunnel 95.87.227.232 93.123.39.67 > > inet 10.255.255.2/32 > > dest 10.255.255.1 > > > > # R2 > > [hodor]~$ doas cat /etc/hostname.gif0 > > up > > mtu 1400 > > tunnel 93.123.39.67 95.87.227.232 > > inet 10.255.255.1/32 > > dest 10.255.255.2 > > > > # R1 > > [ns]~$ doas cat /etc/ospfd.conf > > # $OpenBSD: ospfd.conf,v 1.1 2014/07/11 16:36:35 deraadt Exp $ > > > > # macros > > password="secret" > > > > # global configuration > > router-id 192.168.1.1 > > fib-update yes > > redistribute connected > > > > # areas > > area 0.0.0.0 { > > interface gif0 > > } > > > > # R2 > > [hodor]~$ doas cat /etc/ospfd.conf > > # $OpenBSD: ospfd.conf,v 1.1 2014/07/11 16:36:35 deraadt Exp $ > > > > # macros > > password="secret" > > > > # global configuration > > router-id 172.16.1.1 > > fib-update yes > > redistribute connected > > > > # areas > > area 0.0.0.0 { > > interface vether0 > > interface gif0 > > } > > > > # R1 > > [ns]~$ ospfctl sh nei > > ID Pri State DeadTime Address Iface Uptime > > > > # R1 > > [ns]~$ ospfctl sh int > > Interface Address State HelloTimer Linkstate Uptime nc ac > > gif0 10.255.255.2/32 P2P 00:00:04 unknown 00:15:37 0 0 > > > > # R2 > > [hodor]~$ ospfctl sh nei > > ID Pri State DeadTime Address Iface Uptime > > 172.16.1.9 1 FULL/DR 00:00:36 172.16.1.9 vether0 02:10:14 > > > > # R2 > > [hodor]~$ ospfctl sh int > > Interface Address State HelloTimer Linkstate Uptime nc ac > > gif0 10.255.255.1/32 P2P 00:00:04 unknown 02:10:24 0 0 > > vether0 172.16.1.1/24 BCKUP 00:00:09 active 02:10:24 1 1 > > > > Please, let me know if I'm doing something wrong/stupid or this is bug > > somewhere in the stack. > > I applied your configs to newly created VMs with 6.2-beta from today > (pf disabled). I see the same with tcpdump as you do. > > Then I tried this: > - the OSPF adjacency comes up when I disable IPsec > - when I replace gif with gre ospfd is happy (with IPsec active) > (sysctl net.inet.gre.allow=1; mv /etc/hostname.{gif0,gre0}) > > I have a similar setup in production on 6.2 (with tunneldomain added to the > mix). This works. > > To me this looks like a regression when gif is used with IPsec.
With below diff the setup works as expected: tcpdump shows OSPF hellos on gif0 and ospfd sees the neighbour. I don't think it's the correct fix though. Index: if_gif.c =================================================================== RCS file: /cvs/src/sys/net/if_gif.c,v retrieving revision 1.112 diff -u -p -r1.112 if_gif.c --- if_gif.c 28 Feb 2018 23:28:05 -0000 1.112 +++ if_gif.c 9 Mar 2018 20:52:46 -0000 @@ -745,8 +745,8 @@ gif_input(struct gif_tunnel *key, struct } /* XXX What if we run transport-mode IPsec to protect gif tunnel ? */ - if (m->m_flags & (M_AUTH | M_CONF)) - return (-1); + //if (m->m_flags & (M_AUTH | M_CONF)) + // return (-1); key->t_rtableid = m->m_pkthdr.ph_rtableid;