Eu tenho tentado banir um endereço IP no iptables que começa com 047, mas o alteraria para 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Mas o endereço IP seria banido como 39.75.162.122!
Por que você acha que isso está acontecendo?
Eu tenho tentado banir um endereço IP no iptables que começa com 047, mas o alteraria para 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Mas o endereço IP seria banido como 39.75.162.122!
Por que você acha que isso está acontecendo?
Respostas:
Isto é o que está acontecendo:
$ printf "%d\n" 047
39
047em octal está 39em decimal.
Você só precisa abandonar a liderança 0.
De certa forma, isso está acontecendo porque algo no iptables está dividindo os endereços IPv4 em 4 números decimais, para que ele possa converter a representação da string IP em um longo. Mas isso é conjectura.
inet_addr aka inet_atono que requer o efeito destrtol(,,0)
inet_atontambém aceita algumas outras formas menos comuns ( o manual até as descreve):
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 -> ...
É provável que eles também funcionem em navegadores da web.
A prefixação de números octais com zero e números hexadecimais com 0xé pelo menos tão antiga quanto a linguagem C.
strtol()função: " Uma constante octal consiste no prefixo0opcionalmente seguido por uma sequência dos dígitos0para7única ".