真的安全?Cloudflare Worker部署VLESS翻牆代理的原理和proxyIP細節研究

小U上次分享自建VPN/代理翻牆已經是2017年(連WhatsApp都要翻墻?路由器刷固件架設SoftEther VPN Server翻墻的圖文攻略),生活在牆外的我沒有翻牆的“剛需”,但是祖國的春風在香港吹啊吹,又吹生了我對VPN翻牆的熱情。昨晚花了一晚時間學習了Cloudflare Worker部署VLESS翻牆代理的代碼 ,今早順利根據網上的教程順利來跑起了VLESS轉發代理。如果你對VPN是否安全會有批判性思考,不是免費就9衝,那麼本文和大家分享幾個技術細節你很可能感興趣。

閱讀全文: 真的安全?Cloudflare Worker部署VLESS翻牆代理的原理和proxyIP細節研究

Cloudflare Worker + VLESS的原理

Cloudflare Worker上可以運行javascript,作爲一個serverless function,每天有十萬個10ms CPU time 的requests可以免費用。z大寫的edgetunnel代碼可以部署在Cloudflare Worker,爲數據包加添vlessheader信息,達到vless代理轉發的目的。

由於Cloudflare在GFW國內某個程度能訪問,而CF Worker又能訪問GFW以外的信息,所以透過CF Worker來轉發的數據理論上就達到了翻牆的效果

詳細的部署方法可以參考:

最關鍵的是下圖在Cloudflare上設置的Worker的代碼:

最值得深究的小U認爲是proxyIP的這個設定,爲什麼呢?

爲什麼還要proxyIP?安全嗎?

代碼中有一行神祕的proxyIP設定觸動小U Cybersecurity 的神經,網上教程建議設置爲:103.200.112.108。這IP到底是誰?有什麼用?爲什麼需要?既然叫proxy,應該流量就應該是經過這些IP,教程中還要我們關閉加密設置?!這。。。第一反應是用WHOIS查找這些IP的擁有者:

感覺不安。既然是利用Cloudflare的Infrastructure進行轉發的VLESS代理,爲什麼還要繞道去第三方的IP做代理??會不會只是GFW牆內的情況所以要設定這個proxyIP?

小U把proxyIP 設置爲空白,果然Cloudflare Worker的頁面就死了。唯有按圖索驥研究這個proxyIP到底幹什麼用的。

關於proxyIP的代碼分析

細讀z大的代碼,發現proxyIP並不是每次轉發都會用到,反而是“例外”的情況才會在retry() 函數中調用。那到底是什麼情況呢?z大在代碼中其實有備註解釋:

// if the cf connect tcp socket have no incoming data, we retry to redirect ip

很抱歉小U的英文能力沒能理解,按照上下文,z大把本地socket叫websocket,遠端的叫remotesocket或者tcp socket,那可能是遠端的tcp socket沒有返回數據,就重定向到ip?看代碼,ip指的就是proxyIP,那到底是把什麼重定向,那個proxyIP又爲什麼能解決問題?

唯有按圖索驥尋找這個proxyIP的資料,功夫不廢有心人,小U找到了 cloudflare worker搭建vless | Masheep (piig.top) 作者也有探究這個proxyIP到底是什麼,他說:

一些神奇的ip,可以无条件的转发所有cf流量
如果上面的proxyip用不了了,可以替换成下面这些域名
cdn-all.xn–b6gac.eu.org
cdn.xn–b6gac.eu.org
cdn-b100.xn–b6gac.eu.org
edgetunnel.anycast.eu.org
cdn.anycast.eu.org
另外可以参考这个issues进行proxyip查找
issues:https://github.com/zizifn/edgetunnel/issues/162

這個#162issue幫我指引我到了正確的答案,z大在自己的repo issue中解釋到:

由于cf bug,现在cf worker 不能直接访问cf 托管的网站。。所以需要配置一个中转ip。。。而有一些神奇的 ip,可以无条件转发所有 cf 的流量。

z大口中的“神奇的ip”,就是proxyIP。而這個“cf bug”其實是Cloudflare的“有意爲之”,Cloudflare已在網誌上說

Outbound TCP sockets to Cloudflare IP ranges are temporarily blocked, but will be re-enabled shortly.

也就是說CF Worker是不能訪問CF自家的IP,是不是很不可思議?而z大的代碼就考慮到這一點,如果出現遠端TCP不返回數據(例如遠端的IP是CF自家的IP),就會觸發 retry() 函數,把TCP包再發給proxyIP retry,讓proxyIP丟回給CF的目的IP。

驗證proxyIP的工作原理

