Meyakinkan apt-get * not * untuk menggunakan metode IPv6

239

ISP tempat saya bekerja sedang menyiapkan jaringan IPv6 internal sebagai persiapan untuk akhirnya terhubung ke internet IPv6. Akibatnya, beberapa server di jaringan ini sekarang mencoba untuk terhubung ke security.debian.org melalui alamat IPv6 secara default ketika menjalankan apt-get update, dan itu mengakibatkan harus menunggu batas waktu yang lama setiap kali saya mengunduh pembaruan dalam bentuk apa pun .

Apakah ada cara untuk memberitahu apt untuk memilih IPv4 atau mengabaikan IPv6 sama sekali?

Shadur
sumber
3
Bukankah seharusnya itu segera kembali dengan kegagalan routing?
pjc50
7
Tidak, sepenuhnya mungkin bahwa jaringan internal mereka memiliki perutean antara beberapa subnet (dan host memiliki gateway IPv6 default) tetapi tidak ada konektivitas IPv6 ke dunia luar.
Andrew Medico
5
Mungkin ada cara untuk mengatur /etc/gai.confsehingga security.debian.orgcatatan A dikembalikan sebelum catatan AAA, tapi saya tidak tahu persis apa yang harus dimasukkan ke dalam file itu.
Gilles
3
@AndrewMedico - tetapi bukankah seharusnya gateway standar jaringan mereka tahu bahwa tidak ada konektivitas ipV6 eksternal dan menolak upaya keluar di tepi dengan cukup cepat? Saya pikir ada masalah jaringan di sini serta pertanyaan yang diajukan.
Michael Kohne
7
Memperbaiki router tepi / firewall / apa pun yang menyebabkan masalah adalah cara "terbaik" untuk menangani ini. Itu harus mengembalikan paket ICMP tujuan yang tidak terjangkau. Ini entah tidak terjadi, atau ada sesuatu yang menghalangi itu. Bagaimanapun, masalahnya harus dilaporkan kepada orang-orang jaringan Anda.
Michael Hampton

Jawaban:

319

Tambahkan -o Acquire::ForceIPv4=truesaat berjalan apt-get.

Jika Anda ingin membuat pengaturan terus-menerus, cukup buat /etc/apt/apt.conf.d/99force-ipv4 dan masukkan Acquire::ForceIPv4 "true";:

echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

Opsi konfigurasi Acquire::ForceIPv4dan Acquire::ForceIPv6ditambahkan ke versi 0.9.7.9 ~ exp1 (lihat bug 611891 ) yang tersedia sejak Ubuntu Saucy (dirilis pada Oktober 2013) dan Debian Jessie (dirilis pada April 2015).

mmoya
sumber
7
Memindahkan "yang diterima" ke yang ini; sementara jawaban 30 poin yang asli adalah benar, itu berlaku pada skala yang jauh lebih luas sementara ini memberikan opsi untuk hanya membatasi apt-get.
Shadur
Harap jelaskan secara deskriptif dalam jawaban Anda. -o Acquire :: ForceIPv4 = true adalah tambahan pada perintah untuk memungkinkan pengguna menggunakan ipv4
Kendrick
Jawaban diperbarui mengikuti saran Kendrick
mmoya
1
Menilai dari sisa saya, apt.confAnda perlu menulis seperti ini: Acquire::ForceIPv4 "true";(dengan tanda kutip ganda)
mirabilos
6
@ZAB karena jika Anda tidak memiliki akses tulis ke file, sudo echo 'test' > filetidak akan berfungsi karena pengalihan dijalankan dengan izin pengguna
LeartS
81

Seperti yang dikatakan Gilles , gunakan gai.conf. Catatan:

  1. Ini bekerja pada level yang jauh lebih rendah (jaringan DNS dan IP) daripada APT, sehingga akan mengubah cara semua jaringan aplikasi Anda - setidaknya, semua yang digunakan getaddrinfo.
  2. Sebelum mengedit gai.conf, Anda harus mencadangkannya, dan juga membacanya (jangan khawatir, pendek). Hasil edit di bawah ini mungkin sudah disebutkan dalam file Anda saat ini; jika file saat ini menunjukkan sesuatu yang berbeda dari apa yang disebutkan di bawah ini, Anda mungkin harus lebih suka apa yang ada di file Anda saat ini.

