首页 > Linux, OpenWrt > OpenWrt路由器配置shadowsocks客户端及智能代理

OpenWrt路由器配置shadowsocks客户端及智能代理

2015年3月1日 LTNS     访问次数 465 发表评论 阅读评论

Shadowsocks 是一款开源的、安全的socket5代理软件,通过socket5协议和可自定义密码的工业级算法加密,实现网络流量的安全传输。

手上的 Netgear WNDR4300 这款无线路由器已刷 Gargoyle石像鬼固件OpenWrt 的web前端之一),在此基础上继续安装 shadowsocks客户端,并配置相应的智能代理功能,以实现路由器内网侧用户端的零设置智能分流翻WALL功能。

有个 博客 详述了三种 shadowsocks 应用于 OpenWrt路由器上的自动翻WALL方案:
1. Shadowsocks + ChnRoute
….境外ip都走代理,日常无需维护,适合连接速度较快的VPS;
2. Shadowsocks + Redsocks
….无需配置 ChnRoute 或者 GfwList,连接失败后会自动转代理,有时等待的时间较长;
3. Shadowsocks + GfwList
….黑名单里的走代理,平时需要维护(黑名单不可能100%覆盖被WALL的网站),适合连接速度较慢的VPS。
注:我用的廉价VPS(搭建ss的教程见 这里)连接速度较慢,故选择了方案3。另外,须注意不同的方案里使用的 shadowsocks客户端软件也是不一样的,且只有配置了 LuCI 这个web前端的 OpenWrt 才可以安装luci程序,所以Gargoyle固件只能手工配置了。

 
shadowsocks官网 提供了 OpenWrt可用的 shadowsocks客户端,WNDR4300可用对应 ar71xx 和 openssl(兼容性好些,还可选择体积更小的 polarssl)的最新版 shadowsocks-libev_2.1.4-1_ar71xx.ipk。通过 WinSCP 上传至路由器(比如 /root/目录),再用 Putty 登录后执行安装

cd
opkg update
#opkg install iptables-mod-nat-extra ipset libopenssl   #必要的三个软件包
#opkg remove dnsmasq && opkg install dnsmasq-full       #换成dnsmasq完整版
opkg install shadowsocks-libev_2.1.4-1_ar71xx.ipk

注:我刷的路由器固件中已包含 iptables-mod-nat-extra等三个软件以及 dnsmasq-full,所以这里就没有安装

修改路由器上的配置文件 /etc/shadowsocks.json(填入账号)

{
    "server":"VPS的公网ip",
    "server_port":8388,
    "local": "0.0.0.0",
    "local_port":1080,
    "password":"密码",
    "timeout":60,
    "method":"aes-256-cfb"
}

 
以及相应的启动脚本文件 /etc/init.d/shadowsocks

#!/bin/sh /etc/rc.common

START=95

SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
SERVICE_PID_FILE=/var/run/shadowsocks.pid
CONFIG=/etc/shadowsocks.json
DNS=8.8.8.8:53
TUNNEL_PORT=5353     #change to non 5353 if chinadns enabled

start() {
	# Client Mode
	#service_start /usr/bin/ss-local -c $CONFIG
	# Proxy Mode
	service_start /usr/bin/ss-redir -c $CONFIG -f $SERVICE_PID_FILE
	# Tunnel
	service_start /usr/bin/ss-tunnel -c $CONFIG -u -l $TUNNEL_PORT -L $DNS
}

stop() {
	# Client Mode
	#service_stop /usr/bin/ss-local
	# Proxy Mode
	service_stop /usr/bin/ss-redir
	# Tunnel
	service_stop /usr/bin/ss-tunnel
}

 
启用 shadowsocks随路由器开机自启动、重启 shadowsocks

/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks restart     #可能不一定管用,最好重启路由器

 
接下来需要修改DNS配置,请在配置文件 /etc/dnsmasq.conf 的末尾添加一行内容

...
#cname=bertand,bert
conf-dir=/etc/dnsmasq.d

 
下载博客作者每周更新的黑名单 dnsmasq_list.conf,重启dnsmasq服务

mkdir /etc/dnsmasq.d
cd /etc/dnsmasq.d
#opkg install wget     #如固件自带的wget不支持https协议,则需要升级
wget --no-check-certificate https://cokebar.info/wp-content/uploads/secured_files/dnsmasq_list.conf
/etc/init.d/dnsmasq restart     #重启dnsmasq服务

 
还要在自定义防火墙文件 /etc/firewall.user 里添加如下三行

