iptables mengubah alamat IP yang dimulai dengan 047. menjadi 39.!

8

Saya telah mencoba untuk melarang alamat IP di iptables yang dimulai dengan 047, tetapi itu akan mengubahnya menjadi 039.

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

Tetapi alamat IP akan dilarang sebagai 39.75.162.122!

Menurut Anda mengapa ini terjadi?

Talal Al-Khalifa
sumber

Jawaban:

24

Inilah yang terjadi:

$ printf "%d\n" 047
39

047di oktal adalah 39dalam desimal.

Anda hanya perlu menjatuhkan yang terdepan 0.

Di duga, ini terjadi karena sesuatu dalam iptables membagi alamat IPv4 menjadi 4 angka desimal sehingga dapat mengubah representasi string IP menjadi panjang. Tapi itu dugaan.

iwaseatenbyagrue
sumber
5
Perilaku ini akhirnya berasal dari stdlib mendasari strtol()fungsi: " Sebuah konstan oktal terdiri dari awalan 0opsional diikuti dengan urutan angka 0untuk 7hanya ".
Digital Trauma
1
@ DigitalTrauma + atau hanya menggunakan inet_addr aka inet_atonyang membutuhkan efekstrtol(,,0)
dave_thompson_085
Ini sesuai dengan POSIX: "Semua angka yang disediakan sebagai bagian dalam notasi desimal bertitik IPv4 dapat berupa desimal, oktal, atau heksadesimal, seperti yang ditentukan dalam standar ISO C (yaitu, 0x atau 0X terkemuka menyiratkan heksadesimal; jika tidak, terkemuka '0' menyiratkan oktal; jika tidak, jumlahnya ditafsirkan sebagai desimal). "
hobbs
5

inet_atonjuga menerima beberapa formulir lain yang tidak biasa ( manual ini bahkan menggambarkannya):

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

Mereka juga cenderung bekerja di browser web.

Awalan angka oktal dengan nol, dan angka heksadesimal dengan 0xsetidaknya setua bahasa C.

ilkkachu
sumber