搭建frp内网穿透

逆流者 2020年03月21日 151次浏览

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。

1、frp简介

github: https://github.com/fatedier/frp
官方文档: https://github.com/fatedier/frp/blob/master/README_zh.md
下载地址: https://github.com/fatedier/frp/releases

注意事项:

下载的部署包有不同的系统版本, 注意不要搞错, 这里做下简单区分:

以0.32.0版本64位为例:

  • frp_0.32.0_linux_amd64.tar.gz linux 注意是amd和arm,一般是用amd,arm是嵌入式的设备在用
  • frp_0.32.0_windows_amd64.zip windows
  • frp_0.32.0_darwin_amd64.tar.gz mac

也可以使用wget命令去下载, 下载不同版本请记得替换下版本号

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

如果你觉得下载比较慢,可以直接下载我上传的资源,需要一些积分哦,博主下载尝试了好多次才成功的😏。传送门

2、部署

部署分为服务端和客户端,先运行服务端
说下我使用的机器设备:
|类别 | 设备 |
|--|--|
| 服务端| 阿里云服务器ECS(CentOS 7.7 64位) |
| 客户端 | 树莓派3B+ |

简单说下,博主服务端用的阿里云服务器ECS ,这样你就有了一台有公网ip的机器,如果不是用公网的机器,那只能在局域网中访问了。
客户端用的树莓派3B+ 一个linux小主机,一直在吃灰,这次也算物尽其用了。
你可以选择你有的两台设备分别做服务端客户端做测试,windows、linux、mac 都可以

2.1 服务端

2.1.1 上传 frp_0.32.0_linux_amd64.tar.gz

# 解压
tar -zxvf frp_0.32.0_linux_amd64.tar.gz -C /usr/local
# 进入配置路径
cd /usr/local/frp/frp_0.32.0_linux_amd64

2.1.2 修改frps.ini配置文件

详细配置可以参考官方文档:https://github.com/fatedier/frp/blob/master/README_zh.md

下面博主自己的配置:

[common]
bind_port = 7000
vhost_http_port = 8080
authentication_method = token
# auth token
token = 123456

bind_port: 提供给客户端访问的端口
vhost_http_port: 服务端给用户访问的端口,这里可以配合使用域名,后面详细说明
authentication_method :使用token方式来验证客户端访问
token :自己定义一个随机数,客户端的token要和服务端token 保持一致,注意不要泄露,防止别人随意蹭服务端提供的服务

2.1.3. 启动

./frps -c ./frps.ini

上面直接启动,关闭连接窗口会关闭进程,可以后台运行

nohup ./frps -c ./frps.ini &

进阶:将服务端frps添加为service

进入/usr/local/frp/frp_0.32.0_linux_amd64/systemd 路径

cd /usr/local/frp/frp_0.32.0_linux_amd64/systemd

修改frps.service文件User=root 或者其他用户, 修改后表示运行此用户操作 frps
可以使用vim,比如:sudo vim frps.service,怎么使用vi和vim 修改文件,这里不做介绍,大家自行百度
修改后的文件为:

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

启动程序复制到/usr/bin 目录下,配置文件复制到/etc/frp 路径下,没有frp文件夹,自行创建

# 启动脚本复制到/usr/bin目录下
cp /usr/local/frp/frp_0.32.0_linux_amd64/frps /usr/bin
# 在/etc下新建frp文件夹
cd /etc
mkdir frp
# 复制配置文件
cp /usr/local/frp/frp_0.32.0_linux_amd64/frps.ini /etc/frp
# 复制frps.service 
cp /usr/local/frp/frp_0.32.0_linux_amd64/systemd/frps.service /etc/systemd/system

以上操作如没有权限, 请在命令前添加sudo,或者使用root用户(使用root用户一定要小心操作)

下面尝试使用systemctl来管理frps

# 启动
systemclt start frps
# 停止
systemclt stop frps
# 重启
systemctl restart frps
# 查看状态
systemctl status frps
# 开机启动
systemctl enable frps

2.1.4 测试

访问:http://公网ip:8080

注意: 服务端起来后就可以访问到页面, 这时候还没有客户端提供服务, 等客户端启动后, 就可以访问到具体服务。

2.1.5 其他

如果机器80端口可用的话,标题2.1.2的 vhost_http_port 也可以配置成80端口,这样就可以直接使用http://公网ip访问了。

如果80端口已经被占用了,我们我可以使用nginx来处理
在nginx配置中添加以下配置:

server {
    listen       80;
    server_name  frp.example.com;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8080;
    }
}

我们可以使用二级域名,直接访问 http://frp.example.com
访问的请求会自动转发到http://127.0.0.1:8080 上,这里博主的nginx和frp部署在一台机器上。

2.2 客户端

  1. 解压rp_0.32.0_linux_arm.tar.gz
  2. 修改frpc.ini配置
# frpc.ini
[common]
server_addr = 公网ip
server_port = 7000
token = 123456

[web]
type = http
local_port = 8081
custom_domains = 公网域名

server_addr:公网ip
server_port:服务端定义的端口
token:和服务端保持一致
local_port:8081 是客户端机器上提供被穿透的服务的端口,比如你运行了公众号的程序,端口是8081
custom_domains:公网域名

  1. 启动
./frpc -c ./frpc.ini

后台运行:

nohup ./frpc -c ./frpc.ini &