需求背景
大家在家办公的时候需要挂公司的VPN才可以连接到公司内网进行办公,那么假如一些同学的家里也搭建有一些开发环境或者复杂的网络环境是不是也会有出门在外想连接VPN回家的这种使用场景的需求呢?本文就教大家如何解决此问题
相关科普
- FRP:https://github.com/fatedier/frp
frp是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透
上一段摘自Github简介,简单来说这个开源软件做的事情就是内网穿透,其实简单的内网访问需求,直接利用FRP或者网关路由器的端口映射就可以实现了,但是复杂的环境单纯使用FRP或者端口映射十分不方便,这里我们仅用到FRP的4层协议,也就是tcp和udp。 - L2TP:一种Internet隧道协议,功能大致和PPTP协议类似。不同之处,PPTP要求网络为IP网络,L2TP要求面向数据包的点对点连接;PPTP使用单一隧道,L2TP使用多隧道;L2TP提供包头压缩、隧道验证,而PPTP不支持。
上面这一段摘自百度并做了适当删减,同时也说明了为啥选用L2TP而不选用PPTP(虽然本文没有使用IPSec) - PPP:点对点协议(Point to Point Protocol)
- ESXi:服务器虚拟化系统,VMWare出品
基本环境
- 公网Server:
阿里云Centos7,主要是提供公网IP,用来跑FRP服务端,也可以配合SLB去使用 - 局域网Server:
这里我选中Centos7,运行在局域网内的系统,用来跑FRP客户端和VPN相关软件,可以选用家用服务器虚拟化出来的VPS,也可以选用低成本的树莓派或者其他国产派,也可以选用闲置家用电脑,不太推荐最后一个,噪音大还费电。需要安装软件如下
xl2tpd-1.3.8-3.el7.x86_64
ppp-2.4.5-33.el7.x86_64
open-vm-tools-10.2.5-3.el7.x86_64 (如果是ESXi虚拟化出来的VPS,没有vmtools,网络性能会差一些) - 局域网ServerIP地址:192.168.3.11(这个自行规划即可,最好是在路由器上做Mac地址的静态IP绑定。也可以自己再做一层子网)
- 连接VPN的设备分配的IP地址网段:192.168.5.x
安装基础软件
1 2 3 |
yum install epel-release.noarch yum install -y xl2tpd yum install -y ppp |
需要替换/usr/sbin/xl2tpd为附件提供版本,epel这个版本有bug会导致连接失败
打开linux系统的nat端口转发
echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。
配置firewalld的snat转发
编辑/etc/firewalld/direct.xml文件如下
1 2 3 4 |
<?xml version="1.0" encoding="utf-8"?> <direct> <passthrough ipv="ipv4">-t nat -A POSTROUTING -s 192.168.5.0/24 -j SNAT --to-source 192.168.3.11</passthrough> </direct> |
注意192.168.5.0/24这个可以改为除了192.168.3.0/24和192.168.1.0/24的其他网段(因为家里光猫网段是192.168.1.x,光猫下路由器网段是192.168.3.x),如果更改的话其他配套ip也要一致
打开linux系统的udp1701入口防火墙和混杂模式
编辑/etc/firewalld/zones/public.xml文件如下
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <port protocol="udp" port="1701"/> <masquerade/> </zone> |
注意需要增加倒数2、3两行配置缺一不可,默认只有ssh和dhcpv6
修改xl2tpd主配置文件
编辑/etc/xl2tpd/xl2tpd.conf文件如下
1 2 |
[global] |
[lns default]
ip range = 192.168.5.100-192.168.5.253 local ip = 192.168.5.254 require chap = yes refuse pap = yes require authentication = yes name = LinuxVPNserver ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd length bit = yes
ip range是连接到vpn的设备由dhcp分配的ip地址范围
local ip是成功安装ppp之后系统创建的ppp0虚拟网卡的ip
修改xl2tpd选项配置文件
编辑/etc/ppp/options.xl2tpd文件如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ipcp-accept-local ipcp-accept-remote ms-dns 114.114.114.114 ms-dns 223.6.6.6 noccp auth crtscts idle 1800 mtu 1356 mru 1356 nodefaultroute debug lock proxyarp connect-delay 5000 |
dns根据情况自行修改,是联通可以改成联通的dns
配置l2tp连接账号密码
一共4列,第一列是账户名称、第二列是服务写即可本机也没有什么其他服务使用ppp验证、第三列是密码,最后一列是获取IP,如果写就是从192.168.5.100-253之间DHCP获取一个,也可以写死范围在192.168.5.2——192.168.5.253之间
编辑/etc/ppp/chap-secrets文件如下
1 2 3 |
#Secrets for authentication using CHAP #client server secret IP addresses Jasper * mima * |
设置自动启动
1 2 3 |
systemctl enable firewalld.service systemctl enable xl2tpd.service systemctl enable vmtoolsd.service |
reboot重启系统使相关配置生效
局域网测试
使用Mac电脑进行测试,因为服务端没有安装配置ipsec,所以Mac电脑需要配置不使用ipsec
编辑/etc/ppp/options文件如下
1 2 |
plugin L2TP.ppp l2tpnoipsec |
在Mac系统上连接局域网WIFI,网络配置新增VPN,类型为L2TP,服务器地址暂时写内网服务器IP,配置好用户名密码后,高级配置里勾选通过VPN发送所有流量,之后保存设置,进行连接测试。如图连接成功后则说明内网VPN服务器配置成功
FRP网络穿透配置
之前的步骤已经确保了VPN服务器搭建成功,接下来我们要做的是利用阿里云的公网服务器和FRP做内网穿透,结合搭建好的VPN来实现外网环境下回家。
局域网VPN服务器:
下载FRP最新版本的linux_amd64.tar.gz release包
解压缩tar xzvf frp_0.23.3_linux_amd64.tar.gz
编写frpc配置文件如下
1 2 3 4 5 |
[common] server_addr = 阿里云或者是SLB的IP/域名 server_port = 阿里云frps的bind_port端口号 token = 阿里云frps的token口令 |
[l2tp]
type = udp local_ip = 127.0.0.1 local_port = 1701 remote_port = 1701
使用nohup ./frpc -c frpc_full.ini &命令启动frpc,也可以安装Supervisor来做frpc的进程管理及保活
阿里云服务器:
下载FRP最新版本的linux_amd64.tar.gz release包
解压缩tar xzvf frp_0.23.3_linux_amd64.tar.gz
编写frps配置文件如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[common] bind_addr = 0.0.0.0 bind_port = 7000 bind_udp_port = 7001 kcp_bind_port = 7000 vhost_http_port = 7000 vhost_https_port = 7000 log_file = ./frps.log log_level = info log_max_days = 3 token = &gaUjrEo3FMNu7xxxxxxxxxxxx heartbeat_timeout = 90 allow_ports = 2000-3000,3001,3003,4000-50000 max_pool_count = 5 max_ports_per_client = 0 authentication_timeout = 900 |
使用nohup ./frps -c frps_full.ini &命令启动frps,也可以安装Supervisor来做frps的进程管理及保活
frp配置文件可配置的参数有很多,具体可以自行看Github上的开源文档,这里不做过多介绍,完成这一步,内网穿透就已经做好了,登录frp的后台面板就可以看见一条穿透如图
如果阿里云ECS前面加了SLB的话,SLB做1701端口到ECS1701端口的UDP转发即可
域名解析、HTTPS配置、SLB配置等这里就不做过多描述了
测试方法
1、先用手机4g分享个人热点给mac本子
2、把电脑里vpn配置的服务端ip改成阿里云ecs的公网IP或域名并测试连接,这时候如果不通要么就是frp穿透问题,要么就是ecs的安全组udp 1701没有开放对
可以看见电脑连接手机热点的时候,挂上我们刚刚搭建的VPN,依旧可以回到家里的局域网下,本教程到此结束