-
-
Save willwhui/1febd37a3dd79a503cc8544c3bb18ece to your computer and use it in GitHub Desktop.
在Openwrt中配置Openvpn客户端 |
配置流量转发
找到几个方法配置:
1 、 https://github.com/martincai/blogs/blob/master/openwrt%2Bopenvpn%2Bazure.md
参照它的openwrt配置部分进行
配置完成之后,还是不能走vpn(这部分我不是很懂,不知道是教程有疏漏,还是当时网络状态不好)。
总之仔细检查发现我的路由器的General Settings的Zones部分,有一个input还是foward参数需要手动调整得和教程一致。
然后好了。
研究了一下,应该是这个原理:
- 建立一个interface:MYVPN
- 建立一个防火墙转发规则Zone:VPNFOWRD,应用在MYVPN上。
- VPNFWRD的左边(流量来源)是interfacce lan,右边(流量出口)是interface wan
最后根据下面的方法3进行了配置
2、 https://www.ifshow.com/openwrt-install-openvpn-client/
其中4.配置iptables,应该是起到类似1的作用,不懂。
因为已经按照1的教程配置了,又不太懂这两种会不会有冲突,所以没有按照2的方法进行配置。
3、https://segmentfault.com/a/1190000004172000
仅参考其中防火墙配置部分即可。
但是,貌似结合ss使用时并不需要这样配置,也可以正常工作(不确定)
启动/重启/停止OpenVPN
标准的做法应该是这样的:
/etc/init.d/openvpn start
/etc/init.d/openvpn restart
/etc/init.d/openvpn stop
但是不知为何这样不能正确设定和加载配置文件,只好放弃。
改为openvpn --cd /etc/openvpn --config /etc/openvpn/jcz-client.ovpn
命令的方式接入vpn(通过在/etc/rc.local中增加这句命令可以开机自启动),并采用如下命令来终止
sudo killall -SIGINT openvpn
或
sudo killall openvpn
参见https://openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html
如何配置网站分流
网上可以搜索到一些方法,但我是vpn+ss一起,怎么搞?还不知道。
几个问题先搞清楚,也许有帮助:
-
为什么除了路由器,其他客户端的ping功能都是失效了
PING baidu.com (111.13.101.208) 56(84) bytes of data.
From OpenWrt.lan (192.168.1.1) icmp_seq=1 Destination Port Unreachable
原因未知,莫非是墙也不准从外向内访问了? -
opewwrt 设置的vpn和ss同时起效了吗?
- ss起效了:
- 查看ss服务器的流量:产生了预期的流量
- 查看国外ip定位网站whoer.net:显示ss服务器地址
- 查看国内ip定位网站ip.cn:显示ss服务器地址
- 查看国内ip定位网站ip138.com:不可访问(如同其他网站一样,被禁止回墙?)
- vpn起效了:
- 查看vpn所在服务器的流量消耗情况:确实走了
安装vnstat,运行vnstat -l
命令,查看实时流量。访问视频网站,发现实时流量变大。
- 查看vpn所在服务器的流量消耗情况:确实走了
- ss起效了:
-
为dnsmasq设置的免翻墙dns域名列表起作用么吗?
经测试,不起作用。都被openvpn包了。
以上情况说明:最终的访问目标认为是ss服务器在访问它,而vpn确实在包裹这些流量。
综上可推断,vpn和ss同时起效的方式是这样的:
- 访问目标时,如果是dnsmasq配置的域名解析目标,解析请求流量先走进了ss tunnel
- 如果根据防火墙规则,解析的目标ip需要翻墙,数据请求流量也走进了ss tunnel
- tunnel将把流量引向远程ss服务器
- 此时vpn将其包装(因为tunnel指向的位置是一个ip地址,即ss服务器的ip地址),进入远程vpn服务器
- 远程vpn服务器将流量请求解包发送给ss服务器
- ss服务器将流量解包,发起对目标的访问
(另,显然,如果访问目标不是需要翻墙,则不走ss-tunnel,直接被vpn包装,从vpn的服务器发起对目标的访问)
可见dnsmasq和防火墙设置,是优先级较高的动作。
因此,改进的方式是:vpn仅接管流向ss服务器ip的流量,因为这样就已经包住了所有的翻墙流量。
搜索后找到了解法:
http://liwenhn.blog.51cto.com/854522/1845253
- 在vpn服务端修改配置文件
sudo vi /etc/openvpn/server.conf
- 注释掉其中的
push "redirect-gateway def1"
如果是按照之前的教程做的服务端,可能在末尾有这样一行。配置文件中部也有一行同样的,需要都确保注释。
这一行的意思是:客户端流量全都转发(这里有个问题:那么前面配置的客户端防火墙转发有意义吗?) - 找到配置文件中的
;push "route 192.168.20.0 255.255.255.0"
这两行注释
将它们取消注释,并改成这样
- 注释掉其中的
push "route xxx.xxx.xxx.xxx 255.255.255.255"
push "route yyy.yyy.yyy.yyy 255.255.255.255"
其中xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy是自己的ss服务器的地址
这两句的意思是:我们只转发往这两个地址走的流量
- 重启vpn服务器端
sudo service openvpn restart
- 本地openwrt配置中关闭防火墙里面vpn相关的转发规则
- 重启openwrt客户端的vpn客户端
成功了
路由器里面/etc/dnsmasq.d/的配置文件中指定不要走ss的域名都可以快速访问了
有时间可以测试一下:
在dnsmasq中把一个需要翻墙的网址设定为不必出去解析。
应该会导致这个网址被ss和vpn略过,而无法访问。
其他方法参见如下,没试过:
https://blog.sorz.org/p/openwrt-outwall/
https://zohead.com/archives/openwrt-openvpn-ipset/
安装和配置文件
ssh [email protected] 到路由器,开始安装
# 更新源,如果被屏蔽了,更新不了,就要想办法在局域网里面搭建一个源 opkg update # 安装以下2个包中的一个,装的上哪个装哪个 # opkg install openvpn-openssl # opkg install openvpn-polarssl # 我装了openvpn-polarssl opkg install openvpn-polarssl
然后:
# 创建配置文件 vi /etc/openvpn/my-vpn.ovpn
并将以下内容贴入:
dev tun proto udp remote xxx.xxx.xxx.xxx yyyy <---这里的xxx.xxx.xxx.xxx是open vpn服务器的域名或地址,yyyy是端口号 resolv-retry infinite nobind persist-key persist-tun ca /etc/openvpn/ca.crt cert /etc/openvpn/client.crt key /etc/openvpn/client.key ns-cert-type server comp-lzo verb 3 sndbuf 0 rcvbuf 0 mute 20
然后从open vpn的服务器上获取ca.crt, client.crt, client.key,放入路由器的/etc/openvpn目录中
获取方式参考https://github.com/martincai/blogs/blob/master/openwrt%2Bopenvpn%2Bazure.md
最后,输入以下命令接入vpnopenvpn --cd /etc/openvpn --config /etc/openvpn/my-client.ovpn &
针对有用户名密码验证的openvpn server:
openvpn --cd /etc/openvpn --config /etc/openvpn/my-client.ovpn --auth-user-pass userpass.txt &
其中userpass.txt的内容为:
<username>
<password>
安装和配置文件
ssh [email protected] 到路由器,开始安装
然后:
并将以下内容贴入:
然后从open vpn的服务器上获取ca.crt, client.crt, client.key,放入路由器的/etc/openvpn目录中
获取方式参考https://github.com/martincai/blogs/blob/master/openwrt%2Bopenvpn%2Bazure.md
最后,输入以下命令接入vpn