frp介绍

PS:以下所有操作均基于CentOS7环境

frp是一个内网穿透工具,你可以通过frp反向代理你的服务,以便你可以通过公网访问内网服务。frp采用的是C/S架构,将服务端部署在具有公网IP的机器上,客户端部署在内网或放火墙上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。frp支持TCP,UDP,HTTP,HTTP,SSH等多种协议,提供了加密、压缩、身份认证、代理限速、负载均衡等众多能力。其是用go语言编写的,具体源码可以访问github

frp安装

  1. 访问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
  1. 解压
$ cd /data
$ tar zxvf frp.tar.gz
  1. 切换到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主机使用的端口
  1. 服务端启动
$ ./frps -c frps.ini  #直接启动
$ nohup ./frps -c frps.ini > frps.log 2>&1 &  #后台启动,如果不想要日志文件,将frps.log替换为/dev/null
  1. 客户端配置
    打开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使用
  1. 客户端启动
$ ./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