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として禁止されます。

なぜこれが起こっていると思いますか?

回答:


24

これが起こっていることです:

$ printf "%d\n" 047
39

0478進数は3910進数です。

あなただけのリーディングをドロップする必要があり0ます。

恐らく、これはiptablesの何かがIPv4アドレスを4つの10進数に分割して、IP文字列表現をlongに変換できるために発生しています。しかし、それは推測です。


5
この動作は、最終的には基礎となるSTDLIBのから来ているstrtol()機能:「8進定数は接頭辞で構成され0、必要に応じて数字の列が続く07だけ」。
デジタルトラウマ2017年

1
@ DigitalTrauma +または次inet_addr aka inet_atonの効果を必要とするだけを使用strtol(,,0)
dave_thompson_085

これはPOSIXに準拠しています。「IPv4ドット付き10進表記でパーツとして提供されるすべての数値は、ISO C標準で指定されているように、10進数、8進数、または16進数である可能性があります(つまり、先頭の0xまたは0Xは16進数を意味します。それ以外の場合は、先頭の「0」 8進数を意味します。それ以外の場合、数値は10進数として解釈されます。」
ホッブ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      ->  ...

彼らはウェブブラウザでも動作するようです。

8進数の接頭辞として0を、16進数の接頭辞0xとして少なくともC言語と同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.