接着上面一篇介绍 Windscribe 免费 VPN 的文章,住处的网络通过 OpenVPN 连接 Windscribe 之后虽然速度不快,但好歹广电宽带下没有之前用的几个 VPS 经常超时的问题了。因此想着最好能部署到现在用的 newifi mini 路由器上(毕竟已经刷了 PandoraBox 固件),目标就是能在路由器上用 OpenVPN 连接 Windscribe 并自动分流翻墙访问某些特殊的网站。
OpenWRT 安装使用 OpenVPN
首先在路由器上安装 OpenVPN 客户端:
[root@PandoraBox:/root]# opkg update [root@PandoraBox:/root]# opkg install openvpn-openssl
把上篇文章中生成的 Windscribe OpenVPN 配置文件上传到 /etc/openvpn
目录,假设配置文件路径为 /etc/openvpn/windscribe.ovpn
。
这里需要注意 OpenWRT 的 OpenVPN 客户端并不能像 Windows 等客户端那样提示用户输入 Windscribe VPN 连接用户名和密码,只能通过用户密码文件指定。我们需要手工生成用户密码文件 /etc/openvpn/windscribe.txt
,文件格式为第一行用户名,第二行密码。
接着修改 OpenVPN 配置文件,增加一行指定用户密码文件:
auth-user-pass windscribe.txt
提示
如果你使用的 OpenVPN 客户端版本比较老(比如我的 PandoraBox 系统里安装的是 2.3.6-2 版本),可能不支持 Windscribe OpenVPN 配置文件里的
block-outside-dns
选项,如果 OpenVPN 运行报错的话可以注释掉这个选项。
然后修改 /etc/config/openvpn
配置文件增加一个新的 OpenVPN instance,新的配置名称不要与现有的重复即可:
config openvpn 'windscribe' option config '/etc/openvpn/windscribe.ovpn' option enabled '1'
剩下就是激活并启动 OpenVPN 客户端服务了:
[root@PandoraBox:/root]# /etc/init.d/openvpn enable [root@PandoraBox:/root]# /etc/init.d/openvpn start
稍等一会,如果一切正常的话,用 logread
命令应该能看到 OpenVPN 的连接日志:
[root@PandoraBox:/root]# logread -f Fri Jul 7 00:02:13 2017 daemon.notice openvpn(windscribe)[5618]: TUN/TAP device tun0 opened Fri Jul 7 00:02:13 2017 daemon.notice openvpn(windscribe)[5618]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0 Fri Jul 7 00:02:13 2017 daemon.notice openvpn(windscribe)[5618]: /sbin/ifconfig tun0 10.110.34.41 netmask 255.255.254.0 mtu 1500 broadcast 10.110.35.255 Fri Jul 7 00:02:13 2017 daemon.notice openvpn(windscribe)[5618]: Initialization Sequence Completed
连接上服务器之后可以看看 OpenVPN tun 设备路由信息:
[root@PandoraBox:/root]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.110.34.1 128.0.0.0 UG 0 0 0 tun0 0.0.0.0 10.58.71.1 0.0.0.0 UG 0 0 0 eth0.2 10.58.71.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.2 10.110.34.0 0.0.0.0 255.255.254.0 U 0 0 0 tun0 103.10.197.3 10.58.71.1 255.255.255.255 UGH 0 0 0 eth0.2 128.0.0.0 10.110.34.1 128.0.0.0 UG 0 0 0 tun0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan
dnsmasq 配置修改
与之前使用的 Shadowsocks 通过 ipset 自动分流类似,我们首先需要在 OpenWRT 上安装 dnsmasq-full
和 ipset
包。
基本原理也很简单,OpenWRT 上的 dnsmasq 服务器将 gfwlist 中的域名通过 OpenVPN 解析防止域名污染并将解析结果添加到 ipset,然后设置 ipset 中的所有 IP 地址都走 OpenVPN 翻墙,其它地址仍然走默认的宽带线路。
dnsmasq 使用 gfwlist 和 gfwlist 自动更新的方法可以参考我之前写的 newifi mini路由器OpenWRT初步体验 文章。
我的服务器上基于 gfwlist 自动生成的 dnsmasq 配置文件地址没有变:
https://zohead.com/downloads/dnsmasq.tar.gz
只是自动更新 gfwlist 的 crontab 配置文件要修改一下了,因为上面的 dnsmasq 配置文件是为 Shadowsocks 本地转发解析域名准备的,这里换成 Google 提供的 8.8.8.8
DNS 解析服务器:
[root@PandoraBox:/root]#cat /etc/crontabs/root 10 5 * * * curl -k -o /tmp/dnsmasq.tar.gz https://zohead.com/downloads/dnsmasq.tar.gz && tar -C /tmp -xzf /tmp/dnsmasq.tar.gz && sed -i 's/127\.0\.0\.1#5353$/8.8.8.8/g' /tmp/dnsmasq_list.conf && cat /tmp/dnsmasq_list.conf > /etc/dnsmasq.d/dnsmasq_list.conf && rm -f /tmp/dnsmasq.tar.gz /tmp/dnsmasq_list.conf
配置 ipset 自动分流
首先修改 /etc/iproute2/rt_tables
配置文件,为 OpenVPN 专门增加一个名字为 gfwtable
的路由表(数字不和现有的表重复即可):
99 gfwtable
需要注意的是我们可以从上面的 OpenVPN tun 设备路由信息中看到 OpenVPN 客户端连接上服务器之后自动添加了默认路由,而为了使默认流量都走宽带线路,需要修改 OpenVPN 配置文件禁用默认路由:
route-nopull
编辑 /etc/firewall.user
文件增加自定义的防火墙规则:
[root@PandoraBox:/root]# cat /etc/firewall.user ipset -N gfwlist iphash iptables -t mangle -N fwmark iptables -t mangle -C OUTPUT -j fwmark || iptables -t mangle -A OUTPUT -j fwmark iptables -t mangle -C PREROUTING -j fwmark || iptables -t mangle -A PREROUTING -j fwmark
分别简单解释一下:
- 第一行增加新的 iphash 类型的名为
gfwlist
的 ipset; - 第二行在 iptables 的
mangle
表中新增fwmark
链; - 第三和第四行分别在 iptables 的
mangle
表的OUTPUT
和PREROUTING
链中增加fwmark
target,为了避免重复,增加之前都用了 iptables 命令判断原有规则是否已经存在; - 后面三条规则有些 OpenWRT 系统里已经自带了,这里为了保险还是加上了。
接着还要再修改 Windscribe OpenVPN 配置文件,增加 VPN 的启动和停止脚本设置,因为我们要在脚本中 添加 / 删除 路由和 iptables 规则:
script-security 2 up /etc/openvpn/openvpn-up.sh down /etc/openvpn/openvpn-down.sh
当然别忘了给 OpenVPN 启动和停止脚本增加执行权限:
[root@PandoraBox:/root]#chmod +x /etc/openvpn/openvpn-up.sh /etc/openvpn/openvpn-down.sh
OpenVPN 调用启动和停止脚本的参数格式会区分 tun 和 tap 设备,对于 tun 设备脚本调用参数是这样的:
cmd tun_dev tun_mtu link_mtu ifconfig_local_ip ifconfig_remote_ip [ init | restart ]
tap 设备则是:
cmd tap_dev tap_mtu link_mtu ifconfig_local_ip ifconfig_netmask [ init | restart ]
这里我们只需要关心第一个 tun /tap 设备名参数,我的 OpenVPN 启动脚本如下:
[root@PandoraBox:/root]#cat /etc/openvpn/openvpn-up.sh #!/bin/sh ip route add 8.8.8.8 dev $1 iptables -t mangle -A fwmark -m set --match-set gfwlist dst -j MARK --set-mark 0xffff ip rule add fwmark 0xffff table gfwtable ip route add default dev $1 table gfwtable iptables -I FORWARD -o $1 -j ACCEPT iptables -t nat -I POSTROUTING -o $1 -j MASQUERADE
同样简单说明一下:
- 首先将
8.8.8.8
DNS 解析服务器设置为从 OpenVPN 走防止域名污染; - 使用 iptables
mangle
表中的fwmark
链为所有目标为 gfwlist ipset 中 IP 地址的数据包打标记,这里标记号用的是 0xffff; - 所有标记号为 0xffff 的数据包都使用上面新增的
gfwtable
路由表; gfwtable
路由表固定使用 OpenVPN 线路;- 最后两条 iptables 规则也非常重要,允许路由器下的其它设备访问被封锁域名时走 OpenVPN 线路。
类似的 OpenVPN 停止脚本就比较简单了:
[root@PandoraBox:/root]#cat /etc/openvpn/openvpn-down.sh #!/bin/sh ip rule del table gfwtable iptables -t mangle -D fwmark -m set --match-set gfwlist dst -j MARK --set-mark 0xffff iptables -D FORWARD -o $1 -j ACCEPT iptables -t nat -D POSTROUTING -o $1 -j MASQUERADE
都是清理启动脚本中增加的规则,ip route 项会在 tun 设备停止时自动删除,不需要手工进行清理了。
总结
经过这番对 OpenWRT 的配置折腾,现在住处的手机和电脑就都能通过 Windscribe OpenVPN 自动翻墙了。
最后贴上我的 newifi mini 路由器上的 Windscribe 完整 OpenVPN 配置文件给大家参考,由于文件比较长我放到 Pastebin 上了,最后祝大家炎炎夏日也能玩的开心:
你好,
请问:如果是全部流量都通过openvpn发出去和通过ipset分流进行对比一下,访问那list里的网站在访问速度上会不会有差别?意思就是通过iptables加ipset来筛选这些流量时会不会拖慢数据包的传输?毕竟list里有上千个域名需要筛选!
ipset 就是为了避免添加了太多 IP 规则导致性能受影响的问题而生的,默认使用 hash 来匹配尽量提高速度;
如果全部流量都从 OpenVPN 走的话,就会碰到访问国内网站走 VPN 反而速度更慢的问题了,特别是有些国内视频站不让国外 IP 访问,
另外我用 ipset 而不用直接的 国内/国外 IP 过滤规则,也是为了跳过能正常访问的多数国外网站。
楼主我最近有一个想法,netflix把大部分的vps地址都封了,于是我想用vpngate的免费openvpn来试试,结果发现大部分的公共vpn都可以用观看netflix。 我很好奇能不能在我的服务器端链接vpngate的公共vpn,同时把服务器端设置成$$R的代理,实现连接上了服务器的$$R就可以通过vpngate访问netflix,服务器除了Netflix.com走tun0,别的全部都走eth0。。这样会方便很多。
问题是我尝试了以后根本不管作用,不知道理论上可不可行,想请问下大佬。
我目前是这样做的。
openvpn使用的Github一个叫做vpngate-with-proxy的项目,进行简单修改加入了route-nopull和script-security 2 等命令,这样在它自动连接的时候会删除掉默认路由ssh就不会断了。
此外我把dnsmasq_list.conf这个文件修改成了server=/.netflix.com/127.0.0.1#5353
ipset=/.netflix.com/gfwlist 别的全部删除了。
遇到问题的是自定义防火墙规则和dnsmasq的设置。
防火墙问题:
我删除了iptables -t mangle -C OUTPUT -j fwmark 和iptables -t mangle -C PREROUTING -j fwmark
然后手动运行了剩下来的防火墙命令,并保存到了/etc/iptables.rules。以下是我的iptables.rules
# Generated by iptables-save v1.6.0 on Wed Jan 17 00:29:22 2018
*mangle
:PREROUTING ACCEPT [8:600]
:INPUT ACCEPT [8:600]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6:552]
:POSTROUTING ACCEPT [6:552]
:fwmark - [0:0]
-A PREROUTING -j fwmark
-A OUTPUT -j fwmark
COMMIT
# Completed on Wed Jan 17 00:29:22 2018
Dnsmasq问题
我在apt-get install dnsmasq之后完全不知道该怎么去编辑/etc/dnsmasq.conf这个文件,但我有一个刷机的老毛子固件里面有现成的配置文件,所以我想能不能把这个配置文件稍加修改后用进去。以下是路由器的dnsmasq配置文件
user=nobody
resolv-file=/etc/resolv.conf
no-poll
bogus-priv
no-negcache
clear-on-reload
bind-dynamic
interface=br0
listen-address=192.168.123.1
min-port=4096
cache-size=512
addn-hosts=/etc/storage/dnsmasq/hosts
servers-file=/tmp/dnsmasq.servers
domain=lan
expand-hosts
srv-host=_vlmcs._tcp.lan,Antonio.lan,1688,0,100
dhcp-range=set:lan,192.168.123.2,192.168.123.244,255.255.255.0,86400
dhcp-option=tag:lan,3,192.168.123.1
dhcp-option=tag:lan,6,192.168.123.1
dhcp-option=tag:lan,15,lan
quiet-dhcp
dhcp-hostsfile=/etc/dnsmasq/dhcp
dhcp-leasefile=/tmp/dnsmasq.leases
dhcp-authoritative
conf-file=/etc/storage/dnsmasq/dnsmasq.conf
conf-dir=/etc/storage/dnsmasq/dnsmasq.d
在我配置完后抱着碰运气的想法连上了$$R,发现只要是dnsmasq_list.conf里的域名就不能访问。别的都正常,我怀疑我dnsmasq就没生效,求大佬指点迷津。谢谢!(系统是ubuntu 16.04)
补充:这是我连接openvpn后的iptables
# Generated by iptables-save v1.6.0 on Wed Jan 17 15:52:22 2018
*nat
:PREROUTING ACCEPT [75:21933]
:INPUT ACCEPT [11:941]
:OUTPUT ACCEPT [4:348]
:POSTROUTING ACCEPT [4:348]
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
# Completed on Wed Jan 17 15:52:22 2018
# Generated by iptables-save v1.6.0 on Wed Jan 17 15:52:22 2018
*filter
:INPUT ACCEPT [421:132805]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [256:32015]
-A FORWARD -o tun0 -j ACCEPT
COMMIT
# Completed on Wed Jan 17 15:52:22 2018
# Generated by iptables-save v1.6.0 on Wed Jan 17 15:52:22 2018
*mangle
:PREROUTING ACCEPT [485:153797]
:INPUT ACCEPT [421:132805]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [256:32015]
:POSTROUTING ACCEPT [256:32015]
:fwmark - [0:0]
-A PREROUTING -j fwmark
-A OUTPUT -j fwmark
-A fwmark -m set --match-set gfwlist dst -j MARK --set-xmark 0xffff/0xffffffff
COMMIT
# Completed on Wed Jan 17 15:52:22 2018
/etc/iproute2/rt_tables
这个 什么。我的 openwrt 没有这个目录
要安装什么 ?
这个是文件,不是目录;
按说安装了 ip 包之后应该就有了的,
可以运行 opkg files ip 看看。
按照您的方法我一直是这样的提示
Mon Jun 4 16:57:08 2018 daemon.err openvpn(windscribe)[11977]: Options error: In [CMD-LINE]:1: Error opening configuration file: openvpn-windscribe.conf
Mon Jun 4 16:57:08 2018 daemon.warn openvpn(windscribe)[11977]: Use --help for more information.
Mon Jun 4 16:57:13 2018 daemon.err openvpn(windscribe)[11986]: Options error: In [CMD-LINE]:1: Error opening configuration file: openvpn-windscribe.conf
Mon Jun 4 16:57:13 2018 daemon.warn openvpn(windscribe)[11986]: Use --help for more information.
我的是付费版本,是否还需要添加证书这些的?
看起来像是 /etc/config/openvpn文
件里的配置文件路径不对哦,可以检查下。
昨天夜里又操作一遍,同时把路由器固件编译到最新,同时把openvpn直接编译进去,按照您给的顺序是可以操作到logread -f看到信息,但是浏览器无法翻墙,然后又重新按照您的方式重头再做就无法用logread -f看到信息了。
并且后面执行你的一些命令提示-asf not found。请问您有其他的非墙内即时联系方式吗?
不能翻墙要看看 openvpn 的 tun 连接是否正常,最主要 ipset 配的对不对,不行可以先试试启用 openvpn 的默认路由,看全局翻墙有没有问题。
我的 QQ: 397270153
昨天夜里又操作一遍,同时把路由器固件编译到最新,同时把openvpn直接编译进去,按照您给的顺序是可以操作到logread -f看到信息,但是浏览器无法翻墙,然后又重新按照您的方式重头再做就无法用logread -f看到信息了。
并且后面执行你的一些命令提示-asf not found。请问您有其他的非墙内即时联系方式吗?
加上
script-security 2
up /etc/openvpn/openvpn-up.sh
down /etc/openvpn/openvpn-down.sh
openvpn启动会报
WARNING: Failed running command (--up/--down): could not execute external program
不加的话openvpn可以正常启动。
请问是否知道是什么原因造成的。
是不是没有对这两个脚本做 chmod 增加执行权限的操作?
把脚本的权限修改为0777也不行
可以把 OpenVPN 配置文件里改成
script-security 2 system
看看是不是不报错了;如果实在不行那只能在 OpenWRT 里手工运行
/etc/openvpn/openvpn-up.sh
看有没有报错了。用dos2unix把脚本转一下就行了
请问如何禁止某个网段访问vpn出口
禁止连到路由器的机器?路由上划了多个内部子网这种么?
路由上划了多个内部子网这种
简单点可以把 iptables -t mangle -A fwmark 那的命令改一下,限制来源地址试试,只允许特定的网段。
路由上划了多个内部子网这种
ip rule add fwmark 0xffff table gfwtable我不确定内容是否进了gfwtable
ipset list gfwlist是有ip的
无法访问
ip rule add 之后可以用 ip rule list 命令确认是否添加成功了,
不使用 ipset 之类的配置,OpenVPN 全局走 VPN 是没问题的么?
可以看看
/etc/firewall.user
里配置的规则是不是都生效了ip route add default dev vpn-vwan table gfwtable
执行这句后表内的ip全部ping超时,包括dns
这个估计要看实际情况分析了,这条命令执行之前表内的 IP 地址都可以 ping 通?
要看是在路由器本身还是其它设备上 ping 的。
执行前面的
ip route add 8.8.8.8 dev vpn-vwan
命令的时候,ping 8.8.8.8 是通的么?
可以
ip rule list
、ip route list
确认看看,另外
ip route show table all
、ip route show table 99
也可以看看路由表对不对。非常感谢站长的分享,并且十分感谢您长期更新gfwlist,按照您的教程已经稳定运行大半年了!
很遗憾我对网络相关知识匮乏,我现在遇到了一个问题还没有解决,希望站长能给我一些建议。
我的网络是同时支持ipv4和ipv6的,但openvpn只支持ipv4,近期我在访问一些ipv6-only的网站遇到了一些障碍,这些网站并不需要vpn代理,当我开启vpn时,从openWRT路由器的命令行ping6命令时可以访问这些网站,但路由器下的其他设备似乎只能走到路由器这一步,无法出到网关(traceroute6检查似乎是这个样子)。
当我关闭vpn后(根据站长的教程,ip route也自动被删除)路由器下带的设备都可以正常访问这些网站了。
我尝试过把站长上面的命令中ip的命令全改成ip -4似乎不太行,openvpn配置文件中proto udp改成proto udp4似乎也没有作用。我目前觉得,因为我的路由器是可以直接访问到ipv6内容的,感觉不应该是openvpn配置屏蔽了ipv6访问,但我也不太确定该如何检查这个故障,站长是否有过类似的经验,该如何解决?
(我没有在评论起看到我的评论?我不知道是不是没发出去,如果重复抱歉删除)
不知道为啥被自动识别成垃圾评论了,我家里的宽带默认都把 IPv6 关了,所以没注意这个问题 -_-#
先看 IPv6 网站是否在 ipset 列表里,可以用
ipset list gfwlist
命令确认;另外
ip rule list
、ip route list
、ip route show table all
、ip route show table 99
这几个也确认一下。如果路由器上有 ip6tables 也可以看看 ip6tables 列表对不对。
PS:我咋记得 OpenVPN 已经支持 IPV6 了的,官网有介绍 IPv6 in OpenVPN。
感谢您的分享!我想问下,我在国外,想用国内节点的openvpn。如果我想让在gfw里的走vpn,不在的不走。这样的话要怎么修改文中的配置呢?谢谢!
文章里写的方式就是在
gfwlist
里的地址都走 VPN,其它的还是用默认线路哦。如果你想反过来访问国内网站走国内的 VPN,其它的还用国外默认线路,
可以考虑将国内的所有 IP 段设成走 VPN,这样访问国内就快一些,
还是修改
/etc/openvpn/openvpn-up.sh
脚本,添加类似:ip route add 218.0.0.0/7 dev $1
国内的 IP 段可以到网上找,都给加上就可以了。
大佬,openwrt现在发布了22.03版本,iptables被换成nft了。现在的教程无法在22.03上使用,尝试安装iptables-nft,但是还是不成功,可以出个22.03版本的教程吗?谢谢
最近一直在忙活项目没空理博客了,下面有时间了再升级到 22.03 修改试试。
22.03 系统无法安装
iptables-nft
么?我看了一下 ipset 应该是不能像 iptables 一样直接在 nftables 上使用的。
大佬有解决方法吗?我也是22.03的
大佬好,请问大佬,
script-security 2
up /etc/openvpn/openvpn-up.sh
down /etc/openvpn/openvpn-down.sh
这个脚本加在哪个文件里呢?我不懂的加!
看的蛮晕的,如果这几句没处理好,前面又有route-nopull这条在配置文件里,连接后,就所有网络访问不了了!!
谢谢!!
这几句是配置项不是脚本,放在 OpenVPN 里的具体配置文件里:
/etc/openvpn/XXX.ovpn
,这个是你具体用的 VPN 服务商提供的配置文件(或者自己生成,文章里举例的是我从 Windscribe 客户端里导出的配置文件)。
具体执行的脚本文件
/etc/openvpn/openvpn-up.sh
、/etc/openvpn/openvpn-down.sh
就放在对应的路径,增加执行权限就行。