Frp 内网穿透

问题简述

在做 web 或其他开发时,前期的后端服务是建在本地的,因此我们一般使用 localhost 来对本地服务进行调用,但是如果你的另外一个小伙伴也要调用你的本地服务要怎么办呢?因为我们个人的电脑是不具备公网 IP 地址的,这个时候就要用到内网穿透

准备工作

使用内网穿透技术,需要准备的材料如下:

云服务器
它的作用是 “流量转发”,当地球某个角落的电脑对你的本地服务进行调用时,会先将请求发送到此服务器,然后服务器会转发到你的本地。

一个域名
这个并不是必须的,但是有它的话会更有牌面。如果他人调用你本地服务时,输入:XXXX.com 是不是会比 123.124.125.126 显得高级一些。而且有了域名,会更好记一些,4 个 3位数可能你要记好久才能记得住。

内网穿透工具
这个工具其实有很多,比较出名的有 花生壳、ngork、frp、natapp 等,百度一下就会找到很多堆这样的工具。我用过花生壳、natapp 和 frp,其实道理都是一样的,就是配置起来稍有些不同。

这里说明一点:natapp、花生壳可提供免费的隧道,就是按照它官网上的文档,下载一个 exe 可执行文件就可以实现此功能,不用像我们现在这样动手操作。但是免费的隧道有个不好的地方:它的域名是动态的,意味着你每次打开 exe 连接至它的主服务器时,分配给你的域名(二级域名)是随机的,因此不如自己配置的舒服一些。

下载穿透工具(frp)

下载地址

需要下载两份:windows 环境与 linux 环境各一份(客户端与服务端),一般情况下,选择 frp_x.xx.x_windows_amd64.zipfrp_x.xx.x_linux_amd64.tar.gz,如果你的电脑或云服务器不是 amd64 的,可以酌情选择其他的压缩包

此工具是免安装的,下载完毕后,解压缩即可。至于 linux 版的压缩包,可以使用如下命令:

tar -zxvf xxxxxx.tar.gz (xxxxxxx 替换为压缩包的名字)

修改配置文件

客户端文件配置( frpc.ini

[common]
server_addr = 
server_port = 
token = 

[web]
type = http
local_ip = 127.0.0.1
local_port = 
custom_domains =

说明:

server_addr ------- 云服务的公网 IP 地址(如 111.111.111.111)
server_port ------- 云服务的端口(如9277),记为 A
token ------------- 相当于密码,和服务端的配置保持一致(如:hfh238h)
local_ip ---------- 一般都是 127.0.0.1,不用修改
custom_domains -----前面讲到的域名,如果有的话就填上,没有就算了

服务端文件配置 (frps.ini)

bind_port = 9277
vhost_http_port = 5000
token = 

说明:

bind_port ---------- 服务开启时占用的端口(如9277),就是上面的 A
vhost_http_port ---- 要转发的端口(如5000)记为 B
token -------------- 和上面的 token 保持一致即可

开启端口

上面只是配置完了,如果没有开启防火墙的端口和云服务商的安全组,是不能访问的。

打开云服务商的 ECS实例管理,在安全组那里选择添加规则。如果你找不到,就在上面的搜索栏里搜索 “安全组” 就可以了。此次开启端口需要开启两个,即为上面的 A 和 B

不同云服务商的界面不一样,但是内容是相同的,需要填写的信息如下:
端口 9277-9277 (第二次添加时:5000-5000)
地址 0.0.0.0/0
描述 写一些描述,自己填写就行

命令行连接云服务器,开启防火墙端口,下面提供几条命令:

firewall-cmd --state       #查看防火墙状态
firewall-cmd --zone=public --add-port=80/tcp --permanent  #80替换成 A 或 B
firewall-cmd --reload        #重新加载
firewall-cmd --list-services  # 查看已开启的端口,用于检验 

开启服务

linux 服务端

# 建立系统服务
vim /lib/systemd/system/frps.service

# 然后粘贴一下内容,只需要把 ExecStart 那里的路径改一下(前后两个都改,-c 不动)
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/opt/frp_0.31.1_linux_amd64/frps -c /opt/frp_0.31.1_linux_amd64/frps.ini

[Install]
WantedBy=multi-user.target

#开启服务
systemctl start frps

windows 客户端

# 首先新建一个 bat 文件,如 华为云.bat
# 编辑 bat 文件为以下内容,rem 后面是输出的字符串,可以根据需要修改
# 双击 bat 即可开启服务
set exePath=frpc
set filePath=frpc1.ini
rem ===Connecting Remote Server===
%exePath% -c %filePath%
rem ===Connect Success !===
pause
exit
rem ===Bye Bye===

Tips

上面搭的环境并不是最舒服的,如果装了 nginx 的话,B 端口是不需要开启的,想象一下用 nginx 做反向代理,同时还可以配置 SSL 证书。