Как мне игнорировать прокси, если он недоступен?

15

Следуя инструкциям в разделе Лучший способ кэширования подходящих загрузок в локальной сети? Я настроил кеширующий прокси в моей локальной сети. Поскольку эта машина не всегда работает, я бы хотел иметь возможность обновлять список источников и устанавливать пакеты без использования этого прокси-сервера, если он недоступен.

Я уже прочитал раздел « Получение группы » на странице руководства apt.conf(5), но не смог найти опцию, например «Silent-Fail».

На данный момент sudo apt-get updateи связанные команды не работают, потому что не удалось установить соединение. Так как мне настроить клиент так, чтобы прокси игнорировался, если он недоступен?

Lekensteyn
источник
Вы используете обнаружение zeroconf или вручную устанавливаете прокси на каждом клиенте?
Хорхе Кастро
Я вручную настраиваю прокси из-за возможных брандмауэров / отключенной трансляции.
Лекенштейн

Ответы:

20

Существует недокументированная настройка Acquire::http::ProxyAutoDetect. Этот параметр должен содержать полный путь к двоичному файлу и не может иметь аргументов. Команда должна вывести прокси, который будет использоваться (пример:) http://10.0.0.1:8000.

Учитывая приведенную выше информацию, можно создать сценарий, который пробует прокси-сервер перед его настройкой. Если прокси-сервер недоступен, следует использовать прямое соединение.

Ниже такой сценарий обнаружения прокси , который пробует http://10.0.0.1:8000/и http://10.0.0.2:8000прокси.

Введите код в /etc/apt/detect-http-proxy:

#!/bin/bash
# detect-http-proxy - Returns a HTTP proxy which is available for use

# Author: Lekensteyn <lekensteyn@gmail.com>

# Supported since APT 0.7.25.3ubuntu1 (Lucid) and 0.7.26~exp1 (Debian Squeeze)
# Unsupported: Ubuntu Karmic and before, Debian Lenny and before

# Put this file in /etc/apt/detect-http-proxy and create and add the below
# configuration in /etc/apt/apt.conf.d/30detectproxy
#    Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";

# APT calls this script for each host that should be connected to. Therefore
# you may see the proxy messages multiple times (LP 814130). If you find this
# annoying and wish to disable these messages, set show_proxy_messages to 0
show_proxy_messages=1

# on or more proxies can be specified. Note that each will introduce a routing
# delay and therefore its recommended to put the proxy which is most likely to
# be available on the top. If no proxy is available, a direct connection will
# be used
try_proxies=(
10.0.0.1:8000
10.0.0.2:8000
)

print_msg() {
    # \x0d clears the line so [Working] is hidden
    [ "$show_proxy_messages" = 1 ] && printf '\x0d%s\n' "$1" >&2
}

for proxy in "${try_proxies[@]}"; do
    # if the host machine / proxy is reachable...
    if nc -z ${proxy/:/ }; then
        proxy=http://$proxy
        print_msg "Proxy that will be used: $proxy"
        echo "$proxy"
        exit
    fi
done
print_msg "No proxy will be used"

# Workaround for Launchpad bug 654393 so it works with Debian Squeeze (<0.8.11)
echo DIRECT

Теперь APT должен быть настроен на использование вышеуказанного сценария обнаружения прокси, поэтому поместите в него следующий код /etc/apt/apt.conf.d/30detectproxy:

# Fail immediately if a file could not be retrieved. Comment if you have a bad
# Internet connection
Acquire::Retries 0;

# undocumented feature which was found in the source. It should be an absolute
# path to the program, no arguments are allowed. stdout contains the proxy
# server, stderr is shown (in stderr) but ignored by APT
Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";

Я также поместил следующий код в файл, чтобы предотвратить прокси-сервер.

# Override the default proxy, DIRECT causes a direct connection to be used
Acquire::http::Proxy {
    deb.opera.com DIRECT;
    dl.google.com DIRECT;
};

По умолчанию скрипт выводит, используется ли прокси или нет. Чтобы отключить это, отредактируйте /etc/apt/detect-http-proxyи измените show_proxy_messages=1на show_proxy_messages=0.

Lekensteyn
источник
Лекенштейн, могу ли я получить твое разрешение вставить это в puppet-apt-cacher-ng в качестве опции apt-cacher-ng::client?
Гарт Кидд
1
Разрешение предоставлено, делай что хочешь с ним :)
Лекенштейн
2
Я очень рад, что нашел этот ответ, когда некоторое время назад установил apt-cacher-ng. У меня установлен apt-cacher-ng на одном из моих домашних компьютеров (192.168.0.2). Сценарий чувствовал себя немного избыточна для моего случая, так что я написал упрощена детектировать-HTTP-прокси: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Будем надеяться, что недокументированная функция будет удалена :)
geirha
2
Я подробно i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT
описал
3

Теперь есть официально поддерживаемый способ сделать это - используя опцию - Acquire::http::Proxy-Auto-Detect(см. apt.confСправочную страницу). Поведение похоже на старое недокументированное Acquire::http::ProxyAutoDetect(обратите внимание на наличие / отсутствие дефисов в новых / старых параметрах конфигурации), оно в значительной степени обратно совместимо, но было расширено ...

Я нахожусь в процессе отправки патча сопровождающим apt для улучшения документации, но так как это вряд ли превратит его в версию apt, которая поставляется с выпуском дистрибутива в течение долгого времени, я включу текст Предлагаемый патч здесь:

Acquire::http::Proxy-Auto-Detectможет использоваться для указания внешней команды для обнаружения используемого http-прокси. APT может вызывать команду несколько раз и будет передавать URI команде в качестве ее первого и единственного параметра. APT ожидает, что команда выведет прокси-сервер, который должен использоваться для связи с рассматриваемым URI на его stdout, в виде одной строки в стиле http://proxy:port/или слова, DIRECTесли прокси-сервер не должен использоваться. Отсутствие вывода указывает на то, что следует использовать общие настройки прокси.

Обратите внимание, что автоопределение не будет использоваться для хоста, если конфигурация прокси для конкретного хоста уже установлена ​​через Acquire::http::Proxy::HOST.

Чтобы диагностировать взаимодействие с внешней командой, установите Debug::Acquire::http=yesи / или, Debug::Acquire::https=yesнапример, используйте параметр -oкомандной строки.

Обратите внимание, что используется предварительная версия apt, версии от 1.3 ~ exp2 до 1.3, затем возникает ошибка (вероятно, исправленная в 1.3.1), которая заставляет apt анализировать stderr внешней команды вместе с stdout.

Тим Смолл
источник
1

/etc/apt/apt.conf.d/02proxy:

Acquire::http::Proxy-Auto-Detect "/usr/local/bin/apt-proxy-detect.sh";

/usr/local/bin/apt-proxy-detect.sh:

#!/bin/bash
IP=192.168.88.1
PORT=3142
if nc -w1 -z $IP $PORT; then
    echo -n "http://${IP}:${PORT}"
else
    echo -n "DIRECT"
fi

Командная строка

  • Это должно ncработать ( sudo apt-get install netcat), если отсутствует.
  • Убедись, что ты chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Используйте полный путь при указании скрипта.

Как это устроено

Если он может подключиться к прокси, он печатает прокси, который APT использует. Если это не удается, он выводит сообщения DIRECT и APT нормально.

соус

Люк Млсна
источник