我一直试图禁止 iptables 中以 047 开头的 IP 地址,但它会将其更改为 039。
iptables -v -w -I INPUT 1 -s 047.75.162.122 -j DROP
但 IP 地址 39.75.162.122 将被禁止!
您认为为什么会发生这种情况?
答案1
事情是这样的:
$ printf "%d\n" 047
39
047
八进制就是39
十进制。
您只需要删除前导0
。
猜测,这种情况发生是因为 iptables 中的某些东西将 IPv4 地址拆分为 4 个十进制数字,以便它可以将 IP 字符串表示转换为长整型。但这只是猜测。
答案2
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
至少和 C 语言一样古老。