Đặt phạm vi mạng trong biến môi trường no_proxy


52

Tôi đang ở trong một mạng sử dụng proxy. Tôi đã có các máy sử dụng nhiều tập lệnh ở đây và truy cập lẫn nhau qua HTTP.

  • Mạng là 10.0.0.0/8.
  • Proxy của tôi là 10.1.1.1:81, vì vậy tôi thiết lập nó cho phù hợp:

    export http_proxy=http://10.1.1.1:81/
  • Tôi muốn loại trừ phạm vi của riêng tôi để được truy cập bằng proxy. Tôi đã thử bất kỳ sự kết hợp có sẵn.

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

Không có công việc trên!

Tôi đang thử nghiệm wgetvà nó luôn cố gắng truy vấn proxy, bất kỳ địa chỉ IP nào tôi muốn kết nối.

  • Vì rất nhiều tập lệnh nằm ở mọi nơi trong tất cả các hệ thống, --no-proxytùy chọn thực sự không phải là một tùy chọn. Tôi muốn thiết lập hệ thống rộng.

1
Đã gần đến năm 2019 và không có cách nào để đưa CIDR vào no_proxybiến môi trường? Cái quái gì Linus Torvalds !!
7_R3X

4
@ 7_R3X đó là GNU wget vì vậy tôi mong bạn muốn nguyền rủa Richard Stallman?
Jakub Bochenski

Câu trả lời:


43

Bạn đang nhìn nó sai cách. Biến no_proxymôi trường liệt kê các hậu tố tên miền, không phải các tiền tố. Từ tài liệu :

no_proxy: Biến này nên chứa một danh sách bằng dấu phẩy của miền mở rộng ủy quyền nên không được sử dụng cho.

Vì vậy, đối với IP, bạn có hai tùy chọn:

1) Thêm từng IP đầy đủ:

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

2) Đổi tên wgetthành wget-originalvà viết tập lệnh trình bao bọc (được gọi wget) để tìm IP cho máy chủ lưu trữ của URL đã cho và xác định xem có nên sử dụng proxy hay không:

#!/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;

Cảm ơn rất nhiều, tôi sẽ bọc wget của mình (và sử dụng tên máy chủ thay vì địa chỉ IP).
SamK

9
Sẽ có địa chỉ 255 * 255 trong các vấn đề về hiệu suất rủi ro no_proxy?
jtpereyda

@dafrazzman: cũng có thể như vậy. Rốt cuộc, nó lớn gần 800 kilobyte, điều này hơi cực đối với một biến môi trường. Nó cũng phụ thuộc vào mức độ lớn của môi trường của bạn. Đối với trường hợp cực đoan này, tôi muốn giới thiệu cách tiếp cận trình bao bọc.
janmoesen

4
Không thêm đầy đủ từng IP - nó sẽ quá dài và bạn sẽ không thể thực hiện bất kỳ lệnh nào trong bash.
Ross

5
KHÔNG BAO GIỜ LÀM RATNG, điều này sẽ tạo ra một cái gì đó quá dài cho bất kỳ lệnh nào và, nếu bạn đặt nó trong /etc/environmenttệp, điều này có thể phá vỡ máy chủ của bạn.
Thomas Decaux

15

info wget nói:

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

Vì vậy, biến nên chứa một danh sách các tên miền , không phải phạm vi IP . Bạn sẽ cần thiết lập các bí danh cục bộ thích hợp cho các máy cục bộ của mình trong /etc/hosts(các) tệp.

Ngoài ra, hãy nhớ rằng việc đặt biến môi trường không đảm bảo rằng proxy sẽ hoặc không được sử dụng. Nó chỉ là một thông tin có thể được sử dụng bởi các chương trình hỗ trợ nó.


Nếu wget thực hiện điều này giống như curl - và tôi nghi ngờ điều đó - thì không có gì khác biệt nếu đó là địa chỉ IP hoặc tên miền vì cả hai đều được coi là chuỗi - xem github.com/curl/curl/issues/1208
Piotr Dobrogost

12

Không chính xác là một giải pháp chính xác nhưng nó có thể giải quyết vấn đề cho bạn. Nếu bạn cho rằng việc truy cập bất cứ thứ gì từ bên ngoài proxy sẽ sử dụng tên DNS và không trực tiếp sử dụng địa chỉ IP, bạn có thể đặt nó như sau:

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

Theo tôi biết, không có tên miền hàng đầu nào kết thúc bằng một con số nên nếu có, nó phải là một địa chỉ IP.


7
Đó là một giải pháp rất thông minh :) Thật không may, điều này sẽ bỏ qua proxy cho bất kỳ IP nào, không chỉ cho các IP cục bộ ... :( Không có cách nào (vào năm 2018) để chỉ định phạm vi IP hoặc CIDR trong biến "noproxy"?
Sorin Postelnicu

Đối với máy chủ trung tâm dữ liệu thì đây là một mẹo rất thông minh. Có tác dụng phụ, nhưng chấp nhận được.
ghi chú-jj

điều này không hiệu quả với bản thân tôi .. đã phải sử dụng giải pháp @iconoclast
Erik

12

Đây là một cách tiếp cận đơn giản hơn (một dòng) dựa trên giải pháp của janmoesen.

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

đã được cải thiện hơn nữa dựa trên đầu vào của Cory Ringdahl:

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

sed bóp nghẹt tất cả các đối số được truyền từ việc mở rộng 10.1.{1..255}.{1..255}, trong mã của anh ta hoặc của tôi. Vì vậy, nếu bạn thực sự cần mở rộng lên 256 * 256 địa chỉ IP, bạn có thể điều chỉnh thêm phương pháp của Cory Ringdahl, nhưng nếu bạn chỉ cần 256 hoặc hơn, thì một trong hai địa chỉ này sẽ hoạt động hoàn hảo cho bạn.

Tôi đoán phiên bản mở rộng 2 octet sẽ trông giống như thế này:

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

nhưng iTerm đang đưa ra lỗi cho tôi về danh sách đối số quá dài, vì vậy tôi không thể chắc chắn liệu có giải pháp nào để thực hiện công việc này không ...


1
Có thể sử dụng sed bằng cách thực hiện"export no_proxy=`echo 10.1.1.{1..254},`10.1.1.255"
Cory Ringdahl

Thật tuyệt ... Tôi điều chỉnh nó một chút để làm cho khoảng cách nhất quán sau dấu phẩy và tôi sẽ thêm nó.
iconoclast
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.