如果proxyIP只是在訪問Cloudflare IP時候觸發的failsafe,那麼如果一個網站不是Cloudflare host/proxy/edge-caching/namesever等等的話,應該能夠正常的訪問才對。那什麼網站不會用Cloudflare?自然是Cloudflare的競爭者,例如AWS的Cloudfront。所以上AWS應該不會有任何問題,把proxyIP去掉上AWS果然正常:

Google也有自己一套CDN,不需要經過proxy轉發,所以也解釋了爲什麼YouTuber測試CF Worker+Vless的看YouTube速度這麼快的原因。

ProxyIP的問題

由於有大量網站都是利用CLOUDFLARE CDN的,導致z大的這套組合拳會經常調用proxyIP。引申的問題有:

安全性問題

z大的vless轉發script似乎只有幫數據包套vlessHeader,並不是傳統VPN那樣上加密。這樣的情況把數據轉發不知道背後是誰運營的proxyIP放心嗎?

速度問題

這些proxyIP能提供的轉發速度不是無限的,單個IP也不知道有沒有地域優化,導致ping值和速度都受限制

能用多久?

我在網上搜到能用的這種“神奇的ip”就那麼幾個,就算撇開安全性,如果沒有了這種“神奇的ip”,Cloudflare又不重開Worker訪問自家IP的權限的話,那麼這整套所謂“不需VPS 永久免費的Cloudflare VPN“就瞬間崩塌。

20230818更新:ProxyIP和CF反向代理IP的詳細解釋

Youtuber不良林在這個視頻的5:30秒左右開始說明“CF反代IP“也就是我們多次提到的”Proxy IP”的用途。影片中還有教大家如何找到這些代理IP。

瑕不掩瑜:CloudFlare VLESS方案評價

雖然說道了現時的CF VLESS因爲proxyIP有各種問題,但是小U認爲CloudFlare+VLESS依然是現時最容易上手、性能首屈一指的免費翻牆方案。即使proxyIP出了問題,還是能用他能上到一些非Cloudflare的大型的外部網站和APP,進行下一步的翻牆部署,不能不說是極佳的“翻牆起手式”

關於VLESS on Cloudflare,小U還有幾個問題想研究/分享的:

  • Cloudflare 線路優選 / 優選IP是什麼一回事?
  • Cloudflare Warp / Warp+ 會是更好的方案嗎?
  • 能不能像 Surfshark, NordVPN 那樣選擇出口IP的所在國家?

如有任何問題或想討論的,歡迎留言~

其他翻牆的方法請參考:

p.s. 我發現Cloudflare Worker還有另一個功用:串接OpenAI的API實現【ChatGPT】用VPN都“Sorry, you have been blocked”的解決方法

11 Comments
  1. 用vpn 目的係保護自己,呢排成日見到有個叫deeper 既聲稱自己行dpn 去中心化既vpn,其實呢樣野係work 唔work 同有冇資安既問題?見佢gdn 廣告賣得好行想了解下。大哥可唔可以研究下分享下你既睇法?謝謝

    • 早在好似十年就有個項目叫Softether,日本筑波大學牽頭的去中心化VPN網絡,所以打住WEB3.0爲口號的VPN唔出奇。每個VPN的最終節點exit port都係會變爲非VPN加密,假設有人做非法嘢,引起國安公安的注意,你咁啱做咗幫距的VPN節點,IP就係你屋企寬頻個IP,咁後果會點呢。

  2. 今天我的worker在国内不能访问了,新建的账号新建的woker都不能访问了,是被限制了吗?
    通过vpn还能访问,说明被拦截了

    • 對了,另一個可能是我看到網上有分享說 Cloudflare Workers 分配的域名(xxxx.workers.dev)已經被dns污染,所以直接連接的話,無法dns解析。如果你自己有域名的話或許可以嘗試配置自己域名的dns來繞過dns污染。

    • 是可能的,現在防火牆能“精確識別” “裸奔的VLESS”流量,所以如果你的ISP是有針對你的IP段探測,這一招是比較容易被破。另外就是要確保PROXY IP運作正常,否則不能訪問用了CLOUDFLARE CDN的網站。

  3. VLESS的Proxy IP和不良林说的CF反代不是同一种服务,Proxy IP是承接从CF转发来的流量,CF反代是把接收到的流量转发给CF,两者方向是相反的,当然有些服务器双向都支持

    • 哦?是這樣子嗎?

      • 实际上cf反代ip大都可以用作proxyip。
        proxyip需要请求的目的ip是cf。来源既可以是不限的,也可以仅限cf。
        cf反代ip不能指定请求的目的ip,它们固定与一个cf的ip通信。请求来源则是不限的,除非故意屏蔽来自cf的请求。但基本上很少有这种限制。
        可以发现,cf反代ip大多都符合做proxyip的条件。

  4. 如果自己搭建CF反代/proxy IP, 是否可行?

你可以一針見血

by Upsangel
Logo