前言
(如果你不想聽我 BB, 可以直接跳轉到 最後一段: #結論.)
先解釋一下為什麼要這麼做.
我原本用的是 clash + 澳洲 VPS (V2Ray), 奈何最近 GFW 相當瘋狂, 從每個星期一封進步到現在的一天一封, 甚至上午換 IP 下午封, 強度這麼大, 這誰吃得消? 我嘗試使用 Oracle 提供的 API 檢測封殺並自動切換 IP, 但是我的功力不到家, 還有就是 Oracle 的文檔太過迷惑, 我愣是沒寫出來.
嘗試
#1 直接使用迷霧通二進位文件
那好, 我用迷霧通用過一段時間, 印象是迷霧通不是很快但是很穩. 那迷霧通有沒有提供 Openwrt 版本? 沒有. 但是有大神編譯的二進位文件, 那麼下載下來用一下嘛.
巧克力大神編譯的 Geph4 二進位文件:
https://community.geph.io/t/topic/1694
下載下來之後, 使用 geph4-client connect --vpn-mode tun-route
, 將整個路由的流量都轉發到迷霧通. 結果用一會又發現問題了, 我防火牆開放的所有埠從外部都無法訪問了.
#2 迷霧通 in Docker + Passwall
那好吧, 再換個方法. 我自己構建了迷霧通二進位文件的 Docker 鏡像, 使用我比較熟悉的 Passwall 連接到 Geph4 的 Socks5 埠, 然後開一個全局代理, 這下可以了吧.
我自己構建的 Geph4 Docker Image
https://hub.docker.com/r/justinhimself/geph4-client
還是不行.
如果先開 Geph4, 然後再開 Passwall, 能夠正常工作, 但是如果先開 Passwall, 或者容器重啟了 (比方說要改出口節點), Geph4 就死活連不上所有非大陸 IP, 比方說 Bing, 那麼 Geph4 也就翻不了牆了.
為了解決這個問題, 我先後在「訪問控制」中不代理 Geph4 的流量, 在「規則列表」-「區域網 IP」 中添加 Docker IP 區段, 甚至勾選了 Openwrt 本機不代理, 都沒有用處. 這說明 Passwall 存在 Bug, 只要打開 Passwall, 外網流量一律都會從 Passwall 里過, 規則什麼都是放屁.
#3 迷霧通 in Docker + iptables
如果仔細觀察的話就會發現, 上文中的 Passwall 就起到了一個轉發流量的作用, 翻牆的邏輯和 DNS 都是迷霧通處理的. 那這樣就好辦啦啊, 直接用 iptables 做流量轉發不就行了.
迷霧通論壇中大佬的帖子
https://community.geph.io/t/topic/3780/2
在谷歌上簡單查找後, 居然發現有人在做著和我一模一樣的事情 (見上面的帖子), 那麼 iptables 規則也不用自己寫了, hooray!
簡單介紹一下這個方法是怎麼工作的. 這位大佬通過 redsocks 將 TCP 的流量轉為 socks5 流量, 然後送到迷霧通進行代理. 他還同時使用了 dnsencrypt 來解決污染問題, 我自己實測不必要, 因為 redsocks 提供了 DNS 流量的代理, 他應該是沒配置好.
我為了簡化部署的流程, 將 geph4-client 和 redsocks 打包做了一個 docker 鏡像, 完整的部署方法已經寫到 「結論」 部分了.
結論
此方法需要你的操作系統為 Openwrt 且安裝有 docker. 因為某種原因 Openwrt 本機不能代理, 但是連接到 Openwrt 的客戶端可以代理. 如果有需求的話你可以自己修改下面的 iptables 規則.
先拉取並部署我打包的 docker 鏡像:
docker pull justinhimself/geph4-client
docker run -d \
-p 9809:9809 \
-p 9909:9909 \
-p 9910:9910 \
-p 15353:15353 \
-p 12345:12345 \
-p 10053:10053 \
-v /path/to/config:/config \
-e USERNAME=<code data-enlighter-language="generic" class="EnlighterJSRAW">#optional</code> \
-e PASSWORD=<code data-enlighter-language="generic" class="EnlighterJSRAW">#optional</code> \
-e EXIT_SERVER=<code data-enlighter-language="generic" class="EnlighterJSRAW">#optional</code> \
--name geph4-client \
--restart unless-stopped \
--log-driver local \
--log-opt max-size=10m \
justinhimself/geph4-client
然後在 openwrt -> 網路 -> 防火牆 -> 自定義規則添加如下內容:
沒有 Luci 圖形界面?
將規則添加到 /etc/firewall.user
. 或者你也可以選擇每一次啟動防火牆時手動運行.
#全局TCP代理規則 iptables+REDIRECT
iptables -t nat -N REDTCP
iptables -t nat -A REDTCP -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDTCP -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDTCP -d 100.64.0.0/10 -j RETURN
iptables -t nat -A REDTCP -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDTCP -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDTCP -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDTCP -d 192.168.0.0/16 -p tcp ! --dport 53 -j RETURN
iptables -t nat -A REDTCP -d 198.18.0.0/15 -j RETURN
iptables -t nat -A REDTCP -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDTCP -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDTCP -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A PREROUTING -p tcp -j REDTCP
# 局部UDP代理規則 (開啟全局UDP 這部分要注釋掉) 手動指定IP埠 可解決DNS污染
iptables -t nat -N REDDNS
iptables -t nat -A REDDNS -p udp --dport 53 -j REDIRECT --to-ports 10053
iptables -t nat -A PREROUTING -p udp -j REDDNS
保存, 現在你的區域網客戶端應該已經可以工作啦!
配合 OpenClash 使用
上面的防火牆規則看起來還是很繁瑣, 如果你裝有 Openclash 的話, 可以將 Geph4 添加為一個節點, 那就非常非常簡單啦.
首先需要在部署 Docker 容器的時候添加一行參數, 自定義 mac 地址:
--mac-address 34:ab:12:56:de:bc
mac 地址不能與已有的重複, 建議用在線工具生成一個.
然後在 OpenClash – 全局設置 – 訪問控制 裡面指定不代理的 mac 地址.
這樣防止迴環的工作已經做完了.
接著切換到 OpenClash – 伺服器與策略組管理, 翻到最底下點擊讀取配置, 等一小會.
然後回到 OpenClash – 伺服器與策略組管理, 在伺服器節點配置, 點擊添加節點, 填進去你的地址和埠, 勾選自定義標記, 其他保持默認, 保存配置.
然後會跳轉 回伺服器與配置組管理, 點擊 保存配置 – 應用配置.
這個時候節點已經能用啦
Thumbnail:Firewall Rules by Aleksandar Savic
If using the image violates your rights, or there』s anything related to copyright laws, please contact me at [email protected], I will deal with them immediately.
發表回復