Гаразд, ось рішення. По-перше, резюме:
Ось мій базовий мережевий план:
eth0 10.10.10.2 netmask 255.255.255.248
eth1 10.10.10.3 netmask 255.255.255.248
eth2 10.10.10.4 netmask 255.255.255.248
eth3 10.10.10.5 netmask 255.255.255.248
Всі інтерфейси перекриваються. Це технічно неправильно, і джерело всіх моїх неприємностей ... але я маю це робити через цей німий житловий шлюз.
По-перше, трансляція запитів ARP стосується всього цього. Оскільки всі 4 IP-адреси є дійсними локальними адресами, всі 4 інтерфейси намагаються відповісти.
1) встановити аргументи . Додайте це місце десь під час завантаження ( /etc/rc.local тут):
arptables -F INPUT
arptables -A INPUT -i eth0 --destination-ip ! 10.10.10.2 -j DROP
arptables -A INPUT -i eth1 --destination-ip ! 10.10.10.3 -j DROP
arptables -A INPUT -i eth2 --destination-ip ! 10.10.10.4 -j DROP
arptables -A INPUT -i eth3 --destination-ip ! 10.10.10.5 -j DROP
Це запобіжить переходу трансляцій у неправильний інтерфейс. Отже, правильний інтерфейс тепер стане єдиним респондентом.
Це само по собі недостатньо. Наступний біт - це проблема таблиці ARP. На запитувальному ПК, ймовірно, вже є запис таблиці ARP, і тому Linux збирається використовувати пов'язаний з цим інтерфейс. Доки термін запису таблиці ARP не закінчиться, він буде намагатися надсилати відповіді ARP за допомогою інтерфейсу цього запису, а не того, який пов'язаний із запитом ARP.
Опція sysctl rp_filter, схоже, відхиляє вихідні пакети відповідей ARP, якщо вони не відповідають інтерфейсу. Так...
2) Вимкнути rp_filter .
В Debian / Ubuntu, це означає закомментировать дві rp_filter лінії в /etc/sysctl.d/10-network-security.conf .
Ця опція була ввімкнена з якоїсь причини, а саме - щоб запобігти атакам підробки між інтерфейсом. Я читаю, що він підтверджує, що пакет легальний для інтерфейсу, який він входить або виходить (шляхом заміни MAC та IP-адрес і перевіряє, чи все ще рухається через той самий інтерфейс). Отже, як правило, було б погано вимкнути це. У моєму випадку всі інтерфейси є в одній мережі ... так що перевірка насправді не має значення.
Якщо я додам інший інтерфейс і мені потрібен захист від підробки, можливо, я можу створити деякі записи arptables / iptables, щоб зробити те саме.