Title: Solving a bad ARP behavior on a Linux router | |
Author: Solène | |
Date: 05 August 2022 | |
Tags: linux networking | |
Description: My Linux router had issues with devices using dhcp, they | |
couldn't connect immediately to the Internet, here is why and how to | |
solve this | |
# Introduction | |
So, I recently switched my home router to Linux but had a network | |
issues for devices that would get/renew their IP with DHCP. They were | |
obtaining an IP, but they couldn't reach the router before a while | |
(between 5 seconds to a few minutes), which was very annoying and | |
unreliable. | |
After spending some time with tcpdump on multiple devices, I found the | |
issue, it was related to ARP (the protocol to discover MAC addresses | |
associate them with IPs). | |
Wikipedia page about the ARP protocol | |
The arp flux problem explained | |
# My setup | |
I have an unusual network setup at home as I use my ISP router for | |
Wi-Fi, switch and as a modem, the issue here is that there are two | |
subnets on its switch. | |
```network diagram | |
+------------------+ +-----------------+ | |
| ISP MODEM | ethernet #1 ethernet #1| | | |
| |<------------------------------>| | | |
| | 192.168.1.254 192.168.1.111| | | |
| | | linux router | | |
| | | | | |
| | ethernet #2 ethernet #2| | | |
| |<------------------------------>| | | |
| | 10.42.42.42 | | | |
| | | | | |
| | | | | |
+------------------+ +-----------------+ | |
^ethernet #4 ^ ethernet #3 | |
| | | |
| | | |
| +----> some switch with many devices | |
| | |
v 10.42.42.150 | |
NAS | |
``` | |
Because the modem is reachable over 192.168.1.0/24 and is used by the | |
router on that switch, but that the LAN network uses the same switch | |
with 10.42.42.0/24, ARP packets arrives on two network interfaces of | |
the router, for addresses that are non routables (ARP packets for | |
10.42.42.0 would arrive at the interface 192.168.1.0 or the opposite). | |
# Solution | |
There is simple solution, but it was very complicated to find as it's | |
not obvious. We can configure the Linux kernel to discard ARP packets | |
that are related to non routable addresses, so the interface with a | |
192.168.1.0/24 address will discard packets for the 10.42.42.0/24 | |
network and vice-versa. | |
You need to define the sysctl net.ipv4.conf.all.arp_filter to 1. | |
```shell | |
sysctl net.ipv4.conf.all.arp_filter=1 | |
``` | |
This can be set per interface if you have specific need. | |
Documentation of the sysctl available on Linux | |
# Conclusion | |
This was a very annoying issue, incredibly hard to troubleshoot. I | |
suppose OpenBSD has this strict behavior by default because I didn't | |
have this problem when the router was running OpenBSD. |