在OpenWrt上安装ShadowVPN并实现按域名分流

安装所需软件包

ShadowVPN for OpenWrt 官方下载地址: https://github.com/clowwindy/ShadowVPN/releases

配置 dnsmasq 和 ipset

为了防止 DNS 污染和把被认证域名对应的 IP 存放到 ipset 中,我们要把需要通过代理访问的站点域名交由 dnsmasq 处理,域名列表可以自己收集也可以从 gfwlist 导出,最简单的方法就是使用 gfwlist2pac ,从生成的 pac 文件中提取出域名列表再进行加工即可用于 dnsmasq

首先使用 ipset 新建一个名为 redir 的 set 用于存放列表中的域名对应的 IP,将以下命令加入开机启动项中

修改 /etc/dnsmasq.conf 在最后加入 conf-dir=/etc/dnsmasq.d ,新建并进入目录 /etc/dnsmasq.d ,新建一个名为 redir.conf 的配置文件,内容如下:

完整的由 gfwlist 生成的域名配置文件从 这里 下载

由于我们要让符合条件的域名走 VPN,所以需要使用 iptables 给这些数据包打上值为200的标记,只让带有标记的数据走 VPN,将以下命令加入到防火墙自定义规则中

配置路由表

向路由表中增加一个名为 redir 的 table 用于存放需要走 VPN 的路由规则

配置ShadowVPN

这里以pppoe连接为例,修改 /etc/shadowvpn/client.conf 填入你的服务器ip, port, 和密码。修改  /etc/shadowvpn/client_up.sh 将 iptables 部分中的 eth0 改为 pppoe-wan,将最后的 change routing table 部分全部注释掉,增加  ip route add default dev $intf table redir , ip rule add fwmark 200 table redir 两行,以便将符合规则的域名数据路由到 VPN,最终看起来应该是这样的:

修改  /etc/shadowvpn/client_down.sh 同理将 iptables 部分中的 eth0 改为 pppoe-wan,route table 部分改为  ip rule del table redir 以解除重定向,最终看起来应该是这样的:

将 ShadowVPN 设为开机自启

重启路由器后就可以看到效果了。

 

参考资料: 
https://github.com/lifetyper/FreeRouter_V2/blob/master/FreeRouterV2_HandBook.pdf
https://github.com/clowwindy/ShadowVPN/wiki

23 thoughts on “在OpenWrt上安装ShadowVPN并实现按域名分流

  1. Hi, I’m trying to set up a VPN connection so that ONLY hulu.com goes through the VPN and everything else goes through normally (WITHOUT VPN).

    Is this similar to what you’re doing?

  2. 博主,我的OpenWrt是双线(电信,移动),『将 iptables 部分中的 eth0 改为 pppoe-wan』这个时候该如何填?
    2.首先使用 ipset 新建一个名为 redir 的 set 用于存放列表中的域名对应的 IP,将以下命令加入开机启动项中
    ipset create redir iphash 这个是直接填入启动项 『启动脚本插入到’exit 0’之前即可随系统启动运行』这里?
    3.『iptables -t mangle -A PREROUTING -m set –match-set redir dst -j MARK –set-mark 200』这个是填入firewall.user
    4.『echo “200 redir” >> /etc/iproute2/rt_tables』,这个是咋弄,直接putty输入

      1. 我的eth0.2是电信。eth0.3是移动,任意填一个?可是我一般早上用电信翻墙速度快,晚上移动翻墙速度快,这不能合并双WAN负载均衡翻墙吗

  3. 我的网络环境是这样,第一个TP-Link路由器连接电信的猫ADSL, 第二个路由器OpenWRT + ShadowVPN, 跟着上面的教程,traceroute twitter.com 死活不走10.7.0.1,有没有应该改的地方?

    1. 作为二级路由的话推荐使用官方wiki中的图形界面配置,否则就容易出现无法正确配置路由表的状况,也可以把 client_up.sh 中的自动检测当前网关并保存的语句改为实际的上级路由ip,不让它自动检测,启动后看路由表有无异常,还有异常的话微调 client_up.sh 中的语句即可

  4. 当opkg install 的时候出现了以下错误;
    kmod: failed to insert /lib/modules/3.10.49/ip_set.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_bitmap_ip.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_bitmap_ipmac.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_bitmap_port.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_hash_ip.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_hash_ipport.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_hash_ipportip.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_hash_ipportnet.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_hash_net.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_hash_netiface.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_hash_netport.ko
    kmod: failed to insert /lib/modules/3.10.49/ip_set_list_set.ko
    kmod: failed to insert /lib/modules/3.10.49/xt_set.ko

    ipset create redir iphash 的时候:
    ipset v6.20.1: Cannot open session to kernel.

    难道只有我遇到了吗?

      1. 谢谢,还有一个问题,还有一个不明白的地方是下载下来的Black_list.conf 文件放哪里?

  5. 请教一下,我访问twitter,浏览器一直在等待abs.twimg.com的响应,但我看配置文件里面有twimg.com啊,这要怎么解决?

    1. 现在twitter 和 instagram这两个网站不能访问,其它比如facebook和youtube都正常,请问要怎么解决?

      1. 另外再请教下,如果想让某一个网站走VPN,是不是按配置文件里面的格式加起就行了?

发表评论

电子邮件地址不会被公开。 必填项已用*标注