frp介绍
PS:以下所有操作均基于CentOS7环境
frp是一个内网穿透工具,你可以通过frp反向代理你的服务,以便你可以通过公网访问内网服务。frp采用的是C/S架构,将服务端部署在具有公网IP的机器上,客户端部署在内网或放火墙上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。frp支持TCP,UDP,HTTP,HTTP,SSH等多种协议,提供了加密、压缩、身份认证、代理限速、负载均衡等众多能力。其是用go语言编写的,具体源码可以访问github
frp安装
- 访问Release,下载最新的frp安装包。
$ wget https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_amd64.tar.gz -O /data/frp.tar.gz
- 解压
$ cd /data
$ tar zxvf frp.tar.gz
- 切换到frp文件目录
$ mv frp_0.37.1_linux_amd64 frp
$ cd frp
PS:frp的服务要部署两端,服务端部署在公网,客户端部署在内网
4. 服务端配置
服务端的配置文件是frps.ini
$ vim frps.ini
打开frps.ini配置文件,添加以下配置
[common]
bind_port = 10000 #服务端连接客户端的端口
dashboard_port = 10001 #服务端仪表板面板的端口
token = <token> #服务端连接客户端的口令
dashboard_user = admin #仪表板页面登录的用户名
dashboard_pwd = <pwd> #仪表板页面登录的密码
vhost_http_port = 8000 #HTTP主机使用的端口
vhost_https_port = 8443 #HTTPS主机使用的端口
- 服务端启动
$ ./frps -c frps.ini #直接启动
$ nohup ./frps -c frps.ini > frps.log 2>&1 & #后台启动,如果不想要日志文件,将frps.log替换为/dev/null
- 客户端配置
打开frpc.ini配置文件,添加以下配置
[common]
server_addr = <server_ip> #服务端地址
server_port = 10000 #服务端监听端口
[ssh]
type = tcp #协议类型
local_ip = 127.0.0.1 #本地地址
local_port = 22 #地址服务端口
remote_port = 6000 #远程连接代理端口
[http]
type = http #协议类型
local_ip = 127.0.0.1 #本地地址
local_port = 10001 #本地服务端口
custom_domains = <domain> #通过该域名访问,可配合nginx使用
- 客户端启动
$ ./frpc -c frpc.ini #直接启动
$ nohup ./frpc -c frpc.ini > frpc.log 2>&1 & #后台启动,如果不想要日志文件,将frpc.log替换为/dev/null
启动脚本
为方便服务自动和关闭,编写此脚本。
#!/bin/bash
#frpc为客户端服务名称,如果是服务端,将frpc改为frps即可
#客户端
SERVICE_NAME=frpc
#服务端
#SERVICE_NAME=frps
usage() {
echo "Usage: sh ctl.sh [start|stop|restart|status]"
exit 1
}
is_exist() {
pid=`ps -ef | grep $SERVICE_NAME | grep -v grep | awk '{print $2}'`
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
start() {
is_exist
if [ $? -eq 0 ]; then
echo "$SERVICE_NAME is already running. pid=${pid}"
else
nohup /data/frp/frpc -c /data/frp/frpc.ini > /data/frp/frpc.log 2>&1 &
#服务端
#nohup /data/frp/frps -c /data/frp/frps.ini > /data/frp/frps.log 2>&1 &
fi
}
stop() {
is_exist
if [ $? -eq 0 ]; then
kill -9 "${pid}"
else
echo "$SERVICE_NAME is not running."
fi
}
status() {
is_exist
if [ $? -eq 0 ];then
echo "$SERVICE_NAME is running. pid is ${pid}"
else
echo "$SERVICE_NAME is not running."
fi
}
restart() {
stop
sleep 5
start
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
服务自启动
鉴于有时候服务器断电重启,需要在机器重启时启动frp服务。可以通过systemd添加服务自启动脚本实现。
服务端
在/usr/lib/systemd/system目录下创建frps.service文件。
$ cd /usr/lib/systemd/system
$ touch frps.service #此步骤可省略
$ vim frps.service
打开frps.service文件,输入以下内容
[Unit] #启动顺序和依赖关系
Description=frps #服务描述
After=network.target #在network.target之后启动
Wants=network.target #依赖,表示frps服务依赖network.target服务,此依赖是弱依赖,即network.target服务启动失败后,frps服务依然可以启动
[Service] #启动行为
Restart=on-failure #非正常退出时(退出状态码非0)重启
RestartSec=5 #systemd重启服务前,需要等待的秒数
ExecStart=/data/frp/frpc -c /data/frp/frpc.ini #启动执行脚本
[Install] #定义如何安装此文件,即怎么做到开机启动
WantedBy=multi-user.target #放入multi-user组中,根据multi-user.target启动
重新加载systemd服务
$ systemctl daemon-reload
设置开机启动
$ systemctl enable frps.service
启动服务
$ systemctl start frps.service
关闭服务
$ systemctl stop frps.service
查看服务状态
$ systemctl status frps.service
关闭开机启动
$ systemctl disable frps.service
客户端
在/usr/lib/systemd/system目录下创建frpc.service文件。
$ cd /usr/lib/systemd/system
$ touch frpc.service #此步骤可省略
$ vim frpc.service
打开frpc.service文件,输入以下内容
[Unit] #启动顺序和依赖关系
Description=frpc #服务描述
After=network.target #在network.target之后启动
Wants=network.target #依赖,表示frpc服务依赖network.target服务,此依赖是弱依赖,即network.target服务启动失败后,frpc服务依然可以启动
[Service] #启动行为
Restart=on-failure #非正常退出时(退出状态码非0)重启
RestartSec=5 #systemd重启服务前,需要等待的秒数
ExecStart=/data/frp/frpc -c /data/frp/frpc.ini #启动执行脚本
[Install] #定义如何安装此文件,即怎么做到开机启动
WantedBy=multi-user.target #放入multi-user组中,根据multi-user.target启动
重新加载systemd服务
$ systemctl daemon-reload
设置开机启动
$ systemctl enable frpc.service
启动服务
$ systemctl start frpc.service
关闭服务
$ systemctl stop frpc.service
查看服务状态
$ systemctl status frpc.service
关闭开机启动
$ systemctl disable frpc.service