We have a pair of Vyos routers, setup with vrrp:
set interfaces ethernet eth0 address '192.168.0.253/24'
set interfaces ethernet eth0 vrrp vrrp-group 10 advertise-interval '2'
set interfaces ethernet eth0 vrrp vrrp-group 10 hello-source-address '192.168.0.253'
set interfaces ethernet eth0 vrrp vrrp-group 10 preempt 'true'
set interfaces ethernet eth0 vrrp vrrp-group 10 preempt-delay '20'
set interfaces ethernet eth0 vrrp vrrp-group 10 priority '200'
set interfaces ethernet eth0 vrrp vrrp-group 10 'rfc3768-compatibility'
set interfaces ethernet eth0 vrrp vrrp-group 10 sync-group 'total'
set interfaces ethernet eth0 vrrp vrrp-group 10 virtual-address '98.189.89.88/28'
set interfaces ethernet eth0 vrrp vrrp-group 10 virtual-address '98.189.89.89/28'
set interfaces ethernet eth0 vrrp vrrp-group 10 virtual-address '98.189.89.90/28'
set interfaces ethernet eth0 vrrp vrrp-group 10 virtual-address '98.189.89.91/28'
set interfaces ethernet eth0 vrrp vrrp-group 10 virtual-address '98.189.89.92/28'
This builds two interfaces, eth0 and eth0v10. When this system is the master, we need to reach the default gateway located in 98.189.89.80/28.
S>* 0.0.0.0/0 [1/0] via 98.189.89.81, eth0v10
C>* 98.189.89.80/28 is directly connected, eth0v10
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.0.0/24 is directly connected, eth0
The system will ARP for the mac address of the default gateway. Those arp requests go out from the vrrp source mac (rfc3768-compatibility), which is what we want. The outgoing arp requests are visible to tcpdump on both the physical eth0 and vrrp eth0v10 interfaces. However, the arp replies are only visible on the physical eth0 interface. The arp cache for eth0v10 does not get updated, and the gateway is not reachable.
tcpdump -i eth0 -nn -e arp | grep --line-buffered 98.189.89.81
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:33:06.763463 00:00:5e:00:01:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 98.189.89.81 (ff:ff:ff:ff:ff:ff) tell 98.189.89.88, length 28
16:33:06.779458 00:12:00:1a:39:f7 > 00:00:5e:00:01:0a, ethertype ARP (0x0806), length 60: Reply 98.189.89.81 is-at 00:12:00:1a:39:f7, length 46
16:33:07.763495 00:00:5e:00:01:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 98.189.89.81 (ff:ff:ff:ff:ff:ff) tell 98.189.89.88, length 28
16:33:07.783566 00:12:00:1a:39:f7 > 00:00:5e:00:01:0a, ethertype ARP (0x0806), length 60: Reply 98.189.89.81 is-at 00:12:00:1a:39:f7, length 46
16:33:08.763521 00:00:5e:00:01:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 98.189.89.81 (ff:ff:ff:ff:ff:ff) tell 98.189.89.88, length 28
16:33:08.772444 00:12:00:1a:39:f7 > 00:00:5e:00:01:0a, ethertype ARP (0x0806), length 60: Reply 98.189.89.81 is-at 00:12:00:1a:39:f7, length 46
tcpdump -i eth0v10 -nn -e arp | grep --line-buffered 98.189.89.81
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0v10, link-type EN10MB (Ethernet), capture size 65535 bytes
16:33:47.082439 00:00:5e:00:01:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 98.189.89.81 (ff:ff:ff:ff:ff:ff) tell 98.189.89.88, length 28
16:33:48.082510 00:00:5e:00:01:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 98.189.89.81 (ff:ff:ff:ff:ff:ff) tell 98.189.89.88, length 28
16:33:49.082541 00:00:5e:00:01:0a > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 98.189.89.81 (ff:ff:ff:ff:ff:ff) tell 98.189.89.88, length 28
I tried adding arp_accept to both eth0 and eth0v10, but that did not help. arp_accept on eth0 will get 98.189.89.81 added to the arp cache for eth0, but that entry won’t be used for outgoing packets on eth0v10.