由於經常去的一些國外網站如Google、Blogspot、Wordpress被“出現了技術問題”,訪問不了,於是我在自己的DigitalOcean 雲主機上搭建了一個 Squid 代理服務器用於科學上網。Squid支持HTTP、HTTPS代理,因此能夠滿足日常訪問國外某些網站的需求。然而如果直接使用HTTP連接Squid是明文傳輸的,在第一次使用時,會馬上“出現技術問題”,因此需要使用 stunnel 加密代理通道。具體配置步驟如下,雲主機的Linux發行版是Ubuntu 14.10 x32,如果你使用的是其他發行版,包管理與配置文件路徑會略有不同。
安裝必要的軟件
安裝apache2-utils用於HTTP認證文件的生成,
apt-get install apache2-utils -y
安裝Squid,
apt-get install squid3 -y
安裝stunnel,
apt-get install stunnel4 -y
配置Squid
生成HTTP認證文件,輸入對應的密碼。這個認證文件用於之后HTTP代理的認證登錄,如果不需要登錄認證,可以略過。
htpasswd -c /etc/squid3/squid.passwd <登錄用戶名>
修改Squid默認配置,配置文件位於 /etc/squid3/squid.conf
。
1. 修改監聽地址與端口號
找到 TAG: http_port
注釋,把其下方的
# Squid normally listens to port 3128 http_port 3128
中 http_port
修改為 127.0.0.1:3128
,使得Squid只能被本地(127.0.0.1)訪問。此處可以修改為監聽其他端口號。
2. 修改訪問權限與HTTP認證(可選)
若不需要添加HTTP認證,只需將 http_access deny all
修改為 http_access allow all
即可,無需下列的操作。
使用如下命令生成認證文件,
htpasswd -c /etc/squid3/squid.passwd <登錄用戶名>
再次打開Squid配置文件 /etc/squid3/squid.conf
,找到 TAG: auth_param
注釋,在其下方添加,
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/squid.passwd auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours auth_param basic casesensitive off
找到 TAG: acl
,在其下方添加,
acl ncsa_users proxy_auth REQUIRED
找到 TAG: http_access
,在其下方添加,使得只允許經過認證的用戶訪問,
http_access deny !ncsa_users http_access allow ncsa_users
3. 重啟Squid
service squid3 restart
配置stunnel
接下來,我們需要在Squid上添加一層加密。
生成公鑰和私鑰
生成私鑰( privatekey.pem
):
openssl genrsa -out privatekey.pem 2048
生成公鑰( publickey.pem
):
openssl req -new -x509 -key privatekey.pem -out publickey.pem -days 1095
(需要注意的是, Common Name
需要與服務器的IP或者主機名一致)
合並:
cat privatekey.pem publickey.pem >> /etc/stunnel/stunnel.pem
修改stunnel配置
新建一個配置文件 /etc/stunnel/stunnel.conf
,輸入如下內容
client = no [squid] accept = 4128 connect = 127.0.0.1:3128 cert = /etc/stunnel/stunnel.pem
配置中指定了stunnel所暴露的HTTPS代理端口為4128,可以修改為其他的值。
修改 /etc/default/stunnel4
配置文件中 ENABLED
值為1。
ENABLED=1
重啟stunnel
service stunnel4 restart
至此,服務器端已配置完成了。
本地瀏覽器配置
添加證書到受信任的根證書頒發機構列表中
以Windows下Chrome瀏覽器為例,將服務器上的公鑰 publickey.pem
下載至本地,重命名至 publickey.crt
,在Chrome中依次點擊 “設置” - “顯示高級設置” - “HTTP/SSL” - “管理證書”,在“受信任的根證書頒發機構”選項卡中“導入”這個crt證書就完成了。
代理客戶端配置
將本地的代理客戶端指向 https://<你的服務器IP或主機名>:4128
,這里的IP或主機名和生成公鑰時的 Common Name
一致,端口為stunnel的端口。如果有配置HTTP認證的話,需要在客戶端中配置對應的用戶名和密碼。如果沒有HTTP客戶端的話,推薦使用Chrome的插件 Proxy SwitchyOmega (使用教程可以參考 Github上的Wiki )。