iptables está cambiando las direcciones IP que comienzan con 047. a 39.!

8

He estado tratando de prohibir una dirección IP en iptables que comienza con 047, pero la cambiaría a 039.

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

¡Pero la dirección IP estaría prohibida como 39.75.162.122!

¿Por qué piensas que esto está sucediendo?

Talal Al-Khalifa
fuente

Respuestas:

24

Esto es lo que está sucediendo:

$ printf "%d\n" 047
39

047en octal es 39en decimal.

Solo necesita soltar el líder 0.

Supongo que esto está sucediendo porque algo en iptables está dividiendo las direcciones IPv4 en 4 números decimales para que pueda convertir la representación de la cadena IP en un largo. Pero eso es una conjetura.

iwaseatenbyagrue
fuente
55
Este comportamiento en última instancia proviene de la stdlib subyacente strtol()función: " Una constante octal consiste en el prefijo 0seguido opcionalmente por una secuencia de los dígitos 0a 7solamente ".
Digital Trauma
1
@ DigitalTrauma + o simplemente usando lo inet_addr aka inet_atonque requiere el efecto destrtol(,,0)
dave_thompson_085
Es compatible con POSIX: "Todos los números suministrados como partes en notación decimal con puntos IPv4 pueden ser decimales, octales o hexadecimales, como se especifica en el estándar ISO C (es decir, un 0x o 0X inicial implica hexadecimal; de lo contrario, un '0' inicial implica octal; de lo contrario, el número se interpreta como decimal) ".
hobbs
5

inet_atonTambién acepta un par de otras formas menos habituales ( el manual incluso las describe):

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      ->  ...

Es probable que también funcionen en los navegadores web.

Prefijar los números octales con un cero y los números hexadecimales con 0xes al menos tan antiguo como el lenguaje C.

ilkkachu
fuente