iptables меняет IP-адреса, которые начинаются с 047. до 39.!

8

Я пытался запретить IP-адрес в iptables, который начинается с 047, но он изменил бы его на 039.

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

Но IP-адрес будет запрещен как 39.75.162.122!

Как вы думаете, почему это происходит?

Талал Аль Халифа
источник

Ответы:

24

Вот что происходит:

$ printf "%d\n" 047
39

047в восьмеричной 39запятой

Вам просто нужно отбросить ведущий 0.

По-видимому, это происходит потому, что что-то в iptables разделяет адреса IPv4 на 4 десятичных числа, чтобы преобразовать строковое представление IP в длинное. Но это предположение.

iwaseatenbyagrue
источник
5
Такое поведение в конечном счете , происходит от лежащих в основе STDLIB strtol()функции: « Восьмеричная константа состоит из префикса 0необязательно , за которым следует последовательность из цифр , 0чтобы 7только ».
Цифровая травма
1
@ DigitalTrauma + или просто использование inet_addr aka inet_atonкоторого требует эффектаstrtol(,,0)
dave_thompson_085
Это соответствует POSIX: «Все числа, представленные как части в точечной десятичной записи IPv4, могут быть десятичными, восьмеричными или шестнадцатеричными, как указано в стандарте ISO C (то есть, ведущий 0x или 0X подразумевает шестнадцатеричное; в противном случае ведущий '0') подразумевает восьмеричное; в противном случае число интерпретируется как десятичное). "
Хоббс
5

inet_atonтакже принимает несколько других, менее обычных форм ( руководство даже описывает их):

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

Они также могут работать в веб-браузерах.

Префикс восьмеричных чисел с нуля, а шестнадцатеричных чисел 0x- по крайней мере так же стара, как язык Си.

ilkkachu
источник