Openwrt路由器上配置shadowsocks透明代理+gfwlist(PAC)

Shadowsocks 服务推荐:Just My Socks

推荐理由:价格便宜,支持月付,安全灵活。

本文配置的前提是已经有shadowsocks服务。你可以通过购买或者自行搭建的方式获得。以下是链接:


本文所使用的环境,仅作参考:
  • OpenWrt 18.06.1/LuCI openwrt-18.06
整体思路:
DNS部分:
if 访问地址在gfwlist中
    DNS请求转发到127.0.0.1:5353的dns-forwarder的监听端口
    dns-forwarder转发到8.8.8.8进行解析
    8.8.8.8在gfwlist中,通过匹配iptables规则转发到1080端口
    ss-redir监听1080端口,通过shadowsocks代理服务器转发请求
else
    正常使用公共DNS或者ISP提供的DNS服务器

其他数据:
if 访问地址在gfwlist中
    通过匹配iptables规则转发到1080端口
    ss-redir监听1080端口,通过shadowsocks代理服务器转发请求
else
    正常访问

步骤1:依赖包安装(非常重要
本文所有的操作都基于SSH和Web管理界面操作。
首先通过SSH添加GPG Key,这样之后添加的源才能通过签名验证:
wget http://openwrt-dist.sourceforge.net/packages/openwrt-dist.pub -O /tmp/openwrt-dist.pub
opkg-key add /tmp/openwrt-dist.pub
然后在OpenWRT Web管理界面,“系统”>“软件包”>“配置”中,“自定义feeds”最后添加两行源:
src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/base/mips_24kc
src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/luci
注意:红底橙色斜体字部分需要替换为自己路由器的cpu指令集。可以通过命令‘opkg print-architecture’查看。

然后'opkg update'更新软件列表。(有时候因为墙内网络的特殊性,可能会失败,多试几次即可。如果一直抽风,请找一台可以翻墙的机器,手动下载下文提到的所有ipk软件包,然后scp上传到路由器,再手动安装。)
'opkg update'完成后,便可开始安装软件包。
opkg install shadowsocks-libev-ss-local
opkg install shadowsocks-libev-ss-redir
opkg install shadowsocks-libev-ss-tunnel
opkg install ip ipset libpthread iptables-mod-tproxy
opkg install dns-forwarder luci-app-dns-forwarder
opkg install zlib
opkg remove dnsmasq && opkg install dnsmasq-full
最后dnsmasq-full安装非常重要,否则dhcp服务和dns服务都将不能使用,dnsmasq.d下配置的脚本也将不能识别,从而导致dnsmasq出错,路由器将不能联网和正常dns解析,切记dnsmasq-full必须安装成功。

步骤2: 配置shadowsocks
'/root/'路径下新建一个shadowsocks文件夹,然后进入该文件夹,新建一个json配置文件,我们这里以'vultr.json'为例,你可以使用其他名字,只要和后文中引用的路径一致即可。
cd /root/
mkdir shadowsocks
vim vultr.json

在'vultr.json'中输入如下内容:

{
    "server":"1.1.1.1",
    "server_port":"1234",
    "password":"passwordpassword",
    "local_port":"1080",
    "method":"aes-128-gcm",
    "fast_open":true,
}
以上内容请根据自己的shadowsocks服务修改,其中:
  • server: Shadowsocks服务器ip
  • server_port: Shadowsocks服务器端口
  • password: Shdowsocks服务密码
  • local_port: 本地服务提供端口,可以不改
  • method: 加密方式
  • fast_open:tcp快速打开,与下文tcp快速打开设置相对应,也可以删除该项,不设置快速打开。
'/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=/root/shadowsocks/vultr.json

start() {
# Proxy Mode
service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
}

stop() {
# Proxy Mode
service_stop /usr/bin/ss-redir
}

保存后,为该文件增加执行权限:
chmod +x /etc/init.d/shadowsocks

然后配置为开机启动:
/etc/init.d/shadowsocks enable

启动服务:
/etc/init.d/shadowsocks start

看一下是否启动成功:
netstat -lnp | grep ss-redir

如果成功,应当能看到类似如下字样:

tcp        0      0 0.0.0.0:1080            0.0.0.0:*               LISTEN      1493/ss-redir
开启TCP fastopen(需要系统内核版本大于3.7,内核版本可使用'uname -r'命令查看)。在'/etc/sysctl.conf'文件中找到'net.ipv4.tcp_fastopen'并设置为'3',如果找不到该字段,则直接在文件末尾添加一行:
net.ipv4.tcp_fastopen = 3

然后使修改生效:
sysctl -p
/etc/init.d/shadowsocks restart

步骤3:配置dnsmasq和ipset
在OpenWRT Web管理界面中,选择“网络”>“防火墙”>“自定义规则”,添加如下内容。其中1080端口和shadowsocks配置文件中的local_port相对应,请根据实际情况修改。
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
ip6tables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080

ip6tables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
ipset add gfwlist 8.8.8.8
(ip6tables用以设置ipv6的代理逻辑,因为如今ipv6流量同样会被GFW干扰)

然后配置dnsmasq,请务必注意,此时dnsmasq-full必须已经安装
新建/etc/dnsmasq.d目录,然后使用如下命令,将该路径加入配置:
uci add_list dhcp.@dnsmasq[0].confdir=/etc/dnsmasq.d
uci commit dhcp

验证下是否成功:
uci get dhcp.@dnsmasq[0].confdir

注意:对于OpenWRT版本(非LEDE版)需要尝试在/etc/dnsmasq.conf最后加一行'conf-dir=/etc/dnsmasq.d'. 

最后,添加gfwlist对应的配置文件,此处要感谢cokebar提供的脚本和文件。
下载 dnsmasq_gfwlist_ipset.conf,然后放入/etc/dnsmasq.d目录。另外cokebar还提供了自动生成脚本https://github.com/cokebar/gfwlist2dnsmasq ,但是在使用该脚本时,需要安装一些依赖包,具体在以上github链接中,已经给出详细说明,此处就不再赘述。
我们可以通过新建一个脚本,加入crontab,从而自动获取最新gfwlist,并配置服务。以下脚本仅供参考,部分参数可能需要根据你的实际情况调整。
#!/bin/sh

if [ -f /root/dnsmasq_gfwlist_ipset.conf ]; then
    echo "Deleting old dnsmasq_gfwlist_ipset.conf..."
    rm /root/dnsmasq_gfwlist_ipset.conf
    echo "Deleted"
fi

/root/gfwlist2dnsmasq.sh -s gfwlist -o /root/dnsmasq_gfwlist_ipset.conf
echo "Moving dnsmasq_gfwlist_ipset.conf to /etc/dnsmasq.d"
mv /root/dnsmasq_gfwlist_ipset.conf /etc/dnsmasq.d/dnsmasq_gfwlist_ipset.conf
echo "Restarting the dnsmasq service..."

/etc/init.d/dnsmasq restart


步骤4:DNS配置
为了防止DNS污染,我们需要将一些被墙的网站,通过代理进行DNS解析。
在OpenWRT Web管理页面中,选择“服务”>“DNS转发”,然后:
  • 勾选“启用”
  • “监听端口”填写5353,注意,此处的端口号需要与dnsmasq_gfwlist_ipset.conf配置文件中的端口号相对应,配置文件中默认是5353
  • “监听地址”填写127.0.0.1
  • “上游DNS”填写8.8.8.8
修改完毕后,保存并应用。

然后在WAN口配置中(“网络”>“接口”>“WAN”选项卡>“高级设置”):
  • 取消“使用端局通告的DNS服务器”
  • 在“使用自定义的DNS服务器”中填写127.0.0.1
修改完成后,保存并应用。

最后,在“网络”>“DHCP/DNS”页面中:
  • “DNS转发”中填写你ISP的DNS,或者公共DNS,比如114.114.114.114。

到这里配置就完成了,你可以测试下是否可以直接连上路由,访问谷歌或油管。如果不能,重启下路由器,并清空下你电脑的DNS缓存。

其他说明
*在配置完shadowsocks后,可以使用ss-local工具测试下shadowsocks是否配置正确:
ss-local -c /root/shadowsocks/vultr.json -b <你的路由器IP> -l 1081
如果没有返回错误,再在你的浏览器的代理服务器设置中,设置下socks v5代理,ip就是你的路由器IP,端口1081. 设置完成之后,访问baidu.com,搜索ip,搜索结果第一栏会显示你的ip归属地,看看是不是你的shadowsocks代理服务器对应的ip和地区。

*如有其他问题,欢迎留言讨论


评论

  1. 博主你好,配置到:
    在OpenWRT Web管理页面中,选择“服务”>“DNS转发”,

    这步的时候,点击DNS转发时,会出现这个错误:
    Failed to execute cbi dispatcher target for entry '/admin/services/dns-forwarder'.
    The called action terminated with an exception:
    /usr/lib/lua/luci/dispatcher.lua:938: module 'luci.cbi' not found:
    no field package.preload['luci.cbi']
    no file './luci/cbi.lua'
    no file '/usr/share/lua/luci/cbi.lua'
    no file '/usr/share/lua/luci/cbi/init.lua'
    no file '/usr/lib/lua/luci/cbi.lua'
    no file '/usr/lib/lua/luci/cbi/init.lua'
    no file './luci/cbi.so'
    no file '/usr/lib/lua/luci/cbi.so'
    no file '/usr/lib/lua/loadall.so'
    no file './luci.so'
    no file '/usr/lib/lua/luci.so'
    no file '/usr/lib/lua/loadall.so'
    stack traceback:
    [C]: in function 'require'
    /usr/lib/lua/luci/dispatcher.lua:938: in function

    回复删除
    回复
    1. 我opkg install luci-compat了一下,上面的问题就可以了,感谢博主

      删除
  2. 步骤2: 配置shadowsocks中,
    1.可以配置域名么?
    2.加密方式支持aes-256-gcm么?
    第一条,是justmysocks推荐的配置,如果IP被封了,会自动更换IP
    第二条,是justmysocks自动配置,无法更改呀。

    回复删除
    回复
    1. 1. 可以使用域名
      2. 可以支持aes-256-gcm

      删除
  3. gfwlist可以手动修改吗?我只需要特定网站走ssr

    回复删除
  4. 感谢您的分享,通过上述配置,我成功实现了透明代理。但是目前仍有一个问题,希望能得到您的帮助。
    按照上述方法配置透明代理后,我的 win7 笔记本连上 LAN 口可以访问google,手机通过热点连接后同样可以访问,但是 win10 主机连上相同的 LAN 口后无法访问 。已按照网上的方法在 cmd 里通过 ipconfig /flushdns 命令清空 DNS ,同时win10主机的代理设置已确认关闭,仍然无法解决。
    根据您的经验,您认为可能是哪里的问题。感谢您用宝贵的时间为我们指引方向。

    回复删除
  5. 我照你的教程做的,基本上ok,就是telegram连不上,不知道怎么回事,其它的如discord 都行。已经确认节点没有问题。

    回复删除
    回复
    1. 参考如下链接就行:https://bbs.misstar.com/?thread-12.htm&sort=desc
      测试方法有效,重启后依旧正常使用telegram,这里给出详细步骤 修改/etc/misstar/applications/ss/script/ss
      在 start_ss_rules_gfwlist函数中加入

      ipset add gfwlist 91.108.4.0/22
      ipset add gfwlist 91.108.56.0/22
      ipset add gfwlist 149.154.160.0/20
      ipset add gfwlist 149.154.164.0/22

      路由器重启也能自动生效

      删除

发表评论

此博客中的热门博文

Configure shadowsocks transparent proxy + gfwlist(PAC) on OpenWRT Router

Using Haproxy + shadowsocks (ha + ss) to setup multi ss backend and load balance