2017-07-05 2 views
4

J'ai une distribution Linux OpenWrt pour mon système embarqué. L'appareil dispose de 3 interfaces réseau: eth0, eth1 et wlan0.Linux utilise l'interface pour le socket brut seulement

L'une des interfaces réseau (eth0) doit être utilisée uniquement pour la programmation raw socket. Je suis en mesure de créer une socket avec les paramètres AF_PACKET, SOCK_RAW, ETH_P_ALL. La socket reçoit tout le trafic réseau, je peux envoyer des paquets et tout est OK.

Mais mon problème est, que le système d'exploitation utilise également l'interface pour l'envoi d'une récession (par exemple ARP et requêtes/réponses ICMP).

Y at-il une option que l'interface est utilisée uniquement par mon programme et non par le système d'exploitation lui-même?

Répondre

2

Ceci n'est pas possible avec un noyau de vanille. Mais cela peut se rapprocher:

D'abord, ignorer toutes les requêtes arp sur cette interface:

echo 8 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 

Ensuite, désactivez IPv6:

echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6 

Enfin, filtrer tous les paquets IPv4 à venir sur cette interface

iptables -I INPUT -i eth0 -j DROP 

Et ne définissez pas d'adresse IP ou de routes sur cette interface. Ce n'est évidemment pas parfait, certains paquets seront toujours traités par le noyau, mais je ne pense pas qu'il existe une meilleure solution.

+0

OK. J'ai configuré le pare-feu (iptables) de sorte que tous les paquets IPv4 soient supprimés. Mais comment puis-je désactiver ARP et IPv6 au démarrage. Si je mets les deux lignes fournies ci-dessus dans 'rc.local', je reçois toujours un paquet ICMPv6 (Router Solicitation) au démarrage de l'appareil. Je pense que les commandes du fichier 'rc.local' sont exécutées trop tard. Des sugestions? –

+0

@BenjaminJ. Pourquoi c'est un problème? Vous recevrez toujours ce paquet, l'important est que le traitement de ce paquet par le noyau ne nuise pas à votre application. – Ctx

+0

Désolé. Je me suis mal exprimé. Le paquet est envoyé par le périphérique OpenWrt. J'ai vérifié cela via un Wireshark sur Windows PC qui est connecté à eth0. –