iptables ändert IP-Adressen, die mit 047. beginnen, auf 39.!

8

Ich habe versucht, eine IP-Adresse in iptables zu sperren, die mit 047 beginnt, aber es würde sie in 039 ändern.

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

Aber die IP-Adresse wäre als 39.75.162.122 gesperrt!

Warum denkst du, passiert das?

Talal Al-Khalifa
quelle

Antworten:

24

Folgendes passiert:

$ printf "%d\n" 047
39

047in oktal ist 39in dezimal.

Sie müssen nur die Führung fallen lassen 0.

Vermutlich geschieht dies, weil etwas in iptables IPv4-Adressen in 4 Dezimalzahlen aufteilt, damit die IP-Zeichenfolgendarstellung in eine lange konvertiert werden kann. Aber das ist eine Vermutung.

Ich wurde von der Wahrheit gegessen
quelle
5
Dieses Verhalten kommt letztlich aus der zugrundeliegenden stdlib strtol()Funktion: „ Eine oktale Konstante des Präfixes besteht 0durch eine Sequenz der Ziffern gegebenenfalls gefolgt , 0um 7nur “.
Digitales Trauma
1
@ DigitalTrauma + oder nur mit, inet_addr aka inet_atonwas die Wirkung vonstrtol(,,0)
dave_thompson_085
Es ist POSIX-konform: "Alle Zahlen, die als Teile in IPv4-Punkt-Dezimalschreibweise angegeben werden, können dezimal, oktal oder hexadezimal sein, wie im ISO C-Standard angegeben (dh eine führende 0x oder 0X impliziert eine Hexadezimalzahl; andernfalls bedeutet eine führende '0'). impliziert Oktal; andernfalls wird die Zahl als Dezimalzahl interpretiert. "
Hobbs
5

inet_atonakzeptiert auch einige andere weniger übliche Formen ( das Handbuch beschreibt sie sogar):

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

Sie funktionieren wahrscheinlich auch in Webbrowsern.

Das Präfixieren von Oktalzahlen mit einer Null und Hexadezimalzahlen mit 0xist mindestens so alt wie die C-Sprache.

ilkkachu
quelle