Убедите apt-get * not * использовать метод IPv6

239

Интернет-провайдер, над которым я работаю, настраивает внутреннюю сеть IPv6 для подготовки к последующему подключению к Интернету IPv6. В результате несколько серверов в этой сети теперь пытаются подключиться к security.debian.org через свой IPv6-адрес по умолчанию при запуске apt-get update, и это приводит к необходимости ожидания продолжительного времени ожидания при загрузке обновлений любого рода. ,

Есть ли способ заставить apt либо предпочесть IPv4, либо вообще игнорировать IPv6?

Shadur
источник
3
Разве это не должно немедленно вернуться с ошибкой маршрутизации?
pjc50
7
Нет, вполне возможно, что их внутренняя сеть имеет маршрутизацию между несколькими подсетями (а хосты имеют шлюз по умолчанию IPv6), но не имеет возможности подключения IPv6 к внешнему миру.
Эндрю Медико
5
Вероятно, есть способ настроить /etc/gai.confтак, чтобы security.debian.orgзапись A возвращалась до записи 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 года).

mmoya
источник
7
Перемещение «принято» к этому; Хотя исходный 30-точечный ответ является совершенно правильным, он применим в гораздо более широком масштабе, в то время как это дает возможность просто ограничить apt-get.
Шадур
Пожалуйста, будьте правильно описательны в своем ответе. -o Acquire :: ForceIPv4 = true - это дополнение к команде, позволяющее пользователю использовать ipv4
Кендрик
Ответ обновлен в соответствии с предложением Кендрика
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(иначе он глохнет навсегда).


Смотрите также:

Lmwangi
источник
Возможно, подвести итог содержания в случае исчезновения вышеуказанных ссылок?
Фахим Митха
Итак, каков синтаксис для отключения 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.

Richm
источник
Все еще не идеальное решение, но настолько хорошее, насколько это возможно. Благодарю.
Шадур
5

Вы можете обойти это, настроив прокси-сервер DNS, который отбрасывал ответы ip6.

pjc50
источник
Ваш местный распознаватель все еще не попытается получить запись AAAA? И время вышло?
Микель
4

Как насчет добавления строки в /etc/hostsпереопределение соответствующих адресов? например,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 
badp
источник
13
Я оставлю это решение напоследок, если не окажется другого пути; Мне действительно не нравится загромождать /etc/hostsIP-адреса, которые я сам не имею.
Шадур
@Shadur Да, я могу полностью понять вашу точку зрения :)
badp
Примечание: они должны быть перевернуты, так что это IP, а затем имя хоста
Майк Т
1

Угоняю старую тему, но столкнулся с той же проблемой в последнее время. Итак, исходя из приведенных выше советов и выводов host и 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 работал хорошо.

Как упоминалось в других ответах, используйте команду host в домене, чтобы получить правильный ip для вставки в файл hosts.

Пример:

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

Это успешно обновило систему до Debian GNU/Linux testing (jessie). Возможно, вы не захотите запускать тестовые репозитории, а затем просто удалите его из исходных кодов. Репозитории тестирования дают вам более свежие обновления нескольких пакетов, но не считаются стабильными.

NordicViking
источник
Опять же, изменение hostsфайла является крайне неоптимальным решением.
Шадур
0

Я нашел гораздо лучший способ сделать это. Откройте свой sources.listфайл и запишите имена хостов репозиториев. Получите их IPv4- адреса, затем отредактируйте их sources.listс помощью IPv4-адресов, а не имен хостов. Теперь apt-get должен связываться с репозиториями по указанным вами адресам IPv4, минуя IPv6.

Недостатком является то, что репозитории обычно имеют своего рода балансировку нагрузки и / или настройку IP-геолокации, которую этот метод, конечно, обходит. Тем не менее, это не должно иметь значения, если только несколько человек делают это. Если вы обнаружите, что одно зеркало работает медленно, попробуйте получить другой IP-адрес репо (например, с помощью службы онлайн-пинга) и используйте его.

Д. Струец
источник
2
На самом деле это действительно плохое решение по причинам, которые вы уже описали.
Шадур
-4

Вы можете попробовать это, если работает для вас

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

-> заменить название вашего интерфейса

Четан
источник
Это решение для другого вопроса, чем я задавал.
Шадур