目標
- 異地組網, 遠程訪問家中環境
- 結合海外 VPS 翻牆 ( 不在此篇討論 )
- 使用 V2Ray TLS 加密流量
- 將 TLS 流量隱藏在正常的 HTTPS 流量中達到混淆目的
- 使用 Cloudflare 的內網穿透服務, 達到防探測目的 ( 服務器直接和 CF 溝通, 沒有端口暴露 )
- 使用 Cloudflare 的 CDN 服務, 達到防牆、加速作用
如果你並不是想要做異地組網, 而是想要在 VPS 上跑 (Nginx/Caddy/Apache) + WP + V2Ray, 那麼你其實用不著這麼複雜. 你只需要看這篇文章就可以了.
(這篇博文主要是討論一個沒多少人做過的方案的可行性, 所以你會看到後面還有一大通廢話; 作為教程本文是不合格的, 如果想要尋找教程請出門右轉谷歌搜索. )
準備環境
- 一台聯網、24×7 運行的機器, 內存 4G+, 空間 8G+
- 安裝有 Linux 系統 ( 推薦 Openwrt, 或者 樹莓派安裝 PiOS )
- Cloudflare 帳戶, 託管在 CF 上的域名
執行以下操作準備所需鏡像.
docker pull wordpress docker pull mariadb docker pull teddysun/v2ray
使用以下 Dockerfile 構建 Cloudflared 鏡像
FROM debian:latest VOLUME ["/etc/cloudflared"] WORKDIR /etc/cloudflared RUN ln -s /etc/cloudflared /root/.cloudflared RUN apt update && apt install wget -y RUN wget https://github.com/cloudflare/cloudflared/releases/download/2021.5.10/cloudflared-linux-amd64 \ && mv cloudflared-linux-amd64 /usr/local/bin/cloudflared \ && chmod +x /usr/local/bin/cloudflared
配置 Nginx + WordPress
如果你已經配置好了, 可以直接跳過. 我在這裡貼出我的啟動參數:
docker run --name wordpress \ -v /www/wordpress:/var/www/html \ -p 443:443/tcp \ -p 80:80/tcp \ --net wpblog \ --restart always \ -h wordpress \ --expose 443/tcp \ --expose 80/tcp \ -e 'WORDPRESS_TABLE_PREFIX=wp_' \ -e 'WORDPRESS_DB_HOST=db' \ -e 'WORDPRESS_DB_USER=root'\ -e 'WORDPRESS_DB_PASSWORD=password' \ -e 'WORDPRESS_DB_NAME=wordpress' \ -d wordpress:latest
docker run --name wordpressdb \ -v wordpressdb_data:/var/lib/mysql \ -p 3306:3306/tcp \ --net wpblog \ --restart always \ -h db \ --expose 3306/tcp \ -e 'MARIADB_ROOT_PASSWORD=password' \ -e 'MARIADB_DATABASE=wordpress' \ -d mariadb:latest
V2Ray
V2Ray 啟動參數:
docker run --name v2ray \ -v /etc/v2ray:/etc/v2ray \ --net host \ --restart always \ -d teddysun/v2ray
V2Ray 配置文件:
{ "inbounds": [ { "port": 9999, "listen":"127.0.0.1", "protocol": "vmess", "settings": { "clients": [ { "id": "myawesomepassword", "alterId": 0 } ] }, "streamSettings": { "network": "ws", "wsSettings": { "path": "/myawesomepath" } } } ], "outbounds": [ { "protocol": "freedom", "settings": {} } ] }
Cloudflared
Cloudflared 的配置有一點點煩. 我先開了一個 Debian 容器生成了 Cloudflared 的配置文件:
docker run --rm \ -v /etc/cloudflared:/root/.cloudflared \ -it debian:latest
然後在 Debian 中執行:
apt update && apt install wget -y wget https://github.com/cloudflare/cloudflared/releases/download/2021.5.10/cloudflared-linux-amd64 \ && mv cloudflared-linux-amd64 /usr/local/bin/cloudflared \ && chmod +x /usr/local/bin/cloudflared cloudflared login cloudflared tunnel create mytunnel exit
/etc/cloudflared
中新建 config.yml
, 寫入:
tunnel: tunnel-id-here credentials-file: /etc/cloudflared/tunnel-id-here.json ingress: - hostname: myawesomesite.com path: /myawesomepath service: http://localhost:9999 - hostname: myawesomesite.com service: http://localhost:80 - service: http_status:404
使用如下啟動參數啟動容器:
docker run --name cloudflared \ -v /etc/cloudflared:/etc/cloudflared \ --net host \ --restart always \ -d cloudflared:latest '/usr/local/bin/cloudflared' '--no-autoupdate' '--config' '/etc/cloudflared/config.yml' 'tunnel' 'run' 'tunnel-id-here'
DNS 配置
打開 Cloudflare, 新建一條 CNAME 紀錄, 如下配置:
| TYPE | NAME | CONTENT | TTL | Proxy State| | CNAME | @ | tunnel-id-here.cfargotunnel.com | auto| Proxied |
驗證
$ curl https://myawesomesite.com/myawesomepath Bad Request
後記
使用場景
之所以會有這樣的主意, 是因為我早就將所有文件都掛在 NAS 中了, 我隨身攜帶的筆記本、手機裡面基本沒有任何文件. 那麼當我出遠門的時候, 如果沒有一個可靠的組網方案, 難不成我還得把硬盤拆下來帶著走? ( 主要是留學場景 )
那麼只有 VPN 方案了. 眾所週知天朝的網絡環境超級奇葩, 要滿足搭建 VPN 的條件得開放公網 IP、配置 DDNS、配置端口轉發等一系列操作, 搞不好哪天運營商給妳封了還得重搞. 而且明擺著 VPN 流量流進流出也很不放心.
所以要配置這樣一個 VPN 還是得靠內網穿透. 問題是自己配 VPS + FRP 會被牆, 購買現成的方案性價比低, 好像真的走到僵局了. 當 4月份 CF 宣布 Argo Tunnel 開放之後我就一直在尋找利用它的方法: Cloudflare 現在遍地開花, 和 Cloudflare 長期的 TLS 流量是唯一不會被懷疑 + 不會被牆掉的. 而且有 CF 的 Edge Network 加持, 網絡延遲可能還比自己搭建 VPS 搞內網穿透要小.
剩下的問題就是偽裝問題了. 自然而然的, 我想到了流量 TLS 加密後混在正常的 HTTPS 流量中, 那麼 V2 + WP + CF 的方案就確定下來了.
注意事項
我在網絡拓墣圖裡並沒有畫出來, 那個 Home Lan 其實是走過一個 Openwrt 網關的, Openwrt 上有配置 Passwall 鏈接到我的翻牆 VPS 來保證速度. (大部分配置有軟路由的人也基本就是這麼玩的, 保證全家翻牆)
既然有翻牆這一個環節, 那麼就肯定要注意被牆的問題. 首先我們複習一下牆的手段: 針對網站有 DNS 污染和匹配SNI, 針對 IP 就比較簡單, 直接截下流量就可以了.
因為我們使用 Cloudflared 做內網穿透, 針對 IP 的威脅可以忽視. DNS 污染可以使用 DoH、DoT、dnsProxy, 匹配 SNI 我們可以用 ESNI 嘛. 而且如果是海外訪問(留學), 連牆都不用過.
要在家啟用 dnsProxy, 可以在 Openwrt 中配置 dns2socks ( dns 流量走代理 ); 要使用 DoH、DoT, 參考 Cloudflare 的這篇教程; 配置 ESNI 得先配置加密 DNS, 然後在瀏覽器裡找到對應選項開啟.
剩下就是路由器用來翻牆的 VPS 會不會被牆. 因為很多沒有被牆的網站 (如 Github ) 訪問速度也和被牆了差不多, 所以我默認是開啟 IP 白名單的. 就是說, 如果 VPS 失效, Cloudflare 也會訪問不了. 如果人在家當然很好辦, 如果人在遠門或者在國外 (留學場景), 要注意把路由器設為 GFWlist 模式.
另外, 在牆內老是訪問同一個域名可能會導致身份關聯 ( 盡量不要在牆內這麼用 ). 如果非要這麼做, 建議配合 Tor 使用或者確保 DoH、ESNI 工作正常. (就是絕對不要在手機上亂用的意思)