Tetapi jika ini yang Anda inginkan (mungkin memang demikian), mari kita lanjutkan. Katakanlah kita memiliki dua host www.he.netdan www.ripe.net:

$ host www.he.net
www.he.net is an alias for he.net.
he.net has address 216.218.186.2
he.net has IPv6 address 2001:470:0:76::2

$ host www.ripe.net
www.ripe.net has address 193.0.6.139
www.ripe.net has IPv6 address 2001:67c:2e8:22::c100:68b

Kasus 1: lebih suka IPV4 untuk semua host

Tambahkan ke /etc/gai.confbaris berikut:

precedence ::ffff:0:0/96  100

Setelah menyimpan file yang diedit (tidak perlu restart), Anda akan melihat aplikasi jaringan (misalnya, telnet) menggunakan IPV4: misalnya,

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 216.218.186.2...

Kasus 2: lebih suka IPV6 untuk host tertentu

Jika kami ingin memilih IPV6 hanya untuk www.he.netatau jaringannya, kami dapat menambahkan mask / awalan untuk semua, atau hanya sebagian, dari alamat IPV6-nya /etc/gai.conf. Misalnya, baris berikut:

precedence 2001:470::/32 100

(setelah menyimpan file yang diedit) menghasilkan

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 2001:470:0:76::2...
^C

Kasus 3: lebih suka IPV4 untuk host tertentu

Jika kita membalikkan topeng, apakah kebalikannya benar? Menurut @GrueMaster, menambahkan

precedence 2001:470::/96 100

bekerja untuknya setelah menonaktifkan IPV6 untuk security.ubuntu.com(jika tidak terhenti selamanya).


Lihat juga:

Lmwangi
sumber
Mungkin meringkas konten jika tautan di atas hilang?
Faheem Mitha
Jadi, apa sintaks untuk menonaktifkan IPv6 untuk nama tertentu, atau setidaknya untuk alamat (rentang) tertentu? Jika Anda menambahkannya ke posting Anda, itu akan menjadi jawaban terbaik di sini.
Gilles
Terima kasih. Saya menambahkan 2 baris #security.debian.org has IPv6 address 2610:148:1f10:3::73 \n #security.debian.org has IPv6 address 2001:4f8:8:36::6 \n precedence 2001:4f8::/96 100 \n precedence 2610:148::/96 100 ke /etc/gai.conf saya dan pembaruan apt-get berfungsi dengan sempurna sekarang.
don bright
10

Anda dapat mengatur apt-cacher-ng pada mesin cadangan untuk bertindak sebagai proxy / cache untuk semua host Anda. Anda dapat memaksa konfigurasi untuk hanya menggunakan host tertentu atau menggunakan trik / etc / hosts yang disarankan oleh @badp pada satu mesin itu.

apt-get install apt-cacher-ng

Setelah Anda memiliki pengaturan apt-cache-ng, Anda hanya perlu menghapus baris berikut (dengan alamat IP / nama host diubah untuk menunjuk ke mesin cacher Anda) di /etc/apt/apt.apt.apt/apt.conf.d/90httpproxy

Acquire::http { Proxy "http://[192.168.1.254]:3142"; };

Saya menggunakan pengaturan itu untuk mengurangi penggunaan bandwidth tetapi harus mengatasi masalah Anda. Sayangnya saya tidak mengetahui cara untuk langsung menonaktifkan pencarian ipv6 untuk apt-get sendiri.

Richm
sumber
Masih bukan solusi yang sempurna, tetapi sebaik mungkin akan didapat. Terima kasih.
Shadur
5

Anda bisa mengatasinya dengan menyiapkan server proxy DNS yang menjatuhkan respons ip6.

pjc50
sumber
Tidakkah resolver lokal Anda masih mencoba untuk mendapatkan catatan AAAA? Dan waktu istirahat?
Mikel
4

Bagaimana dengan menambahkan baris dalam /etc/hostsmengganti alamat yang relevan? misalnya,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 
badp
sumber
13
Saya akan menyimpan solusi ini untuk yang terakhir jika ternyata sama sekali tidak ada cara lain; Saya benar - benar tidak suka berantakan /etc/hostsdengan alamat IP yang tidak saya miliki sendiri.
Shadur
@ Safur Ya, saya benar-benar dapat melihat maksud Anda :)
badp
Catatan: ini perlu dibalik, jadi itu IP lalu nama host
Mike T
1

