我們都知道可以使用 nginx 反代功能來實現跨境訪問外網,不過,這種方式有很多的制約,比如說很難實現登錄驗證,比如說需要針對轉發模組單獨做編譯,比如說需要你有一個有效的 ssl 簽章憑證等等。
這次,我們來介紹另外一款神器 SNI Proxy,是用 dnsmasq 配合 sniproxy 可以實現無證書任意網站反代。它使用SNI 技術將 TLS 連接通過 TCP 代理到目標網站,這樣就避免了對代理伺服器的證書需求,而且訪問到的網站證書也是原原本本的證書。
當然了,既然是基於 sni 技術,那 http 頁面是肯定不能代理的,如果目標網站不支持 https,就不行了。
編譯 SNI Proxy(可以跳過)
示例環境為 Ubuntu 14.04
從git上克隆 sni的原始檔案: HTTPS://github.com/dlundquist/sniproxy.git
準備環境
1 2 3 4 5 6 7 8 9 |
//安装需要的开发环境 sudo apt-get install autotools-dev cdbs debhelper dh-autoreconf dpkg-dev gettext libev-dev libpcre3-dev libudns-dev pkg-config fakeroot devscripts //编译安装包。 ./autogen.sh && dpkg-buildpackage //安装编译好的安装包 sudo dpkg -i ../sniproxy_<version>_<arch>.deb |
安裝配置 SNI Proxy
1 2 3 |
apt-get install python-software-properties add-apt-repository ppa:dlundquist/sniproxy apt-get update && apt-get install sniproxy |
編輯 /etc/sniproxy.conf來開啟反代:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
table https_hosts { # Google (.*.|)233.wiki$ * (.*.|)google.com$ * (.*.|)google.com.hk$ * (.*.|)google.co.jp$ * (.*.|)googlehosted.com$ * (.*.|)googleusercontent.com$ * (.*.|)ggpht.com$ * (.*.|)gstatic.com$ * (.*.|)googlemail.com$ * (.*.|)googlecode.com$ * (.*.|)blogspot.com$ * (.*.|)gmail.com$ * (.*.|)appspot.com$ * } table xmpp_imap_smtp { (.*.|)google.com$ * (.*.|)googlemail.com$ * (.*.|)gmail.com$ * } |
像上邊這樣開啟針對某個功能變數名稱的反代,但是這樣太麻煩了,每次新增加一個網站,都需要對這個清單增加——為此,我們為了方便稍微犧牲一點安全性——且我不需要對郵件進行反代(容易被濫用,國外對垃圾郵件伺服器是深惡痛絕的。),那麼我可以直接這樣寫:
1 2 3 4 5 6 7 8 9 |
user nobody listen 127.0.0.1:443 { proto tls table https_hosts } table https_hosts { .* *:443 } |
注意:對於 IPv4 來講,你需要明確地寫出要監聽的外網地址(將代碼中的 127.0.0.1 替換),否則就會只監聽 IPv6 了。
這樣就只打開了 HTTPs 反代,而且是只要被解析到這個伺服器的功能變數名稱都會被反代,這樣一來,我們就可以只通過 的dnsmasq 的解析來控制哪個功能變數名稱反代了。(有那麼一點安全隱患就是一旦被別人發現,你可能你伺服器的流量會意外流失咯~記得監控你的伺服器頻寬?)
運行 sniproxy
直接使用命令sniproxy 即可運行,預設設定檔就是「/etc/sniproxy.conf」它會自動載入,如果你使用了其他路徑或者設定檔名,那麼你需要使用「-C」選項來指定路徑:
1 |
sniproxy -c /etc/sniproxy.conf |
埠重定向
那麼,一般我們訪問網站不喜歡輸入埠號或者協定名稱,那麼預設訪問的是80埠怎麼辦? 作為輔助,我們安裝一個羽量級的 nginx,讓它把所有訪問80埠的流量轉移到443上邊去,使用301重定向即可。
注意,針對 Google 等特殊域名,可能即使你做了端口重定向也無法跳轉解析,是因為 GFW 能夠解包 HTTP 流量,所以你懂的。
我們編輯 nginx 的設定檔「/etc/nginx/sites-available/default“
改為如下內容:
1 2 3 4 5 6 7 8 9 10 11 |
server { listen 80; ## listen for ipv4; this line is default and implied #listen [::]:80 default ipv6only=on; ## listen for ipv6 # Make site accessible from http://localhost/ server_name _; location / { rewrite ^ https://$host$request_uri permanent; } } |
功能變數名稱解析
sniproxy 搭建成功,但是它是不能被直接存取的,你需要將功能變數名稱解析過去,這樣它才能根據功能變數名稱來代理你的 ssl 連結,那麼你可能就需要在自己的 hosts 上修改解析啦。不過,另外一個更簡便的辦法是使用 的dnsmasq,在我寫的一篇文章當中介紹了如何在國內搭建一個自己私有的 dns 伺服器來避免 dns 污染,那麼,你只需要在這個伺服器當中增加 dnsmasq 的解析配置即可。
比如說新增一個 /etc/dnsmasq.d/sni.conf ,往裡邊寫入需要解析到你 sniproxy 伺服器的功能變數名稱即可。為此,我在 github 上新建了一個專案,這裡加入了常用網站的解析,你只需要將它下載並且替換裡邊的 IP 為你 sniproxy 伺服器的 IP 即可!
1 2 3 4 |
apt-get install git git clone https://github.com/R0uter/Dnsmasq-sniproxy-conf.git cd Dnsmasq-sniproxy-conf ln -s /root/Dnsmasq-sniproxy-conf/sni.conf /etc/dnsmasq.d/ |
記得修改裡邊的 IP 位址!
------
這樣,你的 dns 就增加了常見認證網站的自動反代功能! ☺️
本文由 落格博客 原創撰寫:落格博客 » 部署 SNI Proxy 加速網頁訪問 反代 無需證書
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/984.html
標記…
“GFW 能夠解包 HTTP 流量”,並不是能解包,http數據都是明文傳輸的,因此沒有安全性
是的,http協議在傳輸時會將數據封包為tcp,讀取的時候將tcp數據包解包合併為明文數據,我這里特地用了“解包”而非“解密”,我認為這麼描述是合理的。
貌似沒用,現在dnsmasq和pdnsd等都不能解決dns污染問題
臥槽!!!! 麻痹的 WordPress 的後臺回復不能再混蛋一點了啊啊啊啊啊啊!!!
老子寫了三遍啊整整三遍!!!!!
=。=算了,我不想寫了,氣死我了,這個能用,我就用這個,需要兩台 vps,國外一個國內一個,絕逼好使。
用typecho啊
啊,這麼多年了,換博客系統的話……遷移工作量太大了,就這麼著吧哈哈哈哈