iptables正在将以047.开头的IP地址更改为39。


8

我一直试图禁止以047开头的iptables中的IP地址,但是它将更改为039。

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

但是IP地址将被禁止为39.75.162.122!

您为什么认为这种情况正在发生?

Answers:


24

这是正在发生的事情:

$ printf "%d\n" 047
39

047八进制是39十进制。

您只需要放弃领导0

猜测是由于iptables中的某些内容将IPv4地址拆分为4个十进制数字,因此它可以将IP字符串表示形式转换为long。但这是推测。


5
此行为最终来自底层STDLIB strtol()功能:“ 八进制常量由前缀0任选地随后的数字序列07唯一 ”。
Digital Trauma'Mar

1
@ DigitalTrauma +或仅使用inet_addr aka inet_aton它需要产生效果strtol(,,0)
dave_thompson_085

符合POSIX:“按照ISO C标准的规定,以IPv4点分十进制表示形式提供的所有数字都可以是十进制,八进制或十六进制(即,前导0x或0X表示十六进制;否则,前导'0'表示八进制;否则,数字解释为十进制)。”
霍布斯(Hobbs)2017年

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至少与C语言一样古老。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.