Linux: Blokir IPv6 untuk aplikasi / nama host tertentu

8

Masalah dan tujuan

Kami tidak mendapatkan IPv6 dari ISP kami sehingga saya memiliki terowongan IPv6 yang berfungsi dengan baik tetapi, tentu saja, tidak terlalu cepat. Dan tidak terlalu bisa diandalkan. Saya ingin memiliki IPv6 tersedia "untuk berjaga-jaga" tetapi saya ingin host tertentu (domain) terhubung dengan IPv4 saja.

Protokol default

Menurut saya semua aplikasi mencoba IPv6 terlebih dahulu; ini mungkin merupakan pengaturan glibc. Saya akan baik-baik saja jika default ini akan dibalik (untuk semua aplikasi).

Netfilter

Akan mungkin untuk memblokir alamat / jaringan IPv6 dengan Netfilter tetapi ada dua masalah:

  1. Apakah ini menyebabkan penundaan karena aplikasi menunggu batas waktu IPv6 sebelum mencoba IPv4?
  2. Beberapa domain tampaknya bercampur sehingga terlihat seperti kekacauan. Memisahkan google.com dan youtube.com sepertinya adalah sesuatu yang tidak ingin Anda lakukan jika Anda dapat menghindarinya.

Saya hanya mencatat bahwa halaman manual untuk ip routekata untuk tipe routing unreachable:

Pengirim lokal mendapatkan kesalahan EHOSTUNREACH.

Apakah hal yang sama terjadi dengan Netfilter DROPs atau REJECTs? Kesalahan seperti itu seharusnya tidak menyebabkan penundaan yang relevan.

Penyaringan DNS

Solusi lain (yang agak mudah jika itu mungkin) adalah menyaring catatan AAAA untuk domain tertentu. Jika itu tidak (mudah) mungkin: Apakah mungkin untuk menghubungkan server DNS dan Netfilter sehingga saya tahu "alamat IP X milik domain Y" sehingga saya dapat menambahkannya ke Netfilter? Adakah yang lebih elegan daripada mencatat semuanya dan mengambil log?

Cara untuk pergi?

Kemungkinan (lainnya) mana yang ada dan apa yang paling mudah?

Hauke ​​Laging
sumber
2
Anda benar-benar tidak akan memperhatikan apa pun yang mengimplementasikan Happy Eyeballs ( RFC 6555 ), seperti browser web modern.
Michael Hampton
DNS sebenarnya tidak dirancang untuk bekerja seperti itu. Dalam hal apa pun, Anda dapat mencoba layanan terowongan yang lebih andal.
Michael Hampton

Jawaban:

16

Anda dapat mengontrol pemilihan alamat dengan /etc/gai.conf. File konfigurasi didokumentasikan dengan baik, dan sudah berisi standarnya, jadi Anda bisa mulai men-tweak.

Default yang menarik di sini adalah:

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

Baris terakhir memberikan preferensi terendah untuk semua alamat IPv4.

Jika Anda ingin memberikan preferensi yang lebih tinggi untuk semua IPv4, Anda dapat mengubahnya ke:

precedence ::ffff:0:0/96  100

Jika Anda hanya ingin memberikan preferensi yang lebih tinggi untuk alamat atau blok IPv4 tertentu, Anda dapat menentukannya juga. Ingatlah bahwa Anda harus menggunakan IPv6 yang dipetakan dengan IPv6 di hex.

Jadi, untuk memberikan preferensi ke 203.0.113.0/24 di atas semua IPv6, Anda akan menambahkan:

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100

Mulai ulang aplikasi yang sedang berjalan agar mereka mengambil perubahan yang Anda buat.


Pada sistem turunan Debian, /etc/gai.confsudah ada. Pada sistem Red Hat, tidak ada, tetapi file sampel terletak di /usr/share/doc/glibc-common-*/gai.conf; cukup salin ke /etc.

Michael Hampton
sumber
Belum pernah mendengar itu sebelumnya; petunjuk bagus meskipun itu bukan solusi DNS.
Hauke ​​Laging
Anda meminta metode termudah ... :)
Michael Hampton
4

OK, inilah jawaban yang sangat berbeda.

Tempatkan host yang menyinggung dengan konektivitas IPv6 jelek /etc/hostsdengan alamat IPv4 yang sesuai.

Sebagai contoh:

199.7.53.74 whois.verisign-grs.com

Ingatlah untuk menghapusnya saat (dalam hal ini) atau konektivitas IPv6 Anda membaik.

Michael Hampton
sumber
1
Itu akan mudah untuk satu host dengan IP tunggal. Seperti yang saya sebutkan ini tentang **. Youtube.com. Dengan demikian banyak nama host yang terpengaruh. Secara teori ini akan mudah dengan DNS: "Blokir catatan AAAA untuk semua yang ada di .youtube.com". Pendekatan Anda adalah dengan memasukkan semua alamat ini (mungkin mereka sering tidak mengubah struktur domain atau IP mereka dan itu boleh saja untuk memeriksa skrip setiap hari) /etc/hosts. Jika tidak ada yang muncul dengan "perangkat lunak server DNS XY dapat memfilter dengan cara ini !!" Saya mungkin akan berakhir dengan itu.
Hauke ​​Laging
Saya akrab dengan hampir setiap paket server DNS yang dikenal, dan tidak ada yang melakukan apa yang Anda inginkan, dengan mudah atau sama sekali. Sekarang jika Anda ingin menulis kode khusus Anda sendiri ... tetapi solusi sebenarnya tentu saja adalah meningkatkan konektivitas IPv6 Anda. Coba pialang terowongan lain?
Michael Hampton