过去使用得方案是 iKuai + docker + gost + openvpn + 端口分流(外部线路)实现魔法上网,灵活度不足,很大程度上是因为限于国情爱快固件比较缩手缩脚。近期由于上游服务器调整,原方案无法继续使用了。折腾了一下新方案,新方案的网络拓扑图如下:
图片使用 https://draw.io 绘制
说明:
- LAN1 走默认路由表,国内线路
- LAN2 走下一跳网关方式进行分流,魔法上网
- AP 分为 3 个模式:
- lan1 国内直连
- vlan 100 跨境
- vlan 200 访客模式 (限速)
准备
- iKuai 3.6.7 x64 Build202208301257 免费版 (8G/64G)
- ubuntu 原生服务端镜像:ubuntu-20.04.3-live-server-amd64.iso
- clash v1.11.8
- shadowsocks + v2ray-plugin 的服务器(可选,机场或其他自建服务器,clash 大多都支持,配置需做相应调整)
配置
iKuai 安装 Ubuntu 虚拟机
- 创建普通存储的硬盘
- 上传iso文件
- 创建虚拟机
- 创建磁盘文件
- 加载ubuntu server iso文件 (iso 文件上传路径)
- 开机自启
- 启动虚拟机,打开网页 vnc 进行 ubuntu server 默认安装
- 安装完成,关机,删除挂载的 iso 文件
- 重新启动安装完毕
更多可参考:https://www.77bx.com/79.html
Ubuntu 预配置
禁用 systemd-resolved
指定一个默认 DNS,223.5.5.5 是阿里云公共 DNS,也可换成其他的。极度不推荐 114 DNS,污染严重。
sudo su
[ -d /etc/systemd/resolved.conf.d ] || mkdir -p /etc/systemd/resolved.conf.d
printf "%s\n%s\n%s\n" '[Resolve]' 'DNS=223.5.5.5' 'DNSStubListener=no' | sudo tee /etc/systemd/resolved.conf.d/10-make-dns-work.conf
systemctl restart systemd-resolved
创建 clash 用户
sudo adduser clash
安装 clash
准备安装包,目录结构如下
> tree
package
├── clash_iptables.sh
├── clash-linux-amd64
├── clash.yaml
└── install.sh
install.sh
#!/bin/bash
systemctl stop clash
cp clash-linux-amd64 /usr/local/sbin/clash
chmod +x /usr/local/sbin/clash
mkdir -p /etc/clash
cp clash.yaml /etc/clash/config.yaml
cp clash_iptables.sh /etc/clash/
chmod +x /etc/clash/clash_iptables.sh
cat << 'EOF' > /lib/systemd/system/clash.service
[Unit]
Description=clash service
After=network.target
[Service]
Type=simple
StandardError=journal
User=clash
Group=clash
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_NET_ADMIN
AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_NET_ADMIN
ExecStartPre=+/usr/bin/bash /etc/clash/clash_iptables.sh
ExecStart=/usr/local/sbin/clash -d /etc/clash
LimitNPROC=500
LimitNOFILE=1000000
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl restart clash
clash.yaml
mixed-port: 7890
tproxy-port: 7893
ipv6: false
allow-lan: true
mode: rule
log-level: debug
secret: ''
dns:
enable: true
ipv6: false
listen: 0.0.0.0:53
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
default-nameserver:
- 223.5.5.5
- 8.8.8.8
nameserver:
- 223.5.5.5
- 8.8.8.8
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
- tls://dns.rubyfish.cn:853 # DNS over TLS
- https://1.1.1.1/dns-query # DNS over HTTPS
fallback:
- tls://1.1.1.1:853
- tls://1.0.0.1:853
- tls://8.8.8.8:853
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
domain:
- '+.google.com'
- '+.facebook.com'
- '+.youtube.com'
proxies:
- name: "ss01"
type: ss
server: "ss01.example.com"
port: 443
cipher: aes-256-gcm
password: "password"
plugin: v2ray-plugin
plugin-opts:
mode: websocket
tls: true
# skip-cert-verify: true
host: ss01.example.com
path: "/customized_wss_path"
mux: true
# headers:
# custom: value
proxy-groups:
- name: "auto"
type: url-test
proxies:
- ss01
# tolerance: 150
# lazy: true
url: 'http://www.gstatic.com/generate_204'
interval: 300
- name: "PROXY"
type: select
proxies:
- "auto"
rules:
# LAN
- IP-CIDR,127.0.0.0/8,DIRECT
- IP-CIDR,172.16.0.0/12,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- IP-CIDR,100.64.0.0/10,DIRECT
# 最终规则(除了中国区的IP之外的,全部翻墙)
- GEOIP,CN,DIRECT
- MATCH,PROXY
clash_iptables.sh
#!/bin/bash
# 参考:
# https://www.gushiciku.cn/pl/aYvT/zh-hk
# delete possible configuration
ip rule del fwmark 666 table 666 || true
ip route del local 0.0.0.0/0 dev lo table 666 || true
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X clash || true
iptables -t mangle -X clash_local || true
# recreate iptables
ip rule add fwmark 666 lookup 666
ip route add local 0.0.0.0/0 dev lo table 666
iptables -t mangle -N clash
iptables -t mangle -A clash -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A clash -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A clash -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A clash -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A clash -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A clash -p tcp -j TPROXY --on-port 7893 --tproxy-mark 666
iptables -t mangle -A clash -p udp -j TPROXY --on-port 7893 --tproxy-mark 666
iptables -t mangle -A PREROUTING -j clash
iptables -t mangle -N clash_local
iptables -t mangle -A clash_local -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A clash_local -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A clash_local -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A clash_local -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A clash_local -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A clash_local -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A clash_local -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A clash_local -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A clash_local -p tcp -j MARK --set-mark 666
iptables -t mangle -A clash_local -p udp -j MARK --set-mark 666
iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner clash -j RETURN
iptables -t mangle -A OUTPUT -p udp -m owner --uid-owner clash -j RETURN
iptables -t mangle -A OUTPUT -j clash_local
clash-linux-amd64
本文采用 amd64-v1.11.8版本
https://github.com/Dreamacro/clash/releases/download/v1.11.8/clash-linux-amd64-v1.11.8.gz
新架构或可采用 amd64-v3 版本:
https://github.com/Dreamacro/clash/releases/download/v1.11.8/clash-linux-amd64-v1.11.8.gz
更多关于 v3 版本的介绍(指令集层面的区别):https://github.com/golang/go/wiki/MinimumRequirements#amd64
本地上传软件包至虚拟机:
scp -r package root@10.35.0.16:~
虚拟机内执行安装程序:
cd ~/pacakge
sudo ./install.sh
iKuai 设置
iKuai 路由器硬件配置
iKuai 配置最小要求 :64位系统、4GB RAM、20GB SSD
分流设置, 开启下一跳网关分流
VLAN 设置
DHCP 配置
一些思考
- clash TPROXY 模式的支持使得全局代理变得很方便,可以突破路由器的限制实现复杂功能
- clash 不支持 icmp 代理,将使得icmp失效,考虑如何解决
- clash 的 fake-ip 有点儿意思,还不能完全理解,
参考
https://www.gushiciku.cn/pl/aYvT/zh-hk
https://gist.github.com/cloverstd/0c3da3191797e8837cf86e5791404e55
https://blog.newhanly.com/2020/04/28/clash/