前言
(如果你不想听我 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.
发表回复