Ho provato a vietare un indirizzo IP in iptables che inizia con 047, ma lo cambierebbe in 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Ma l'indirizzo IP sarebbe vietato come 39.75.162.122!
Perché pensi che stia succedendo?
Ho provato a vietare un indirizzo IP in iptables che inizia con 047, ma lo cambierebbe in 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Ma l'indirizzo IP sarebbe vietato come 39.75.162.122!
Perché pensi che stia succedendo?
Risposte:
Questo è ciò che sta succedendo:
$ printf "%d\n" 047
39
047in ottale è 39in decimale.
Devi solo abbandonare il comando 0.
Probabilmente ciò accade perché qualcosa in iptables sta suddividendo gli indirizzi IPv4 in 4 numeri decimali in modo da poter convertire la rappresentazione della stringa IP in un lungo. Ma questa è congettura.
inet_addr aka inet_atonche richiede l'effetto distrtol(,,0)
inet_atonaccetta anche un paio di altri moduli meno comuni ( il manuale li descrive addirittura):
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 -> ...
È probabile che funzionino anche con i browser web.
Il prefisso dei numeri ottali con uno zero e i numeri esadecimali con 0xsono vecchi almeno quanto il linguaggio C.
strtol()funzione: " An costante ottale costituito dal prefisso0eventualmente seguita da una sequenza di cifre0a7solo ".