Переконати apt-get * not * у використанні методу IPv6


239

ISP, над яким я працюю, налаштовує внутрішню мережу IPv6, готуючись до зрештою підключення до Інтернету IPv6. Як результат, декілька серверів цієї мережі зараз намагаються підключитися до security.debian.org через його IPv6-адресу за замовчуванням під час запуску apt-get update, і це призводить до необхідності чекати тривалий час очікування, коли я завантажую оновлення будь-якого типу. .

Чи є спосіб сказати підході або віддавати перевагу IPv4 або взагалі ігнорувати IPv6?


3
Чи не повинно це повернутися негайно з відмовою від маршрутизації?
— pjc50

7
Ні, цілком можливо, що їх внутрішня мережа має маршрутизацію між декількома підмережами (а хости мають шлюз за замовчуванням IPv6), але немає зв’язку IPv6 із зовнішнім світом.
— Ендрю Медіко

5
Напевно, існує спосіб налаштувати /etc/gai.confтак, щоб security.debian.orgзапис запису повертався перед записом AAA, але я не знаю точно, що вкласти у цей файл.
— Жиль

3
@AndrewMedico - але чи не повинні шлюзи за замовчуванням їхньої мережі знати, що немає зовнішнього підключення ipV6 і досить швидко відхиляти спробу виходу на край? Я думаю, тут є мережеве питання, а також питання, яке задають.
— Майкл Коне

7
Виправити крайовий маршрутизатор / брандмауер / все, що спричиняє проблему, є "найкращим" способом вирішити це. Він повинен повертати недоступний пакет ICMP призначення. Це або не відбувається, або щось блокує. У будь-якому випадку про проблему слід повідомити людей мережі.
— Майкл Хемптон

Відповіді:


319

Додайте -o Acquire::ForceIPv4=trueпід час запуску apt-get.

Якщо ви хочете зробити налаштування стійким, просто створіть /etc/apt/apt.conf.d/99force-ipv4 та вставте Acquire::ForceIPv4 "true";його:

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

Параметри конфігурації Acquire::ForceIPv4і Acquire::ForceIPv6були додані в версії 0.9.7.9 ~ exp1 (див помилка 611891 ) , який доступний з Ubuntu Зухвалий (випущений в жовтні 2013 року ) і Debian Jessie (випущений в квітні 2015 року).


7
Переміщення «прийнятого» до цього; хоча оригінальна відповідь на 30 балів є абсолютно правильною, вона застосована в набагато ширшому масштабі, в той час як це дає можливість просто обмежити apt-get.
— Шадур

Будь ласка, опишіть належним чином у своїй відповіді. -o Acquire :: ForceIPv4 = true - це доповнення до команди, яка дозволяє користувачеві використовувати ipv4
— Kendrick

Відповідь оновлена ​​за пропозицією Кендріка
— mmoya

1
Судячи з решти моїх, apt.confвам потрібно написати це так: Acquire::ForceIPv4 "true";(з подвійними цитатами)
— mirabilos

6
@ZAB, тому що якщо у вас немає доступу до файлу, sudo echo 'test' > fileвін не працюватиме, оскільки перенаправлення виконується з дозволами користувача
— LeartS

81

Як каже Жиль , використовуйте gai.conf. Примітки:

  1. Це працює на набагато нижчому рівні (мережа DNS та IP), ніж APT, тому це змінить, як усі ваші програми - як мінімум, усі, які використовують getaddrinfo.
  2. Перш ніж редагувати свій файл gai.conf, слід створити його резервну копію, а також прочитати (не хвилюйтесь, це коротко). Наведені нижче зміни, ймовірно, вже згадуються у вашому поточному файлі; якщо поточний файл вказує щось інше, ніж зазначено нижче, ви, мабуть, віддасте перевагу тому, що є у вашому поточному файлі.

Але якщо це те, що ви хочете (що це, мабуть, є), давайте продовжимо. Скажімо , у нас є два вузла www.he.netі 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

Випадок 1: віддайте перевагу IPV4 для всіх хостів

Додайте до /etc/gai.confнаступного рядка:

precedence ::ffff:0:0/96  100

Після збереження відредагованого файлу (не потрібно перезавантажувати) вам слід побачити мережеві програми (наприклад, telnet) за допомогою IPV4: наприклад,

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

Випадок 2: віддайте перевагу IPV6 для конкретних хостів

Якщо ми хочемо віддати перевагу лише IPV6 для www.he.netабо її мережі, ми можемо додати маску / префікс для всієї або лише якоїсь частини її адреси IPV6 /etc/gai.conf. Наприклад, наступний рядок:

precedence 2001:470::/32 100

(після збереження відредагованого файлу) створює

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

Випадок 3: віддайте перевагу IPV4 для конкретних хостів

