赞同 3
分享

FRP服务实现内网穿透

简介:最近遇到一个问题,开发团队前端和后端在两个不同的内网(不是网段不一样,而是两个完全没有联系的网络),导致接口联调时非常不方便,多人开发时对同一服务器上文件实施修改会非常麻烦且不优雅(优雅永不过时)。
  2021.06.05
  Bug Man
  3
  153
  172.17.0.1
  中国.上海
 
 

内网穿透原理简介

两个毫无联系的内网无法访问对面的服务,但是可以访问相同的外网服务,此时就可以利用这个外网服务器做数据包的转发来实现访问。这样一来会有一个新的问题,公网服务器怎么定位内网需要转发的目标服务器,这里可以利用内网目标服务器主动发起连接的通道做数据包的转发以达到网络穿透的目的。

内网穿透原理模型

下载FRP

可以在GitHub仓库中选择合适版本、系统、架构的包,一定要选择带amd64的包,下面列出主流三大操作系统的包: https://github.com/fatedier/frp/releases/

linux: https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz

mac os:https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_darwin_amd64.tar.gz

windows:https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_windows_amd64.zip

linux通过wget下载包:

wget https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz

下载完后创建安装目录并解压到这个目录:

mkdir /etc/frp && tar -zxvf frp_0.37.0_linux_amd64.tar.gz -C /etc/frp
服务端客户端配置

修改服务端frps.ini配置文件,在frp包中有默认模板文件,使用下面内容即可满足启动要求:

[common]
bind_addr=0.0.0.0
bind_port=20001
dashboard_user=user
dashboard_pwd=password
dashboard_port=20002
tcp_mux=true
token=32303231-3036-3035-e6b5b7e5ae87e4bfa1e681af

修改客户端frpc.ini配置文件,在frp包中有默认模板文件,使用下面内容即可满足启动要求:

[common]
server_addr=remote_ip
server_port=20001
token=32303231-3036-3035-e6b5b7e5ae87e4bfa1e681af

[ssh]
type=tcp
local_ip=127.0.0.1
local_port=8001
remote_port=8001
启动测试

两端配置文件配置完成后可以开始启动服务测试是否能够穿透到内网,以下列命令为例。启动成功后,用 remote_ip remote_mapping_port 来访问本地对口,例如上面配置就访问:remote_ip:8001 。如果向映射多个端口用ip-ip或ip,ip的形式来映射多个端口。

服务端:

/etc/frp/frp_0.37.0_linux_amd64/frps -c /etc/frp/frps.ini

客户端:

frpc.exe -c frpc.ini
服务端设置系统启动方式

编辑服务文件,在frps的包里有一个systemd文件夹,文件夹下有服务端和客户端的模板,可以复制一份也可以直接更改。主要修改[Service]标识头下的ExecStart,也就是手动启动的命令。

vi /etc/frp/frp_0.37.0_linux_amd64/systemd/frps.service

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/etc/frp/frp_0.37.0_linux_amd64/frps -c /etc/frp/frps.ini

复制服务文件到系统控制路径下

cp /etc/frp/frp_0.37.0_linux_amd64/systemd/frps.service /lib/systemd/system/

查看是否能够通过systemctl查看到frps服务

systemctl status frps

● frps.service - Frp Server Service
     Loaded: loaded (/lib/systemd/system/frps.service; disabled; vendor preset: enabled)
     Active: inactive (dead)

启动 frps 服务

systemctl start frps

# 查看frps服务状态
systemctl status frps
● frps.service - Frp Server Service
     Loaded: loaded (/lib/systemd/system/frps.service; disabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-06-05 22:15:23 CST; 10s ago
   Main PID: 598806 (frps)
      Tasks: 4 (limit: 2274)
     Memory: 17.4M
     CGroup: /system.slice/frps.service
             └─598806 /etc/frp/frp_0.37.0_linux_amd64/frps -c /etc/frp/frps.ini

# 也可以用ps查看服务状态
ps aux | grep frps
nobody    598806  0.2  1.0 717060 21384 ?        Ssl  22:15   0:00 /etc/frp/frp_0.37.0_linux_amd64/frps -c /etc/frp/frps.ini

更多详细信息可以参考:frp翻译中文文档