Можно ли отвечать на запросы ARP в пользовательском режиме, а не внутри ядра? Я могу создать ETH_P_ARP
socket, но не уверен, смогу ли я полностью заменить стратегию ядра на этом уровне.
Вы определенно можете создать сокет и использовать его для ответа на запросы ARP. Однако это не помешает ядру отвечать на них.
Есть способы запретить ядру отвечать на запросы ARP. Самое простое и во многих случаях лучшее решение - просто использовать в вашей программе другой IP-адрес. Если ядро не распознает IP-адрес, оно не будет отвечать на запросы ARP. Я сам использовал этот метод для реализации пользовательского режима NAT64.
Другой способ запретить ядру отвечать на запросы ARP - это arptables
правила.