Переконати 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.