Przekonaj apt-get * not *, aby użyć metody IPv6


239

ISP, nad którym pracuję, ustanawia wewnętrzną sieć IPv6 w ramach przygotowań do ewentualnego połączenia z Internetem IPv6. W rezultacie kilka serwerów w tej sieci próbuje teraz domyślnie połączyć się z security.debian.org za pomocą adresu IPv6 podczas działania apt-get update, co powoduje, że trzeba czekać na długi limit czasu przy każdym pobieraniu aktualizacji .

Czy istnieje sposób, aby powiedzieć aptowi, aby wolał IPv4 lub całkowicie ignorował IPv6?


3
Czy nie powinno to wrócić natychmiast z błędem routingu?
pjc50

7
Nie, jest całkiem możliwe, że ich sieć wewnętrzna ma routing między wieloma podsieciami (a hosty mają domyślną bramę IPv6), ale brak łączności IPv6 ze światem zewnętrznym.
Andrew Medico

5
Prawdopodobnie istnieje sposób na skonfigurowanie, /etc/gai.confaby security.debian.orgrekord A był zwracany przed rekordem AAA, ale nie wiem dokładnie, co umieścić w tym pliku.
Gilles

3
@AndrewMedico - ale czy domyślne bramy ich sieci nie powinny wiedzieć, że nie ma zewnętrznej łączności ipV6 i dość szybko odrzucić próbę wyjścia na brzeg? Myślę, że jest tu problem z siecią, a także zadawane pytanie.
Michael Kohne,

7
Naprawienie routera krawędziowego / zapory ogniowej / czegokolwiek, co powoduje problem, jest „najlepszym” sposobem na poradzenie sobie z tym. To powinno być zwrócenie docelowy nieosiągalny pakietu ICMP. To się nie dzieje albo coś to blokuje. Tak czy inaczej, problem należy zgłosić pracownikom sieci.
Michael Hampton,

Odpowiedzi:


319

Dodaj -o Acquire::ForceIPv4=truepodczas uruchamiania apt-get.

Jeśli chcesz, aby ustawienie było trwałe, po prostu utwórz /etc/apt/apt.conf.d/99force-ipv4 i umieść Acquire::ForceIPv4 "true";w nim:

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

Opcje konfiguracyjne Acquire::ForceIPv4i Acquire::ForceIPv6dodano do wersji 0.9.7.9 ~ EXP1 (patrz błąd 611891 ), który jest dostępny od Ubuntu Saucy (wydany w październiku 2013 roku) oraz Debian Jessie (wydana w kwietniu 2015).


7
Przeniesienie „zaakceptowanego” do tego; podczas gdy oryginalna 30-punktowa odpowiedź jest całkowicie poprawne, to zastosowanie na znacznie szerszą skalę, podczas gdy ten zapewnia możliwość tylko ograniczyć apt-get.
Shadur

W swojej odpowiedzi proszę odpowiednio opisać. -o Acquire :: ForceIPv4 = true to dodatek do polecenia umożliwiający użytkownikowi korzystanie z ipv4
Kendrick

Odpowiedź zaktualizowana zgodnie z sugestią Kendricka
mmoya

1
Sądząc z reszty mojego apt.conf, musisz napisać to w ten sposób: Acquire::ForceIPv4 "true";(z podwójnymi cytatami)
mirabilos

6
@ZAB, ponieważ jeśli nie masz dostępu do zapisu do pliku, sudo echo 'test' > filenie działałoby, ponieważ przekierowanie jest wykonywane z uprawnieniami użytkownika
LeartS

81

Jak mówi Gilles , użyj gai.conf. Uwagi:

  1. Działa to na znacznie niższym poziomie (sieci DNS i IP) niż APT, więc zmieni sposób, w jaki działają wszystkie twoje aplikacje sieciowe - przynajmniej wszyscy, którzy tego używają getaddrinfo.
  2. Przed edycją gai.confnależy wykonać kopię zapasową, a także przeczytać ją (nie martw się, jest krótka). Poniższe zmiany są prawdopodobnie już wspomniane w twoim bieżącym pliku; jeśli bieżący plik wskazuje coś innego niż to, co wspomniano poniżej, prawdopodobnie powinieneś preferować zawartość bieżącego pliku.

Ale jeśli tego właśnie chcesz (a prawdopodobnie tak jest), przejdźmy dalej. Powiedzmy, że mamy dwóch gospodarzy www.he.neti 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

Przypadek 1: preferuj IPV4 dla wszystkich hostów

Dołącz do /etc/gai.confnastępującego wiersza:

precedence ::ffff:0:0/96  100

Po zapisaniu edytowanego pliku (bez konieczności ponownego uruchamiania) powinieneś zobaczyć aplikacje sieciowe (np. telnet) Korzystające z IPV4: np.

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

Przypadek 2: preferuj IPV6 dla określonych hostów

Jeśli chcemy preferować IPV6 tylko dla www.he.netlub jego sieci, możemy dołączyć maskę / prefiks do wszystkich lub tylko części jego adresu IPV6 /etc/gai.conf. Np. Następujący wiersz:

precedence 2001:470::/32 100

(po zapisaniu edytowanego pliku) produkuje

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

Przypadek 3: preferuj IPV4 dla określonych hostów

