Contents

程式使用 Web Proxy 那些事和指令測試方法

有些公司網路會限制連線只能走 Web Proxy 方式傳輸,程式或主機都要設置外,要怎麼知道電腦通過 Proxy 網路有沒有通,這邊有找到一些方法,在工作上可以試試看。

什麼是 Proxy?

正向代理(Forward Proxy)

代理(英語:Proxy)也稱網路代理,是一種特殊的網路服務,允許一個終端(一般為客戶端)通過這個服務與另一個終端(一般為伺服器)進行非直接的連接。一些閘道器、路由器等網路裝置具備網路代理功能。一般認為代理服務有利於保障網路終端的隱私或安全,在一定程度上能夠阻止網路攻擊。

以上來自 Wiki,通常我們說的 Proxy 是指正向代理。

代理伺服器 - 維基百科,自由的百科全書

反向代理(Reverse Proxy)

反向代理(Reverse proxy)在電腦網路中是代理伺服器的一種。伺服器根據客戶端的請求,從其關聯的一組或多組後端伺服器(如Web伺服器)上取得資源,然後再將這些資源返回給客戶端,客戶端只會得知反向代理的IP位址,而不知道在代理伺服器後面的伺服器叢集的存在[1]。

與前向代理不同,前向代理作為客戶端的代理,將從網際網路上取得的資源返回給一個或多個的客戶端,伺服器端(如Web伺服器)只知道代理的IP位址而不知道客戶端的IP位址;而反向代理是作為伺服器端(如Web伺服器)的代理使用,而不是客戶端。客戶端藉由前向代理可以間接存取很多不同網際網路伺服器(叢集)的資源,而反向代理是供很多客戶端都通過它間接存取不同後端伺服器上的資源,而不需要知道這些後端伺服器的存在,而以為所有資源都來自於這個反向代理伺服器。

反向代理在現時的網際網路中並不少見,而另一些例子,像是CDN、SNI代理等,是反向代理結合DNS的一類延伸應用。

