Proxy

使用基本身份驗證配置 SQUID 透明代理

  • August 16, 2019

我正在嘗試將 SQUID(Ubuntu 18.04 上的 3.5.27)配置為透明代理。更進一步,它應該處理身份驗證和請求日誌記錄,但我一開始很簡單,但已經卡住了。

我正在本地網路上工作。在 SQUID 伺服器 (jarvis) 的 5000 埠上執行著一個簡單的網路伺服器。從我網路上的另一台電腦上,我試圖訪問http://jarvis:5000(顯然在關閉 iptables 時有效)。

IPTABLES 配置適用於

iptables -t nat -A PREROUTING -i enp1s0 -p tcp -j REDIRECT --to-port 3128

我的 squid.conf 盡可能簡單

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/htpasswd
acl authenticated proxy_auth REQUIRED
http_access allow authenticated
http_port 3128 transparent
visible_hostname jarvis

/usr/lib/squid/basic_ncsa_auth /etc/squid/htpasswd 有效(使用者名和密碼之間沒有冒號:

# /usr/lib/squid/basic_ncsa_auth /etc/squid/htpasswd
me itsame
OK

在我正在做的另一台機器上

curl -v -u me:itsame http://jarvis:5000

接收

GET / HTTP/1.1
> Host: jarvis:5000
> Authorization: Basic bWU6aXRzYW1l
> User-Agent: curl/7.63.0
> Accept: */*
> 
< HTTP/1.1 407 Proxy Authentication Required
< Server: squid/3.5.27
< Mime-Version: 1.0
< Date: Thu, 15 Aug 2019 16:41:13 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 3538
< X-Squid-Error: ERR_CACHE_ACCESS_DENIED 0
< Vary: Accept-Language
< Content-Language: en
* Authentication problem. Ignoring this.
< Proxy-Authenticate: Basic realm="Squid proxy-caching web server"
< X-Cache: MISS from jarvis
< X-Cache-Lookup: NONE from jarvis:0
< Via: 1.1 jarvis (squid/3.5.27)
< Connection: keep-alive

我錯過了什麼?

看起來您正在嘗試使用身份驗證進行透明代理(或“攔截代理”,如 Squid FAQ 所稱)。

Squid FAQ 說得很清楚:

我可以使用 ‘‘proxy_auth’’ 進行攔截嗎?

你不能。請參閱上一個問題的答案。使用攔截代理,客戶端認為它正在與源伺服器通信,並且永遠不會發送 Proxy-authorization 請求標頭。

而“上一個問題”是:

為什麼我不能將身份驗證與攔截代理一起使用?

攔截代理通過在應該沒有的地方擁有一個活動代理(代理)來工作。瀏覽器並不期望它在那裡,它的所有效果和目的都被欺騙了,或者充其量是混淆了。作為該瀏覽器的使用者,我會要求它不要將任何憑據洩露給意外的一方,您不同意嗎?特別是當使用者代理可以在不通知使用者的情況下這樣做時

$$ … $$

此外,您的案例看起來更像是一個反向代理,也稱為Web 加速器,它還添加了身份驗證和日誌記錄等功能,因為您的類似 Web 伺服器的應用程序http://jarvis:5000可能在這些方面存在缺陷。

  • 當客戶端需要能夠訪問基本上任何 Web 伺服器而不需要在瀏覽器上進行任何類型的代理特定配置時,使用透明代理:網路(通常是路由器)攔截並將任何類似瀏覽器的連接重定向到代理,然後可以應用記憶體來例如最小化國際流量,或實施諸如惡意軟體檢查或成人內容過濾之類的東西。
  • 反向代理僅涉及一個特定的 Web 伺服器或一組伺服器。它可用於對一組後端伺服器進行負載平衡,或將身份驗證或 HTTPS 之類的內容添加到僅提供未經身份驗證的 HTTP 的設備。

如果您真正想要的實際上更像是一個反向代理,那麼使用真正的 Web 伺服器的代理功能可能會更好,因為這將為您提供更好的 HTTP 伺服器端身份驗證功能,這似乎是你的主要要求。

使用 Apache,您可能會執行以下操作:

<Location />
   AuthType Basic
   AuthName "Restricted Service"
   # (Following line optional)
   AuthBasicProvider file
   AuthUserFile "/etc/apache/htpasswd"
   Require user me
   ProxyPass http://jarvis:5000
   ProxyPassReverse http://jarvis:5000
</Location>

並使用以下命令初始化/etc/apache/htpasswd文件:

# htpasswd -c /usr/local/apache/passwd/passwords me
New password: itsame
Re-type new password: itsame
Adding password for user me

如果伺服器在http://jarvis:5000它輸出的 HTML 中嵌入連結或其他對自身的引用,並且無法通過配置該伺服器來調整這些引用,則您可能不得不玩一些技巧,例如讓該伺服器僅在 localhost 介面上偵聽,而 Apache 在埠 5000僅實際網路介面。

了解更多關於http://jarvis:5000伺服器功能的資訊在這裡很重要。如果它使用客戶端說它用來訪問它的任何主機名和埠來構造它的響應(“嗯,該資訊讓客戶端連接到我,所以它必須是正確的”的原則),那麼這將很容易。但是,如果它使用特定協議、主機名和埠將其 HTML 與指向自身的連結硬編碼,並且這些是不可配置的,那麼實現您想要的可能需要使用主機名進行欺騙,或者實時編輯響應 HTML 中的 URL。

引用自:https://unix.stackexchange.com/questions/535768