Jeśli odwrócimy maskę, czy odwrotność będzie prawdziwa? Według @GrueMaster, dołączanie

precedence 2001:470::/96 100

pracował dla niego po wyłączeniu IPV6 dla security.ubuntu.com(w przeciwnym razie utknie na zawsze).


Zobacz też:


Być może streszcza treść na wypadek, gdyby powyższe linki zniknęły?
Faheem Mitha

Jaka jest składnia, aby wyłączyć IPv6 dla określonej nazwy, a przynajmniej dla określonego adresu (zakresu)? Jeśli dodasz to do swojego posta, będzie to najlepsza odpowiedź tutaj.
Gilles

Dzięki. Dodałem 2 linie #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 do mojego /etc/gai.conf i aktualizacja apt-get działa teraz idealnie.
don bright

10

Możesz ustawić apt-cacher-ng na wolnym komputerze, aby działał jako proxy / cache dla wszystkich twoich hostów. Możesz zmusić konfigurację do używania tylko określonych hostów lub użyć sztuczki / etc / hosts sugerowanej przez @badp na tym samym komputerze.

apt-get install apt-cacher-ng

Po skonfigurowaniu apt-cache-ng wystarczy upuścić następującą linię (ze zmienionym adresem IP / nazwą hosta, aby wskazywała na twoją pamięć podręczną) w /etc/apt/apt.conf.d/90httpproxy

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

Korzystam z tej konfiguracji, aby zmniejszyć wykorzystanie przepustowości, ale powinno to rozwiązać problem. Niestety nie znam sposobu na bezpośrednie wyłączenie wyszukiwania ipv6 dla samego apt-get.


Nadal nie jest to idealne rozwiązanie, ale tak dobre, jak to prawdopodobnie będzie możliwe. Dzięki.
Shadur

5

Można obejść ten problem, konfigurując serwer proxy DNS, który upuszcza odpowiedzi ip6.


Czy Twój lokalny resolver nadal nie będzie próbował uzyskać rekordu AAAA? I czas?
Mikel

4

Co powiesz na dodanie wiersza /etc/hostszastępującego odpowiednie adresy? na przykład,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 

13
Zachowam to rozwiązanie na koniec, jeśli okaże się, że nie ma absolutnie żadnej innej możliwości; Ja naprawdę nie lubię zaśmiecania /etc/hostsadresy IP nie są właścicielami siebie.
Shadur

@Shadur Tak, całkowicie rozumiem twój punkt :)
badp

Uwaga: należy je odwrócić, więc jest to adres IP, a następnie nazwa hosta
Mike T

1

Porwanie starego tematu, ale ostatnio ten sam problem. Tak więc, w oparciu o porady podane powyżej oraz wyniki hosta i 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

Rozwiązano problem w nieco inny sposób - obniżono priorytet sieci IPv6, które zawierają security.debian.org w /etc/gai.conf :

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

Dlatego IPv6 jest nadal preferowany, z wyjątkiem security.debian.org .


1

Na 08 października 2014 miałem ten sam problem, próbując zaktualizować Debiana za proxy w sieci lokalnej. W nadziei, że będzie to miało znaczenie dla innych, zamieszczam tutaj swoją odpowiedź. Jak wspomnieli inni, podczas edycji /etc/hostsnależy zachować ostrożność.

Ale osobiście chciałem tylko zrobić aktualizację.

Zawartość /etc/apt/sources.list podczas aktualizacji (przed aktualizacją było inaczej):

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

Treść pliku /etc/apt/apt.conf:

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

Dodatek do / 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

Teraz działanie apt-get update ; apt-get upgradejako root działało dobrze.

Jak wspomniano w innych odpowiedziach, użyj, uruchom polecenie hosta w domenie, aby uzyskać poprawny adres IP do wstawienia do pliku hosts.

Przykład:

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

Pomyślnie zaktualizowano system do Debian GNU/Linux testing (jessie). Możesz nie chcieć uruchamiać z testowymi repozytoriami, a następnie po prostu usunąć je ze źródeł. Repozytoria testowe zawierają nowsze aktualizacje kilku pakietów, ale nie są uważane za stabilne.


Ponownie modyfikacja hostspliku jest wysoce nieoptymalnym rozwiązaniem.
Shadur

0

Znalazłem o wiele lepszy sposób na zrobienie tego. Otwórz sources.listplik i zanotuj nazwy hostów repozytoriów. Uzyskaj ich adresy IPv4 , a następnie edytuj je sources.listprzy użyciu adresów IPv4, a nie nazw hostów. Apt-get powinien teraz kontaktować się z repozytoriami pod podanymi adresami IPv4, omijając IPv6.

Wadą jest to, że repozytoria zwykle mają skonfigurowane równoważenie obciążenia i / lub geolokalizację IP, które ta metoda oczywiście omija. Nie powinno to jednak mieć znaczenia, jeśli robi to tylko kilka osób. Jeśli okaże się, że jeden serwer lustrzany działa wolno, spróbuj uzyskać inny adres IP repo (na przykład za pomocą usługi ping online) i użyj go.


2
To naprawdę złe rozwiązanie z powodów, które już opisałeś.
Shadur

-4

Możesz spróbować, jeśli działa dla Ciebie

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

-> zastąp nazwę interfejsu


To jest rozwiązanie innego pytania niż zadałem.
Shadur,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.