下面這篇還滿有趣
用人類語言跟你說甚麼是正向代理(Forward Proxy)和反向代理(Reve - PressPlay Academy 線上課程學習平台

其他文章可以參考:

簡單來說

正向代理通常設定是在 Client 設定,把他指引到別的私福器傳出去。現在 Client 很少掛 Proxy,以前在 Hinet 逛大陸網站就會比較快,但後來 Hinet 關掉 Proxy 就沒什麼機會使用。不過,最近公司某環境需要掛 Proxy 才能連到外面網站,可用這個機制管理連外部網站。

反向代理設定通常在 Server,透過緩向代理做 SLB(Server Load Balance),可以以解析憑證內部用 http,可舒緩 Server 做第六層東西,也後端部屬程式的人都有機會接觸到。

原理與說明

Proxy server 的運作流程
當 Proxy server 第一次發現要去的 URL 網址時,他的資料存取流程如下:

  1. Client 端向 Server 端發送一個資料需求封包;
  2. Server 端接收之後,先比對這個封包的『來源』與預計要前往的『目標』網站是否為可接受? 如果來源與目標都是合法的,或者說,來源與目標網站我們的 Proxy 都能幫忙取得資料時,那麼 Server 端會開始替 Client 取得資料。這個步驟中比較重要的就是『比對政策』啦,有點像是認證的感覺啦;
  3. Server 發現快取並沒有 Client 所需要的資料,準備前往網際網路抓取資料;
  4. Server 開始向 Internet 發送要求與取得相關資料;
  5. 最後當然就是將資料回傳給 Client 端囉!
    當 Proxy server 本身的快取就有用戶要求的 URL 資料時:

a. Client 端向 Server 端發送一個資料需求封包;
b. Server 端接收之後,開始進行政策比對 (如同前一組步驟 2 的說明);
c. Server 首先會檢查自己快取 (新的資料可能在記憶體中,較舊的資料則放置在硬碟上) 資料, 如果有 Client 所需的資料,那就將資料準備取出,而不經過向 Internet 要求資料的程序;
d. 最後當然就是將資料回傳給 Client 端囉!

來源: 鳥哥第 11 堂課 - 進階網頁伺服器設定 + proxy

想當初以前有用 squid,不過我發現我文章沒有記錄,可能那時候一時興起架設,然後忘記紀錄。可能覺得我用不太到,最近爬文發現 Apache也能做到,
Apache Proxy 設定 – 盧尛朋友。連結留著紀錄。

快速架設 Forward Proxy Server

1
2
docker run --rm -d -p 3128:3128 hinata/nginx-forward-proxy:latest
curl -x http://127.0.0.1:3128 https://www.google.co.jp

command 呼叫

linux 環境變數套用 Proxy

但這邊可以不用這樣設定,可以用下面curl方法。

1
2
3
4
5
6
# Set up proxy without username and password
export http_proxy=http://SERVER:PORT/
# Set up proxy with username and password
export http_proxy=http://USERNAME:PASSWORD@SERVER:PORT/
# Set up proxy with domain, username and password
export http_proxy=http://DOMAIN\\USERNAME:PASSWORD@SERVER:PORT/

參考: How to set up proxy using http_proxy & https_proxy environment variable in Linux?

curl(linux) 測試 Proxy 連線網站

這個方法可以在 Window 用 Git Bash 也是能用的喔。

1
curl  https://api.line.me/oauth2/v2.1/token -x http://172.25.165.200:8080

powershell 設定 Proxy 連線網站

這個我就沒使用,因為這個好像會設定套用,感覺不是我要的那一種單純指令測試。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 看 proxy 設定
netsh winhttp show proxy
# 設定 proxy
netsh winhttp set proxy "192.168.0.14:3128"
#忽略 proxy  URL 清單
netsh winhttp set proxy "192.168.1.100:3128" bypass-list= "10.*,172.*,192.168.*,*.corp.woshub.com"
# 判斷是否有忽略 Proxy 清單
([System.Net.WebRequest]::GetSystemWebproxy()).IsBypassed("http://woshub.com")
# 從這個網站取得 IP
(Invoke-WebRequest -uri "http://ifconfig.me/ip").Content

Using PowerShell Behind a Proxy Server | Windows OS Hub

PowerShell cURL (Invoke-WebRequest): Syntax, Parameters, Examples
Free Proxy List - Just Checked Proxy List

1
 curl http://tw.yahoo.com -Proxy http://125.21.3.41:8080

不知道為什麼我的 powershell 執行 curl 會有錯誤。最後發現用 Git Bash裡面的 curl 成功…,最後我的程式發現可以過。

這邊 window 的 powershell 的 curl 不是 linux curl 喔,他是 Invoke-WebRequest

Postman

Postman 測試 API 以為預設是用系統設定的Proxy,但後來發現要額外設定才會套用。

https://i.imgur.com/8fcgacX.png

程式操作

Java

Configure HTTP/HTTPS Proxy Settings Java
java - How do I set the proxy to be used by the JVM - Stack Overflow

方法1. 設定java.net.useSystemProxies=true,吃本機代理設定,預設為 false。不太理解為什麼預設要為 false。

1
2
-Djava.net.useSystemProxies=true
System.setProperty("java.net.useSystemProxies", "true");

方法2. 設定http.proxyHost

1
2
3
4
5
6
7
// HTTP
-Dhttp.proxyHost=http://proxy.memorynotfound.com
-Dhttp.proxyPort=80

// HTTPS
-Dhttps.proxyHost=https://proxy.memorynotfound.com
-Dhttps.proxyPort=443

Net Core

不用像 Java 要額外設定。

HttpClient.DefaultProxy 屬性 (System.Net.Http) | Microsoft Docs

.NetCore HttpClient Proxy 设置全局代理

手動設定順便紀錄

1
2
3
4
5
6
7
            string baseUrl = "https://api.line.me";
            var client = new RestClient(baseUrl);

            if (_config.GetValue<bool>("UseProxy"))
            {
                client.Proxy = new WebProxy(_config.GetValue<string>("ProxyUrl"));
            }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
            if (_config.GetValue<bool>("UseProxy"))
            {
                string proxyurl = _config.GetValue<string>("ProxyUrl");

                var webProxy = new WebProxy(proxyurl);
                var proxyHttpClientHandler = new HttpClientHandler
                {
                    Proxy = webProxy,
                    UseProxy = true,
                };
                client = new HttpClient(proxyHttpClientHandler);
            }
            else
            {
                client = new HttpClient();
            }