简单讲,这是一个用来方便使用 v2ray/ss 代理上网的工具。支持下面的特性:
- 只依赖了 python3 内置的模块(openwrt 上面的即使内置模块也被拆分成了不同的包),使用 python 比 shell 脚本更方便的兼容不同的系统,更好的错误捕获。还可以支持测试用例。
- 尽量少的修改 iptables 规则。
- 通过域名名单来使用不同的代理,比如 gfwlist 可以使用美国代理,而 netflix 单独使用一个支持访问的香港代理。
- 可以自动更新域名列表。
- 会自动处理大部分的 v2ray/ss 配置。
- 支持不走代理的黑名单 ip。
- 可以自动更新 v2ray 程序。
- 支持运行检查,方便在路由器上面跑,v2ray 在路由器上面因为内存问题有时候会奔溃。
- 完全开源,你有需要可以自己修改,也可以提交合并。
这个程序的主要功能是在路由器上面跑透明代理,这样局域网内所有终端都可以无缝翻墙,比如电视盒子,Google Home 这样的设备。
工作原理是下面几个关键点,实际上主要是三块内容 iptables,v2ray/ss,dnsmasq:
- 通过 iptables 劫持所有本机的和路过的 dns 请求(除了设定的某些国内 dns),把他们发给自己启动的
60053
端口的 dnsmasq。 - 这个 dnsmasq 会配置为,符合要求的域名(比如 gfwlist 里面的)会发送给一个 v2ray/ss 启动的 dns 端口
2053
,来解决 dns 污染问题。其他的域名会走上面提到的那个国内 dns 解析。 - 这个 dnsmasq 同时会把这些符合条件的域名解析回来的 ip 地址添加到对应的 ipset 列表里面。
- 通过 iptables 会把所有发往这些 ipset 列表里面的 ip 的请求发给 v2ray 对应的转发端口。
- v2ray/ss 会启动几个端口,一个是 2053 的 dns 端口,用来转发 dns 请求到 8.8.8.8 以获取无污染的 dns 结果。其他的都是用来转发真实请求的,不同的域名列表,也就是
list_xxx
那个配置,会有不同的端口,对应不同的出口,这样可以做到根据域名来分流到不同的代理服务器。
打开下载页面下载最新的 svgfw-xx.zip
,解压到一个一个目录,然后根据 config_sample.ini
配置一个 config.ini
出来。之后可以执行一下 ./svgfw -d check/
看看有没有错误信息。
$ ./svgfw -h usage: svgfw [-h] [--debug] {start,stop,restart,status,update_list,keep_alive,install_v2ray,check} ... Simple V2ray/ss wrapper to get across the GFW, version 0.3 optional arguments: -h, --help show this help message and exit --debug, -d Show debug messages Avaliable commands: {start,stop,restart,status,update_list,keep_alive,install_v2ray,check} start Start services stop Stop services restart Restart services status Show running status update_list Update lists to the latested version keep_alive Keep all the service alive install_v2ray Install v2ray binary check Check the config.ini
start
,stop
,restart
: 启动,停止,重启代理,可以使用start dnsmasq
来单独控制 dnsmasqstatus
: 打印运行状态update_list
: 更新规则列表keep_alive
: 检查运行状态,如果有奔溃的程序,自动启动那个程序install_v2ray
: 安装 v2ray,安装会在程序所在的目录里面建一个./bin/
目录,可重复运行更新check
: 检查运行环境
上面的命令配合使用 -d
参数会输出更多的信息,debug 的时候可以使用。
如果是在路由器上面执行,那需要先配置好 opkg/entware,配置方法依据路由器不同而不同:
- Asuswrt Merlin: https://github.com/RMerl/asuswrt-merlin/wiki/Entware
- openwrt: 我记得应该默认就是配置好的。
- Linux: Linux 一般不需要做什么配置了,只需要看看
python3
是不是存在就可以。
opkg/entware 配置好之后,执行下面的命令安装依赖:
opkg install python3 python3-logging python3-urllib python3-openssl python3-codecs ca-bundle
在路由器上面运行 v2ray 可能还需要配置一下虚拟内存,因为 v2ray 是 go 写的,对内存要求比较高,需要你插入一个 u 盘,如果是 merlin 系统,上面配置 opkg/entware 的时候应该就已经插入了,那么就会有一个 /opt
目录。
其他的可以参考这个链接 FAQ 的 8。
我的是 merlin 系统,使用的是 entware-setup.sh
完成的 entware 安装,修改之后我的 /jffs/scripts/post-mount
文件内容如下,这样每次启动都会建立一个 500M 的虚拟内存:
!/bin/sh
if [ -d "$1/entware" ] ; then
ln -nsf $1/entware /tmp/opt
fi
if [ -d "/opt" ];then
if [ -f /opt/swap ];then
dd if=/dev/zero of=/opt/swap bs=1M count=500
mkswap /opt/swap
fi
swapon /opt/swap
fi
建议时常观察一下这块内存的使用情况,一般是不会用到的,如果真的被用到了,那你的上网会比较慢,或者你的翻墙速度会比较慢。
使用下面的命令可以观察,看那个 Swap 那行,第二个数字,应该是 0。
# free -m
total used free shared buffers cached
Mem: 440420 324796 115624 2552 6224 108704
-/+ buffers/cache: 209868 230552
Swap: 511996 0 511996
可以直接通过 opkg 安装和更新:
opkg install shadowsocks-libev-ss-redir shadowsocks-libev-ss-tunnel simple-obfs
其中 ss-redir
提供透明代理, ss-tunnel
提供 dns 查询, simple-obfs
根据你自己的情况,没用到可以不装。
有几个问题需要注意下:
- 使用
ss-tunnel
查询 dns 需要 ss 服务器那边同时开放 udp 端口,否则查不了。 - 使用
simple-obfs
的话,配置文件里面的 server 需要填 ip,填域名会启动不了,不知道什么情况。
这种模式是方便把代理服务跑其他机器的,这样可以解决路由器内存太小的问题。
可以直接把配置好的程序复制到其他机器,然后使用 svgfw start v2ray
这样的命令来单独启动代理。
note: 这个方式我还没有自己测试过。
对于梅林系统,想要每次路由器启动都自动运行,需要在 /jffs/scripts/wan-start
里面增加下面的信息, /opt/svgfw/
是程序所在目录。这样可以每分钟检查一下是不是在运行,如果不在运行了会自动启动。可以观察 /tmp/svgfw.log
文件看是不是有奔溃,如果奔溃比较多,最好还是升级路由器吧,要翻墙会很不稳定。
cru a svgfw_check "* * * * * /opt/svgfw/svgfw keep_alive >> /tmp/svgfw.log"
对于 linux 系统,或者 openwrt 也可以类似的添加一条定时任务即可。
- 支持 ipv6
- ss-tproxy: 在自己写这个项目之前使用的是这个方案,我这个方案也参考了一些思路,这个方案支持更加广泛,比如 chnroute 之类的方式。