Skip to content

Instantly share code, notes, and snippets.

@willwhui
Last active May 29, 2023 02:19
Show Gist options
  • Save willwhui/1febd37a3dd79a503cc8544c3bb18ece to your computer and use it in GitHub Desktop.
Save willwhui/1febd37a3dd79a503cc8544c3bb18ece to your computer and use it in GitHub Desktop.
在Openwrt中配置Openvpn客户端
@willwhui
Copy link
Author

willwhui commented Oct 18, 2017

如何配置网站分流

网上可以搜索到一些方法,但我是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命令,查看实时流量。访问视频网站,发现实时流量变大。
  • 为dnsmasq设置的免翻墙dns域名列表起作用么吗?
    经测试,不起作用。都被openvpn包了。

以上情况说明:最终的访问目标认为是ss服务器在访问它,而vpn确实在包裹这些流量。
综上可推断,vpn和ss同时起效的方式是这样的:

  1. 访问目标时,如果是dnsmasq配置的域名解析目标,解析请求流量先走进了ss tunnel
  2. 如果根据防火墙规则,解析的目标ip需要翻墙,数据请求流量也走进了ss tunnel
  3. tunnel将把流量引向远程ss服务器
  4. 此时vpn将其包装(因为tunnel指向的位置是一个ip地址,即ss服务器的ip地址),进入远程vpn服务器
  5. 远程vpn服务器将流量请求解包发送给ss服务器
  6. 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/

@huozhong-in
Copy link

安装和配置文件

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
最后,输入以下命令接入vpn

openvpn --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>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment