目标
部署一台自动代理路由器,实现根据域名来自动设定直连或者代理,而我要做的只是设置PC的默认网关为主路由器(192.168.0.1)还是自动代理路由器(192.168.0.254)。
创建Openwrt虚拟机
系统版本
- 主路由器 (ip:
192.168.0.1
) - ESXI 6.0U2
- Openwrt 15.05.1 (ip:
192.168.0.254
,gateway:192.168.0.1
)
Openwrt虚拟机的配置教程有很多,这里只针对ESXI版Openwrt可能会遇到的问题说明下:
在ESXI6上,
openwrt_x86
每次启动时会大概率的出现卡死现象,表现为Kernel panic - not syncing: Attempted to kill init
。- 解决办法:改用
openwrt_x64
后正常。原因未知。
- 解决办法:改用
在ESXI6上,在
openwrt
上执行某些命令时,会被强制关机,表现为1
来自 promote 的消息: The operation on the file "/vmfs/devices/deltadisks/17ad1ab5-openwrt-15. 05.1-x86-64-combined-ext4-s001.vmdk" failed (Bad address). The file system where disk "/vmfs /devices/deltadisks/17ad1ab5-openwrt-15.05.1-- x86-64-combined-ext4-s001.vmdk" resides is full. Select _Retry to attempt the operation again. Select Cancel to end the session.
- 解决办法:在
Vmware Fusion
中新建openwrt虚拟机(other/other linux 64, 256MB,虚拟机版本为11),第一次启动后,关机导出为ova
,然后再导入到ESXI6中。具体原因未知。
- 解决办法:在
安装软件
|
|
PS 在这里,安装官方版的shadowsocks,而不是openwrt spec版, 下载地址在这里。
PPS
在这里,如果安装的顺序不同,可能会导致lib的依赖错误(至少在15.05.1上是这样)。使用ldd
命令,检查一下shadowsocks的依赖包是否正常。
|
|
配置
配置shadowsocks
配置/etc/shadowsocks.json
,格式如下:
|
|
修改/etc/init.d/shadowsocks
,设置shadowsocks以Proxy Mode
模式启动,同时开启转发DNS请求
功能,上游DNS为8.8.8.8
:
|
|
设置shadowsocks开机启动,并手动运行:
|
|
到目前为止,你已经有了一个监听在1080端口的socks代理,和监听在5353端口的不受污染的DNS服务器
配置ipset
进入Luci界面-网络-防火墙-自定义规则,加入以下规则(最后的1080
是shadowsocks的本地端口,请酌情修改):
|
|
配置dnsmasq-full
修改/etc/dnsmasq.conf
,在文末加入conf-dir=/etc/dnsmasq.d
:
|
|
新建目录/etc/dnsmasq.d
,生成dnsmasq_list.conf
到该目录:
|
|
其中,dnsmasq_list.conf
的格式为:
|
|
你可以手动修改这个文件,你也可以使用gfwlist2dnsmasq.py
自动生成dnsmasq_list版的gfwlist列表。
重新运行dnsmasq
,它将监听在本机53
端口上。
|
|
测试
场景一
- PC端的默认网关设置为
192.168.0.1
, DNS设置为192.168.0.1
- 国内网站访问正常
- Google无法访问
场景二
- PC端的默认网关设置为
192.168.0.254
, DNS设置为192.168.0.254
- 访问国内网站
- dnsmasq解析该域名,发现该域名不在dnsmasq_list中,使用默认DNS服务器进行解析,正常访问。
- 访问Google
- dnsmasq解析该域名,发现该域名在dnsmasq_list中,使用设置的安全DNS服务器进行解析,并将该IP加至gfwlist集合中,iptables匹配到规则,将流量转发到shadowsocks监听的端口,进行代理访问。
- 访问国内网站