内网穿透,即NAT穿透,网络链接时术语,计算机是局域网内时,外网与内网的计算机节点须要链接通讯,有时就会出现不支持内网穿透。——来自百度百科。html
简单来讲,就是让互联网(外网)的设备能访问局域网(内网)的设备提供的服务,这里的设备一般是电脑。linux
对开发人员来讲,一个典型的应用场景就是针对第三方受权(一般是oauth2.0)和支付回调的开发调试。经过内网穿透工具将第三方SDK的回调地址映射到本机开发环境,从而实现实时调式。git
其次是节约部署成本(一般是公网服务器费用)。经过将应用部署在本机,再利用内网穿透工具对外提供服务,这样就能,既节约服务器租用费用,又能提高服务器的硬件配置。github
本文适用于第一种状况,即低频率开发调式用。web
这是一个国外的穿透工具,1.0版本是开源的,目前2.0以上版本已经闭源,而且提供免费和收费的服务。windows
这是一个国内的开源工具,目前最新版本为0.26.0,有比较详尽的中文文档,而且一直在维护更新。浏览器
因为frp一直开源,而且维护积极、更新频繁,再加上中文文档加持,本文最终选择了frp做为搭建工具。安全
注:frp自主搭建须要一个有公网ip的服务器,本文使用阿里云ECS。服务器
官方github release地址,目前最新版本是0.26.0网络
本文服务器系统为CentOS7 64位,选择了frp_0.26.0_linux_adm64.tar.gz;本机系统为Mac OS X,因而选择了frp_0.26.0_darwin_amd64.tar.gz。
一、直接点击连接,使用浏览器下载到本机。利用ssh工具链接到阿里云ECS,再使用lrzsz工具的rz命令将frp_0.26.0_linux_amd64.tar.gz上传到服务器,而压缩包frp_0.26.0_darwin_amd64.tar.gz直接在本机解压。
注:ssh工具、lrzsz实用工具的安装和用法可自行搜索。
二、终端命令方式
2.一、服务器
使用wget下载
wget https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_linux_amd64.tar.gz
解压
tar -xzvf frp_0.26.0_linux_amd64.tar.gz
2.二、本机
使用curl下载
curl -O https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_darwin_amd64.tar.gz
解压
tar -xzvf frp_0.26.0_darwin_amd64.tar.gz
每一个压缩包解压后都包含如下文件和一个systemd文件夹:
注:服务端只需用到frp_0.26.0_linux_amd64目录下的frps相关文件,本机(客户端)只需用到frp_0.26.0_darwin_amd64目录下的frpc相关文件。
一、在服务器上打开frps.ini:
vi frps.ini
注:确保当前已进入工做目录/root/frp_0.26.0_linux_amd64/。
二、配置frps要监听的端口:按下i进入编辑模式,在末尾增长一行:vhost_http_port = 8080,使frps.ini最终配置以下:
[common] bind_port = 7000 vhost_http_port = 8080
注:vhost_http_port监听的端口不能被占用,不然会致使frps不能启动,端口可根据实际须要修改;bind_port端口为frp服务端和客户端链接通讯的端口,默认为7000。
三、保存配置并退出:按下Esc,输入:wq。
四、启动frps程序:
./frps -c ./frps.ini
注:如遇permission denied错误,代表frps可能没有运行权限,则先赋权:
chmod 700 frps
而后再次执行启动命令。
一、在本机进入frp_0.26.0_darwin_amd64目录,打开frpc.ini文件;
二、以配置访问内网的web服务(常见情形)为例,最终修改frpc.ini以下:
[common] server_addr = x.x.x.x server_port = 7000 [web] type = http local_ip = 127.0.0.1 local_port = 3000
注:x.x.x.x为运行frps的服务器公网ip,local_port为本机启动web服务对应的端口,请根据实际状况修改。
三、启动frpc程序:
sudo ./frpc -c ./frpc.ini
注:此时frpc会经过7000端口尝试与frps创建通讯链接,若是一切顺利,则终端会提示链接成功;但实际状况却显示链接失败,由于还少了两个步骤:
1、须要登陆阿里云控制台将7000端口加入阿里云ECS安全组的入站规则里面,同理还需将8080端口加入。具体操做参考:添加安全组规则;
2、将7000和8080加入服务器防火墙规则,具体操做参考:CentOS7使用firewalld打开关闭防火墙与端口。
当一切就绪,frpc启动并链接成功后,打开浏览器输入http://x.x.x.x:8080就能访问到本机http://127.0.0.1:3000的服务(固然本机web服务须要处于启动状态)。
至此,一个最简配置的基于frp的内网穿透便搭建完成,更多配置和用法,请参考官方文档:frp官方中文文档。
经过上面在终端直接启动frps的方式,会占用终端,而且中止和重启等管理操做也不方便。
为了方便管理frps的启动、中止、重启和开机自启,咱们须要将frps添加为系统service,经过systemd守护程序来管理。
在frp_0.26.0_linux_amd64目录里的systemd目录下,已经为咱们准备好了添加service的模板:
一、进入目录/root/frp_0.26.0_linux_amd64/systemd,编辑frps.service:
cd /root/frp_0.26.0_linux_amd64/systemd vi frps.service
二、将user=nobody改成user=root,并保存;
注:root表示运行frps的用户。
三、其中服务运行配置项为:ExecStart=/usr/bin/frps -c /etc/frp/frps.ini,咱们须要将二进制文件frps复制或移动到到/usr/bin目录,配置文件frps.ini复制或移动到/etc/frp目录,而/etc/frp目录不存在,须要手动建立一个。
3.一、复制frps到/usr/bin目录:
cp ~root/frp_0.26.0_linux_amd64/frps /usr/bin
3.二、建立frp目录,并复制frps.ini到/etc/frp目录:
cd /etc mkdir frp cp ~root/frp_0.26.0_linux_amd64/frps.ini /etc/frp
四、将frps.service移动到/etc/systemd/system目录:
mv ~root/frp_0.26.0_linux_amd64/systemd/frps.service /etc/systemd/system
五、完成以上步骤,咱们就能够愉快使用systemctl管理frps了:
启动frps:
systemclt start frps
中止frps:
systemclt stop frps
重启frps:
systemctl restart frps
查看frps状态:
systemctl status frps
开机启动frps:
systemctl enable frps
一样地本机也能够经过这种方式将客户端程序frpc添加为service进行管理,不一样的是Mac OS使用的是launchd而非systemd来管理,具体操做方法请自行搜索,但若是仅仅是做为开发调试的低频使用目的,仿佛没有必要将客户端添加到frpc,毕竟终端一条启动命令就能够搞定。更多实战经验分享请参考:个人我的博客