ipset -N gfwlist iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080

注:端口号须和配置文件 /etc/shadowsocks.json 里的 local_port保持一致;另,修改完成后须执行命令 /etc/init.d/firewall restart 以重启防火墙

至此,路由器内网侧用户端的零设置智能分流翻WALL功能就可以生效了,即,用户端无需做任何设置,访问黑名单里的域名时会自动走代理,其他的仍走正常的上网通道。当然,用户端要确认一下获取的 DNS Server是否为路由器的LAN IP,同时可能还需要清空一下DNS缓存(比如 Win7可运行命令 ipconfig /flushdns)。

 

补充1:
如需自动更新博客作者提供的黑名单,可在路由器上新建一个脚本文件如 /root/gfwlistupdate.sh

#!/bin/sh
cd /root
rm dnsmasq_list.conf
wget --no-check-certificate https://cokebar.info/wp-content/uploads/secured_files/dnsmasq_list.conf

# exclude
sed -i '/.amazon.com/d' dnsmasq_list.conf     #排除黑名单里的域名,如有必要

cat gfwlist.custom dnsmasq_list.conf > /etc/dnsmasq.d/dnsmasq_list.conf #合并名单
sleep 5
/etc/init.d/dnsmasq restart

注:新建后需执行 chmod +x /root/gfwlistupdate.sh,以添加可执行属性。

以及自定义的黑名单 /root/gfwlist.custom

# the 1st one just for check
server=/.myipaddress.com/127.0.0.1#5353
ipset=/.myipaddress.com/gfwlist
# custom list
server=/.sample.com/127.0.0.1#5353
ipset=/.sample.com/gfwlist

### original from cokebar.info ###

注:myipaddress.com 加入黑名单是为了能和比如 ip.cn 做对比,以便能直观地检查智能分流是否生效了。

最后把该更新用脚本添加到定时任务 /etc/crontabs/root文件中

...
0 4 * * 1 /root/gfwlistupdate.sh     #每周一凌晨4点运行一次

 

 
补充2:
前面设置过的shadowsocks随路由器开机自启动的功能有时可能会失效,可以在 /etc/rc.local文件中添加两行

/etc/init.d/shadowsocks restart
sleep 5

 
还可以创建一个检查用脚本(以防shadowsocks进程意外被杀),如 /root/ssup.sh

#!/bin/sh

killall -0 ss-tunnel 2> /dev/null
if [ $? != 0 ]
then
logger \"$0: Starting ss-tunnel ...\"
/usr/bin/ss-tunnel -c /etc/shadowsocks.json -u -l 5353 -L 8.8.8.8:53 &
else
logger \"$0: ss-tunnel already running: $(pidof ss-tunnel)\"
fi

killall -0 ss-redir 2> /dev/null
if [ $? != 0 ]
then
logger \"$0: Starting ss-redir ...\"
/usr/bin/ss-redir -c /etc/shadowsocks.json -f /var/run/shadowsocks.pid &
else
logger \"$0: ss-redir already running: $(pidof ss-redir)\"
fi

注:同样需要执行 chmod +x /root/ssup.sh

然后把该脚本添加到定时任务 /etc/crontabs/root

...
2 */2 * * * /root/ssup.sh     #每两小时检查一次

 

 
2015.05.19 更新
升级shadowsocks客户端,比如目前最新版的2.2.1

opkg remove shadowsocks-libev
opkg install shadowsocks-libev_2.2.1-1_ar71xx.ipk

新版本shadowsocks的启动脚本文件 /etc/init.d/shadowsocks 多了一个绑定主机的参数

...
	service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
	service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l $TUNNEL_PORT -L $DNS
...
}

 
否则可能会出现监听端口未绑定在 0.0.0.0而是 127.0.0.1的情形(可用命令 netstat -apn | grep 1080 检查),后者会导致shadowsocks失效。

之前的版本可以通过在配置文件 /etc/shadowsocks.json 中指定 “local”参数来绑定0.0.0.0,但在新版本中似乎不管用了。

 
 

参考文章
https://cokebar.info/archives/962
 

24 / 6 = (必填)