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?

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.