Membajak topik lama, tetapi dihadapkan dengan masalah yang sama baru-baru ini. Jadi, berdasarkan saran yang diberikan di atas dan output dari host dan whois :

# host security.debian.org
security.debian.org has address 212.211.132.250
security.debian.org has address 195.20.242.89
security.debian.org has address 212.211.132.32
security.debian.org has IPv6 address 2001:8d8:580:400:6564:a62:0:2
security.debian.org has IPv6 address 2001:a78:5:0:216:35ff:fe7f:be4f
security.debian.org has IPv6 address 2001:a78:5:1:216:35ff:fe7f:6ceb

Memecahkan masalah dengan cara yang sedikit berbeda - menurunkan prioritas jaringan IPv6 yang berisi security.debian.org di /etc/gai.conf :

# Make IPv6 for security.debian.org undesirable
precedence 2001:8d8:580::/48    5
precedence 2001:a78:5::/48      5

Jadi, IPv6 masih lebih disukai kecuali untuk security.debian.org .

Timur Bakeyev
sumber
1

Pada 08 Oktober 2014, saya memiliki masalah yang sama, mencoba memperbarui debian di belakang proxy di jaringan lokal. Dengan harapan ini akan relevan bagi orang lain, saya memposting tanggapan saya di sini. Seperti yang disebutkan orang lain, pengeditan /etc/hostsadalah sesuatu yang harus hati-hati.

Tetapi secara pribadi saya hanya ingin pembaruan dilakukan.

Konten /etc/apt/sources.list ketika melakukan pembaruan (berbeda sebelum pembaruan ..):

deb http://http.debian.net/debian/ testing main
deb-src http://http.debian.net/debian/ testing main

deb http://mirrors.kernel.org/debian/ wheezy main
deb-src http://mirrors.kernel.org/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

Isi /etc/apt/apt.conf:

Acquire::http::proxy "http://192.168.1.10:7777/";
Acquire::http::Timeout "10";
Acquire::ftp::Timeout "10";

Tambahan ke / etc / hosts:

#Workaround for making apt-get work (08-10-2014)
195.20.242.89 security.debian.org
130.89.148.12 ftp.debian.org

Sekarang, menjalankan apt-get update ; apt-get upgradesebagai root bekerja dengan baik.

Seperti disebutkan dalam jawaban lain, gunakan, jalankan perintah host pada domain untuk mendapatkan ip yang benar untuk dimasukkan dalam file host.

Contoh:

$ host ftp.debian.org
ftp.debian.org has address 130.89.148.12

Ini berhasil memperbarui sistem ke Debian GNU/Linux testing (jessie). Anda mungkin tidak ingin menjalankan dengan repositori pengujian, kemudian hapus saja dari sumbernya. Repositori pengujian memberi Anda lebih banyak pembaruan terbaru dari beberapa paket, tetapi tidak dianggap stabil.

NordicViking
sumber
Sekali lagi, memodifikasi hostsfile adalah solusi yang sangat suboptimal.
Shadur
0

Saya telah menemukan cara yang lebih baik untuk melakukan ini. Buka sources.listfile Anda dan catat nama host dari repo. Dapatkan alamat IPv4 mereka , lalu edit sources.listdengan alamat IPv4 daripada nama host. Apt-get sekarang harus menghubungi repositori melalui alamat IPv4 yang Anda tentukan, melewati IPv6.

Ada kerugiannya bahwa repo biasanya memiliki semacam penyeimbangan muatan dan / atau pengaturan geolokasi IP, yang tentu saja dilewati oleh metode ini. Namun, tidak masalah jika hanya beberapa orang yang melakukannya. Jika Anda menemukan satu mirror lambat, coba dapatkan alamat IP repo lain (misalnya, dengan menggunakan layanan ping online) dan gunakan itu.

D. Strout
sumber
2
Sebenarnya itu solusi yang sangat buruk, untuk alasan yang sudah Anda jelaskan.
Shadur
-4

Anda dapat mencoba ini jika berhasil untuk Anda

user@ubuntuvm:~$ sudo bash
root@ubuntuvm:~# echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6 

-> ganti nama antarmuka Anda

Chetan
sumber
Ini adalah solusi untuk pertanyaan yang berbeda dari yang saya tanyakan.
Shadur