3 votes

Comment puis-je utiliser iptables pour supprimer les paquets dont le type d'éther n'est pas valide ?

19:27:47.782291 98:9b:cb:: > ff:ff:ff:ff:ff:ff, ethertype Unknown (0x88e1), length 60:
        0x0000:  0000 a000 b052 38e5 d57f 0000 0000 0000  .....R8.........
        0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................
        0x0020:  0000 0000 0000 0000 0000 0000 0000       ..............
19:27:47.782293 98:9b:cb:: > ff:ff:ff:ff:ff:ff, ethertype Unknown (0x8912), length 60:
        0x0000:  0170 a000 0000 1f84 e5a3 97a2 5553 bef1  .p..........US..
        0x0010:  fcf9 796b 5214 13e9 e200 0000 0000 0000  ..ykR...........
        0x0020:  0000 0000 0000 0000 0000 0000 0000       ..............

Mon routeur envoie ces déchets dans mon réseau et j'aimerais les bloquer, car il est impossible de les désactiver. En effet, on ne peut pas le désactiver. iptables s'est avérée plus difficile que je ne le pensais :

root@fw:~ # iptables -A INPUT -m mac --mac-source 98:9b:cb:: -p 0x88e1 -j DROP
iptables v1.8.2 (nf_tables): unknown protocol "0x88e1" specified
Try `iptables -h' or 'iptables --help' for more information.

Existe-t-il un moyen de bloquer un type d'éther non valide ?

2voto

Shashank Agrawal Points 119

Pourquoi voulez-vous supprimer ces cadres ? Quelle différence cela fait-il ? Ils sont abandonnés de toute façon...

La raison pour laquelle votre iptables L'approche qui ne fonctionne pas consiste à mélanger les couches de protocole. Le type Ethernet (c'est-à-dire le protocole de niveau supérieur) 0x0800 est IP (voir /etc/ethertypes ). En d'autres termes, il ne s'agit pas d'un paquet IP : Ce n'est pas un paquet IP. Et comme conséquence immédiate, Netfilter ne le voit jamais car il ne traite que les paquets IPv4 et IPv6. Pour cette raison, il n'y a pas d'option pour faire correspondre le type d'ethert dans Netfilter.

Même pas ebtables ne semble pas être utile dans ce cas, car il n'a pas de test pour le type d'éthernet.

Un peu d'espoir : la mise en forme du trafic

Peut-être il existe une "solution" (difficile) (pour ce non-problème) qui consiste à abuser de la mise en forme du trafic ( tc ) et son pseudo-interface de réseau Intermediate Functional Block (ifb). En général, la mise en forme du trafic n'est utilisée que pour le trafic sortant. Avec le ifb il peut être appliqué au trafic entrant (je ne l'ai jamais fait). La raison pour laquelle je pense que cela peut constituer une approche est que tc offre des filtres qui vont au-delà de la logique du protocole. Il suffit de regarder certains octets dans le paquet. Ainsi, le champ ethertype des paquets entrants devient peut-être accessible de cette manière.

Problème suivant : le Traffic Shaping n'a pas été conçu pour filtrer les paquets mais pour les réordonner. Mais certaines de ses fonctionnalités peuvent être utilisées de manière abusive pour laisser tomber certains paquets/trames.

1voto

diggie Points 307

J'ai essayé la même chose et je n'ai pas réussi à la faire fonctionner non plus, même si je pense que l'option -p devrait fonctionner (mais j'ai peut-être mal lu la page de manuel).

Cependant, ce qui a fonctionné pour moi, c'est de spécifier explicitement les types d'Ethernet autorisés et d'abandonner tout le reste :

# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -p ip4 -j ACCEPT
# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -p ip6 -j ACCEPT
# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -p ARP -j ACCEPT
# ebtables -A INPUT -s XX:XX:XX:XX:XX:XX -j DROP

Si vous utilisez d'autres protocoles Ethernet, vous devrez peut-être les ajouter également, par exemple 802_1Q pour le trafic étiqueté vlan.

1voto

Ingo Points 386

Il semble que iptables ne peut pas être utilisé pour notre problème. Nous devons utiliser son successeur amélioré nftables . Il s'agit simplement d'un meta expression disponible avec le type d'expression protocol = EtherType protocol value . Remerciements @Bernard qui a trouvé la solution à sa question Le serveur Linux laisse tomber les paquets RX dans __netif_receive_skb_core . Il donne cet exemple pour supprimer les EtherTypes inconnus, qui doivent simplement être ajoutés à /etc/nftables.conf :

table netdev filter {
    chain ingress {
        type filter hook ingress device eno1 priority 0; policy accept;
        meta protocol {0x8912, 0x88e1} drop
    }
}

Sur mon Raspberry Pi avec Raspberry Pi OS Buster C'est ce que je fais :

rpi ~$ sudo apt install nftables

/etc/nftables.conf est maintenant disponible et j'ai ajouté aux règles le nom de l'interface correcte au lieu de eno1 de l'exemple.

rpi ~$ sudo systemctl start nftables.service

et tcpdump me montrent qu'il n'y a plus de paquets EtherType inconnus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X