Установите диапазон сети в переменной среды no_proxy

52

Я в сети использую прокси. У меня есть машины, использующие множество сценариев, которые там и там обращаются друг к другу по HTTP.

  • Сеть 10.0.0.0/8.
  • Мой прокси 10.1.1.1:81, поэтому я настроил его соответствующим образом:

    export http_proxy=http://10.1.1.1:81/
  • Я хочу исключить свой собственный диапазон для доступа через прокси. Я попробовал любую доступную комбинацию.

    export no_proxy='10.*'
    export no_proxy='10.*.*.*'
    export no_proxy='10.0.0.0/8'

Ни одна из вышеперечисленных работ!

Я проверяю, wgetи он всегда пытается запросить прокси, какой бы IP адрес я не хотел подключать.

  • Поскольку множество сценариев находятся повсюду во всех системах, эта --no-proxyопция на самом деле не вариант. Я хочу установить это в масштабе всей системы.
ДУМК
источник
1
Это почти 2019 год, и нет способа поместить CIDR в no_proxyпеременную окружения? Какого черта Линус Торвальдс !!
7_R3X
4
@ 7_R3X это GNU wget, так что я надеюсь, ты хотел проклясть Ричарда Столлмана?
Якуб Боченски

Ответы:

43

Вы смотрите на это неправильно. no_proxyПеременная среды перечислены доменные суффиксы, а не префиксы. Из документации :

no_proxy: Эта переменная должна содержать разделенный запятыми список расширений доменов, для которых не следует использовать прокси-сервер .

Итак, для IP-адресов у вас есть два варианта:

1) Добавьте каждый IP в полном объеме:

printf -v no_proxy '%s,' 10.1.{1..255}.{1..255};
export no_proxy="${no_proxy%,}";

2) Rename wgetдля wget-originalи написать сценарий оболочки ( так называемый wget) , который смотрит на IP для данного хоста URL, и определяет , должен ли он использовать прокси - сервер или нет:

#!/bin/bash
ip='';
for arg; do
   # parse arg; if it's a URL, determine the IP address
done;
if [[ "$ip" =~ ^10\.1\. ]]; then
   wget-original --no-proxy "$@";
else
   wget-original "$@";
fi;
janmoesen
источник
Спасибо большое, я собираюсь обернуть мой wget (и использовать имена хостов вместо IP-адресов).
SamK
9
Будет ли иметь проблемы с производительностью 255 * 255 адресов в no_proxy?
Jtpereyda
@dafrazzman: это вполне может быть. В конце концов, это почти 800 килобайт, что несколько экстремально для переменной среды. Это также зависит от того, насколько большой может быть ваша среда. В этом крайнем случае я бы порекомендовал подход обертки.
Янмезен
4
Не добавляйте каждый IP-адрес полностью - он будет слишком длинным, и вы не сможете выполнять какие-либо команды в bash.
Росс
5
НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО, это создаст что-то слишком длинное для любой команды, и, если вы поместите это в /etc/environmentфайл, это может сломать ваш сервер.
Томас Деко
16

info wget говорит:

 `no_proxy'
     This variable should contain a comma-separated list of domain
     extensions proxy should _not_ be used for.  For instance, if the
     value of `no_proxy' is `.mit.edu', proxy will not be used to
     retrieve documents from MIT.

Таким образом, переменная должна содержать список доменов , а не диапазоны IP-адресов . Вам нужно будет настроить надлежащие локальные псевдонимы для ваших локальных машин в /etc/hostsфайлах.

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

rozcietrzewiacz
источник
Если wget реализует это так же, как curl - и я подозреваю, что это так - тогда нет разницы, является ли это IP-адресом или доменным именем, поскольку оба обрабатываются как строки - см. Github.com/curl/curl/issues/1208
Петр Доброгост
12

Не совсем правильное решение, но оно может решить проблему для вас. Если вы предполагаете, что для доступа к чему-либо извне прокси-сервера будут использоваться DNS-имена, а не IP-адреса напрямую, вы можете установить его следующим образом:

export no_proxy=0,1,2,3,4,5,6,7,8,9

Насколько я знаю, ни один домен верхнего уровня не заканчивается числом, поэтому если это так, то это должен быть IP-адрес.

Ларс Бернцон
источник
7
Это очень умное решение :) К сожалению, это обойдет прокси для любого IP, а не только для локальных IP ... :( Разве нет (в 2018 году) способа указать диапазоны IP или CIDR в переменной "noproxy"?
Сорин Постельнику
Для сервера ЦОД это очень умный трюк. Обладает побочным эффектом, но приемлемо.
заметки - JJ
это не сработало для меня .. пришлось использовать решение @iconoclast
Эрик
12

Вот немного более простой (однострочный) подход, основанный на решении Янмезена.

export no_proxy=`echo 10.1.1.{1..255} | sed 's/ /,/g'`

который был дополнительно улучшен на основе данных Кори Рингдала:

export no_proxy="`echo 10.1.1.{1..254},` 10.1.1.255"

Сед задушит все аргументы, передаваемые расширением 10.1.{1..255}.{1..255}, либо в его коде, либо в моем. Так что если вам действительно нужно расширить до 256 * 256 IP-адресов, вы могли бы дополнительно адаптировать подход Кори Рингдала, но если вам просто нужно 256 или около того, любой из них должен работать идеально для вас.

Я предполагаю, что версия, в которой развернуты 2 октета, будет выглядеть примерно так:

export no_proxy="`echo 10.1.{1..255}.{1..254},` 10.1.255.255"

но iTerm выдает мне ошибки из-за того, что списки аргументов слишком длинные, поэтому я не могу точно сказать, есть ли решение, позволяющее это сделать ...

иконоборец
источник
1
Можно обойтись с помощью sed, делая"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Кори Рингдал
Хорошо ... Я немного подправил интервал после запятых и добавлю его.
иконоборчество