netstat - mengapa daemon IPv4 hanya mendengarkan port yang terdaftar di -A inet6?

22

Saya memiliki komputer dengan:

Linux superhost 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux

Ini menjalankan Apache pada port 80 pada semua antarmuka, dan itu tidak muncul di netstat -planA inet, tetapi secara tak terduga dapat ditemukan di netstat -planA inet6:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::5672                 :::*                    LISTEN      2402/beam.smp   
tcp6       0      0 :::111                  :::*                    LISTEN      1825/rpcbind    
tcp6       0      0 :::9200                 :::*                    LISTEN      2235/java       
tcp6       0      0 :::80                   :::*                    LISTEN      2533/apache2    
tcp6       0      0 :::34611                :::*                    LISTEN      1856/rpc.statd  
tcp6       0      0 :::9300                 :::*                    LISTEN      2235/java       
...
tcp6       0      0 10.0.176.93:80          10.0.76.98:53704        TIME_WAIT   -               
tcp6       0      0 10.0.176.93:80          10.0.76.98:53700        TIME_WAIT   -               

Saya bisa mencapainya dengan TCP4, seperti yang terlihat di atas. Namun, bahkan koneksi ini terdaftar di bawah tcp6. Mengapa?

Mischa Arefiev
sumber
1
Semua alamat IPv4 memetakan langsung ke alamat IPv6 (tetapi tidak sebaliknya). Lihat: en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
Patrick
4
tolong berhenti menggunakan netstat? meninggal - satu dekade lalu . Gunakan iproute2 'sss
mikeserv

Jawaban:

16

Secara default jika Anda tidak menentukan alamat ke Listenparameter Apache , ini menangani alamat ipv6 menggunakan IPv4-mapped IPv6alamat. Anda dapat melihatnya di Apache ipv6

Output dari netstatbukan berarti Apache tidak mendengarkan pada alamat IPv4. Itu IPv4-mapped IPv6alamat.

pemula
sumber
Ada layanan lain yang mendengarkan alamat IPv4 tetapi terdaftar sebagai tcp6 oleh netstat, misalnya ElasticSearch
Mischa Arefiev
Saya kira Anda membaca tautan wikipedia yang disediakan oleh @Patrick. Semua layanan yang menggunakan alamat IPv6 yang dipetakan IPv4 akan ditampilkan dalam tcp6output netstat.
beginer
14

Alasan untuk ini adalah karena semua alamat IPv4 juga alamat IPv6. Sejumlah kecil alamat IPv6 disisihkan untuk digunakan untuk pemetaan satu-ke-satu dari alamat IPv4. Misalnya, alamat IPv4 192.0.2.128dapat diakses melalui alamat IPv6 ::ffff:192.0.2.128. Ini dilakukan agar aplikasi apa pun yang mendukung IPv6 saja, masih bisa mendengarkan alamat IPv4. Perhatikan bahwa ini tidak dapat digunakan untuk alamat IPv6 (tidak dipetakan) untuk berbicara ke alamat IPv4 tanpa melibatkan hal-hal lain, karena IPv4 tidak akan tahu bagaimana menangani alamat IPv6 (Anda dapat menggunakan NAT, atau solusi lain meskipun).

Karena semua alamat IPv4 diwakili dalam IPv6, saat meminta netstatdaftar aplikasi menggunakan IPv6, Anda juga akan mendapatkan IPv4.
Ini bisa mewakili 10.0.176.93sebagai ::ffff:10.0.176.93, atau bahkan ::ffff:a00:b05d, tapi pengembang aplikasi memilih untuk menunjukkan sebagai bertitik-notasi alamat IPv4 biasa.

Patrick
sumber
Terima kasih, tetapi ini tidak menjawab mengapa mereka tidak muncul ketika melakukan rutin-A inet
Mischa Arefiev
Saya kira alasan koneksi mendengarkan hanya terdaftar sebagai soket tcp6 adalah karena mereka benar-benar soket IPv6, tetapi dengan fitur tambahan mereka juga menerima koneksi IPv4, jika dikonfigurasi untuk melakukannya. Soket terikat ke INADDR_ANY6, dan ketika koneksi IPv4 masuk alamat dipetakan ke alamat IPv6 dengan awalan :: ffff: 0000/96. Ini adalah satu-satunya penggunaan untuk alamat yang dipetakan ini; mereka tidak boleh digunakan pada kawat.
Johan Myréen