iptables change les adresses IP qui commencent par 047. en 39.!

8

J'ai essayé d'interdire une adresse IP dans iptables qui commence par 047, mais cela la changerait en 039.

iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP

Mais l'adresse IP serait interdite comme 39.75.162.122!

Pourquoi pensez-vous que cela se passe?

Talal Al-Khalifa
la source

Réponses:

24

Voici ce qui se passe:

$ printf "%d\n" 047
39

047en octal est 39en décimal.

Il vous suffit de laisser tomber le leader 0.

À une supposition, cela se produit parce que quelque chose dans iptables divise les adresses IPv4 en 4 nombres décimaux afin qu'il puisse convertir la représentation de la chaîne IP en une longue. Mais c'est une conjecture.

iwaseatenbyagrue
la source
5
Ce comportement provient finalement de la strtol()fonction stdlib sous-jacente : " Une constante octale se compose du préfixe 0éventuellement suivi d'une séquence de chiffres 0à 7seulement ".
Digital Trauma
1
@ DigitalTrauma + ou simplement en utilisant inet_addr aka inet_atonce qui nécessite l'effet destrtol(,,0)
dave_thompson_085
Il est conforme à POSIX: "Tous les nombres fournis en tant que parties en notation décimale pointée IPv4 peuvent être décimaux, octaux ou hexadécimaux, comme spécifié dans la norme ISO C (c'est-à-dire qu'un 0x ou 0X en tête implique hexadécimal; sinon, un '0' en tête) implique octal; sinon, le nombre est interprété comme décimal). "
hobbs
5

inet_atonaccepte également quelques autres formes moins habituelles ( le manuel les décrit même):

octal:
020.0.1.22     ->  16.0.1.22
hexadecimal: 
0x10.0.1.22    ->  16.0.1.22
combination:
020.0.1.0x16   ->  16.0.1.22
bottom two bytes together (old Class B)
16.0.278       ->  16.0.1.22
bottom three bytes together (old Class A)
16.278         ->  16.0.1.22
all in one, hex
0x10000116     ->  16.0.1.22
all in one, decimal (completely unreadable)
268435734      ->  16.0.1.22
this should be simple
0020.0426      ->  ...

Ils sont également susceptibles de fonctionner sur les navigateurs Web.

Le préfixe des nombres octaux avec un zéro et des nombres hexadécimaux avec 0xest au moins aussi ancien que le langage C.

ilkkachu
la source