Tetapkan rentang jaringan dalam variabel lingkungan no_proxy

52

Saya berada di jaringan menggunakan proxy. Saya punya mesin yang menggunakan banyak skrip di sana-sini untuk saling mengakses melalui HTTP.

  • Jaringannya adalah 10.0.0.0/8.
  • Proxy saya adalah 10.1.1.1:81, jadi saya mengaturnya sesuai:

    export http_proxy=http://10.1.1.1:81/
  • Saya ingin mengecualikan rentang saya sendiri untuk diakses dengan proxy. Saya mencoba kombinasi apa pun yang tersedia.

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

Tak satu pun dari pekerjaan di atas!

Saya mengujinya wgetdan selalu mencoba untuk menanyakan proxy, alamat IP apa pun yang ingin saya sambungkan.

  • Karena banyak skrip ada di mana-mana di semua sistem, --no-proxyopsi ini sebenarnya bukan pilihan. Saya ingin mengaturnya secara luas.
SamK
sumber
1
Sudah hampir 2019 dan tidak ada cara untuk menempatkan CIDR dalam no_proxyvariabel lingkungan? Apa-apaan itu, Linus Torvalds !!
7_R3X
4
@ 7_R3X itu GNU wget jadi saya harap Anda ingin mengutuk Richard Stallman?
Jakub Bochenski

Jawaban:

43

Anda melihatnya dengan cara yang salah. The no_proxyvariabel lingkungan daftar domain akhiran, bukan awalan. Dari dokumentasi :

no_proxy: Variabel ini harus berisi daftar proxy ekstensi domain yang dipisahkan koma, tidak boleh digunakan.

Jadi untuk IP, Anda memiliki dua opsi:

1) Tambahkan setiap IP secara penuh:

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

2) Ubah nama wgetmenjadi wget-originaldan tulis skrip pembungkus (dipanggil wget) yang mencari IP untuk host URL yang diberikan, dan menentukan apakah harus menggunakan proxy atau tidak:

#!/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
sumber
Terima kasih banyak, saya akan membungkus wget saya (dan menggunakan nama host, bukan alamat IP).
SamK
9
Akankah memiliki 255 * 255 alamat dalam masalah kinerja risiko no_proxy?
jtpereyda
@ Dodrazzman: itu bisa saja. Bagaimanapun, itu hampir 800 kilobyte besar, yang agak ekstrim untuk variabel lingkungan. Itu juga tergantung pada seberapa besar lingkungan Anda. Untuk kasus ekstrim ini, saya akan merekomendasikan pendekatan wrapper.
janmoesen
4
Jangan menambahkan setiap IP secara penuh - ini akan terlalu panjang dan Anda tidak akan dapat menjalankan perintah apa pun di bash.
Ross
5
JANGAN PERNAH MELAKUKANNYA, ini akan menghasilkan sesuatu yang terlalu lama untuk perintah apa pun, dan, jika Anda menempatkan ini dalam /etc/environmentfile, ini dapat merusak server Anda.
Thomas Decaux
16

info wget mengatakan:

 `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.

Jadi variabel tersebut harus berisi daftar domain , bukan rentang IP . Anda harus menyiapkan alias lokal yang tepat untuk mesin lokal Anda dalam /etc/hostsfile.

Selain itu, perlu diingat bahwa pengaturan variabel lingkungan tidak menjamin bahwa proxy akan atau tidak akan digunakan. Itu hanya informasi yang dapat digunakan oleh program yang mendukungnya.

rozcietrzewiacz
sumber
Jika wget mengimplementasikan ini dengan cara yang sama seperti curl - dan saya curiga tidak - maka tidak ada perbedaan jika itu adalah alamat IP atau nama domain karena keduanya diperlakukan sebagai string - lihat github.com/curl/curl/issues/1208
Piotr Dobrogost
12

Bukan solusi yang tepat tetapi mungkin memecahkan masalah untuk Anda. Jika Anda menganggap bahwa mengakses sesuatu dari luar proxy akan menggunakan nama-DNS dan tidak langsung menggunakan alamat IP, Anda dapat mengaturnya seperti:

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

Sejauh yang saya tahu, tidak ada domain teratas yang diakhiri dengan angka jadi jika ya, itu harus alamat IP.

Lars Berntzon
sumber
7
Itu solusi yang sangat cerdas :) Sayangnya, ini akan mem-bypass proxy untuk IP apa pun, tidak hanya untuk IP lokal ... :( Apakah tidak ada cara (pada 2018) untuk menentukan rentang IP atau CIDR dalam variabel "noproxy"?
Sorin Postelnicu
Untuk server pusat data, ini adalah trik yang sangat cerdas. Memiliki efek samping, tetapi dapat diterima.
note-jj
ini tidak berhasil untuk diri saya sendiri .. harus menggunakan solusi @iconoclast
Erik
12

Berikut adalah pendekatan (satu baris) yang sedikit lebih sederhana berdasarkan pada solusi janmoesen.

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

yang telah ditingkatkan lebih lanjut berdasarkan masukan Cory Ringdahl:

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

sed tersedak semua argumen yang lulus dari ekspansi 10.1.{1..255}.{1..255}, baik dalam kode-nya atau punyaku. Jadi jika Anda benar-benar perlu memperluas ke 256 * 256 alamat IP, Anda mungkin dapat lebih lanjut mengadaptasi pendekatan Cory Ringdahl, tetapi jika Anda hanya membutuhkan 256 atau lebih, salah satu dari ini harus bekerja dengan baik untuk Anda.

Saya menduga versi di mana 2 oktet diperluas akan terlihat seperti ini:

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

tetapi iTerm memberi saya kesalahan tentang daftar argumen yang terlalu panjang, jadi saya tidak bisa mengatakan dengan pasti apakah ada solusi untuk membuat ini berfungsi ...

iconoclast
sumber
1
Dapat berkeliling menggunakan sed dengan melakukan"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl
Bagus ... Saya sedikit mengotak-atik untuk membuat spasi konsisten setelah koma, dan saya akan menambahkannya.
iconoclast