Встановити діапазон мережі в змінній середовища 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) Перейменувати , 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;

Дякую багато, я збираюся завернути свій wget (і використовувати імена хостів замість IP-адрес).
СамК

9
Чи буде мати 255 * 255 адрес у питаннях ефективності no_proxy?
jtpereyda

@dafrazzman: це цілком могло бути. Зрештою, це майже 800 кілобайт, що є дещо екстремальним для змінної середовища. Це також залежить від того, наскільки великим може бути ваше оточення. У цьому крайньому випадку я б рекомендував підхід до обгортки.
janmoesen

4
Не додайте кожну IP-адресу в повному обсязі - це буде занадто довго, і ви не зможете виконати жодної команди в bash.
Росс

5
НІКОЛИ НЕ РОБИТИ ЦЕ, це створить щось занадто довго для будь-якої команди, і, якщо ви помістите це у /etc/environmentфайл, це може зламати ваш сервер.
Томас Деко

15

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файлах.

Крім цього, майте на увазі, що встановлення змінної середовища не гарантує, що проксі-сервер не буде використовуватися чи не буде. Це лише інформація, яку можуть використовувати програми, які її підтримують.


Якщо wget реалізує це так само, як curl - і я підозрюю, що це робить - то немає різниці, якщо це IP-адреса або доменне ім’я, оскільки обидва трактуються як рядки - див. Github.com/curl/curl/isissue/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

Ось дещо простіший (однолінійний) підхід, заснований на рішенні janmoesen.

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"

sed подає всі аргументи, передані після розширення 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
Можна "export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
обійтись,

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