Я пытался запретить IP-адрес в iptables, который начинается с 047, но он изменил бы его на 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Но IP-адрес будет запрещен как 39.75.162.122!
Как вы думаете, почему это происходит?
Я пытался запретить IP-адрес в iptables, который начинается с 047, но он изменил бы его на 039.
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
Но IP-адрес будет запрещен как 39.75.162.122!
Как вы думаете, почему это происходит?
Ответы:
Вот что происходит:
$ printf "%d\n" 047
39
047
в восьмеричной 39
запятой
Вам просто нужно отбросить ведущий 0
.
По-видимому, это происходит потому, что что-то в iptables разделяет адреса IPv4 на 4 десятичных числа, чтобы преобразовать строковое представление IP в длинное. Но это предположение.
inet_addr aka inet_aton
которого требует эффектаstrtol(,,0)
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
- по крайней мере так же стара, как язык Си.
strtol()
функции: « Восьмеричная константа состоит из префикса0
необязательно , за которым следует последовательность из цифр ,0
чтобы7
только ».