Якщо ми перевернемо маску, чи буде зворотна правда? За словами @GrueMaster, додаючи

precedence 2001:470::/96 100

працював над ним після відключення IPV6 для security.ubuntu.com(інакше він зупиняється назавжди).


Дивитися також:


Можливо, підсумуйте вміст у випадку, якщо вищезгадані посилання зникнуть?
— Faheem Mitha

Отже, який синтаксис відключити IPv6 для певного імені або принаймні для конкретної адреси (діапазону)? Якщо ви додасте це до своєї посади, тут буде найкраща відповідь.
— Жиль

Дякую. Я додав 2 рядки #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 до свого /etc/gai.conf та оновлення apt-get працює ідеально.
— нехай яскравий

10

Ви можете встановити apt-cacher-ng на запасній машині, щоб діяти як проксі / кеш для всіх ваших хостів. Ви можете змусити конфігурацію використовувати лише конкретні хости або використовувати трюк / etc / hosts, запропонований @badp на цій машині.

apt-get install apt-cacher-ng

Після встановлення apt-cache-ng вам просто потрібно перенести наступний рядок (із IP-адресою / ім’ям хоста, зміненим на точку на вашій кеш-машині) в /etc/apt/apt.conf.d/90httpproxy

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

Я використовую цю програму для зменшення використання пропускної здатності, але це повинно подолати вашу проблему. На жаль, я не знаю, як безпосередньо відключити пошук ipv6 для apt-get сам.


Все ще не ідеальне рішення, але таке хороше, як це, швидше за все, вийде. Дякую.
— Шадур

5

Ви могли б обійти це, встановивши проксі-сервер DNS, який видалив відповіді ip6.


Чи не все ще ваш локальний вирішитель намагатиметься отримати запис AAAA? А тайм-аут?
— Мікель

4

Як щодо додавання рядка при /etc/hostsпереопределенні відповідних адрес? наприклад,

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

13
Я збережу це рішення останньою, якщо виявиться зовсім іншого способу; Мені дуже не подобається захаращуватися /etc/hostsIP-адресами, якими я не володію.
— Шадур

@Shadur Так, я цілком бачу вашу думку :)
— badp

Примітка: їх потрібно перевернути, тож це IP, а потім ім'я хоста
— Mike T

1

Викрадення старої теми, але останнім часом зіткнулася з тією ж проблемою. Отже, виходячи з наведених вище порад та результатів хоста та 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

Вирішено проблему дещо по-іншому - знизив пріоритет мереж IPv6, які містять security.debian.org в /etc/gai.conf :

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

Отже, IPv6 як і раніше вважається кращим, за винятком security.debian.org .


1

Станом на 08 жовтня 2014 року у мене виникла та сама проблема, намагаючись оновити debian за проксі-сервером у локальній мережі. Сподіваючись, що це буде стосуватися інших, я розміщую тут свою відповідь. Як зазначали інші, редагування /etc/hosts- це те, з чим слід бути обережним.

Але особисто я просто хотів зробити оновлення.

Вміст /etc/apt/sources.list під час оновлення (до оновлення він був іншим):

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

Вміст /etc/apt/apt.conf:

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

Додавання до / 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

Тепер, apt-get update ; apt-get upgradeяк root працював добре.

Як було зазначено в інших відповідях, використовуйте, запускайте команду хоста в домені, щоб отримати правильний ip, який потрібно вставити у файл хостів.

Приклад:

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

Це успішно оновило систему до Debian GNU/Linux testing (jessie). Можливо, ви не хочете запускати тестові сховища, а потім просто видаліть його з джерел. Тестові сховища дають вам новіші оновлення кількох пакетів, але не вважаються стабільними.


Знову ж таки, модифікація hostsфайлу є надзвичайно оптимальним рішенням.
— Шадур

0

Я знайшов набагато кращий спосіб зробити це. Відкрийте свій sources.listфайл і запишіть імена хостів репостів. Отримати їх IPv4 адреси, а потім редагувати sources.listз IPv4 адресами, а не іменами хостів. Тепер Apt-get повинен зв’язатися із сховищами через вказані вами адреси IPv4, минаючи IPv6.

Недоліком є ​​те, що репозитори зазвичай налаштовують балансування навантаження та / або геолокацію IP, яку цей метод, звичайно, обходить. Однак це не має значення, чи це роблять лише кілька людей. Якщо ви знайдете одне дзеркало повільно, спробуйте отримати іншу IP-адресу репо (наприклад, за допомогою онлайн-сервісу ping) і скористайтеся цим.


2
Це насправді погане рішення, насправді, з причин, які ви вже описали.
— Шадур

-4

Ви можете спробувати це, якщо працює для вас

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

-> замініть ім'я інтерфейсу


Це рішення іншого питання, ніж я задав.
— Шадур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.