O iptables está alterando os endereços IP que começam com 047. a 39.!

8

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?

Talal Al-Khalifa
fonte

Respostas:

24

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.

iwaseatenbyagrue
fonte
5
Este comportamento em última análise, vem do stdlib subjacente strtol()função: " Uma constante octal consiste no prefixo 0opcionalmente seguido por uma sequência dos dígitos 0para 7única ".
Digital Trauma
1
@ DigitalTrauma + ou apenas usando inet_addr aka inet_atono que requer o efeito destrtol(,,0)
dave_thompson_085
É compatível com POSIX: "Todos os números fornecidos como partes na notação decimal pontilhada IPv4 podem ser decimais, octais ou hexadecimais, conforme especificado no padrão ISO C (ou seja, um 0x ou 0X inicial implica hexadecimal; caso contrário, um '0' inicial implica octal; caso contrário, o número é interpretado como decimal) ".
hobbs
5

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.

ilkkachu
fonte