本文最后更新于 2023-09-04,文章内容可能已经过时。

frp 是啥?

具体可以看这里:https://gofrp.org/docs/concepts/

简单来说,大家如果不求甚解,只需要知道下面这些就行:

  • frp 是 fast reverse proxy 的缩写,是一个专注于内网穿透的高性能的反向代理应用

  • frp 项目的作者是中国人!

  • frp 支持 TCP、UDP、HTTP、HTTPS 等多种协议,可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

  • frp 是 go 语言写的,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。

  • frp 有服务端(frps,s 指 service,通常搭建在有公网 IP 的设备上)和客户端(frpc,c 指 client,通常搭建在内网设备上)

基本原理:frp 主要由 客户端 (frpc)服务端 (frps) 组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。

用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

frps搭建

服务器前期配置

升级 packages

sudo -i # 切换到 root 用户

apt update -y  # 升级 packages

apt install wget curl sudo vim git -y  # Debian 系统比较干净,安装常用的软件

安装 Docker 环境

安装 Docker(非大陆服务器)

wget -qO- get.docker.com | bash
docker -v  #查看 docker 版本
systemctl enable docker  # 设置开机自动启动

安装 Docker-compose(非大陆服务器)

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version  #查看 docker-compose 版本

安装 Docker(国内服务器)

curl -sSL https://get.daocloud.io/docker | sh
docker -v  #查看 docker 版本
systemctl enable docker  # 设置开机自动启动

安装 Docker-compose(国内服务器)

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.1.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version  #查看 docker-compose 版本

然后重启 Docker 服务:

systemctl restart docker


frp 服务端 Docker 环境安装

创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/frps

cd /root/data/docker_data/frps

这边 frp 其实不需要用 docker 安装,直接到 GitHub 上下载你系统对应的软件包解压就可以使用,不过配置后台自动运行会麻烦一些,这边为了简单起见,直接用 @snowdreamtech 编译好的 docker 镜像,采用 docker 的方式来安装 frp 的服务端和客户端,这样后台运行,重启啥的可能会更方便一些,配置也更简单一些。

源码安装可以参考 GitHub:https://github.com/fatedier/frp

cd /root/data/docker_data/frps

touch frps.ini

vim docker-compose.yml

英文输入法下,按 i

version: '3.3'
services:
    frps:
        restart: always
        network_mode: host
        volumes:
            - './frps.ini:/etc/frp/frps.ini'
        container_name: frps
        image: snowdreamtech/frps

按一下 esc,然后:wq 保存退出,之后,

docker-compose up -d 

Ok,这样我们就搭建好了 frp 的服务端了,不过,现在我们 frps.ini 里面啥也没有,需要我们来配置一下,这边贴一个配置文件给大家参考,满足基本使用。

我在服务段没有开启面板也没有其他过多的设置⬇️

cd /root/data/docker_data/frps

vim frps.ini
[common]
bind_port = 7000
token = oneisall #根据自己需求 明文密码 理论上越复杂越安全

然后粘贴上面的内容,之后在英文输入法下,按一下 esc,然后:wq 保存退出。

最后,重启一下 frps 服务即可。

docker-compose restart

接下来去云服务器打开防火墙。我将所有端口全部打开。

docker-compose 更新

cd /root/data/docker_data/frps

docker-compose down 

cp -r /root/data/docker_data/fprs /root/data/docker_data/frps.archive  # 其实就是备份一下frps.ini这个文件

docker-compose pull

docker-compose up -d 

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] 

输入 y

利用 Docker 搭建的应用,更新非常容易~

卸载 frp

docker stop frps

docker rm -f frps  # 停止容器,此时不会删除映射到本地的数据

rm -rf /root/data/docker_data/frps  # 完全删除映射到本地的数据

可以卸载得很干净。

frp 服务端 手动安装

frp软件下载 https://github.com/fatedier/frp/releases

ssh到服务器,(我使用的是FinalShell)

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

这里需要注意的是,看清版本名称不要下载错了。

我们也可以在本地下载完成之后手动上传到服务器 /root 目录下。

解压

tar -zxvf frp_0.51.3_linux_amd64.tar.gz

我们可以手动将文件名重命名为 frp 方便后续操作,在文件夹中打开修改 frps.ini ,

[common]
bind_port = 7000
token = oneisall

然后粘贴上面的内容,之后在英文输入法下,按一下 esc,然后:wq 保存退出。

cd frp
./frps -c frps.ini
frps tcp listen on 0.0.0.0:7000
start frps success #说明程序可以正常开启

开启自动后台运行

vi /lib/systemd/system/frps.service #服务器运行服务创建
Fprs服务命令:
[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target
 
[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini  #此处安实际情况修改
 
[Install]
WantedBy=multi-user.target
vi /lib/systemd/system/frpc.service #客户端运行服务创建
Fprc服务命令:
[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target
 
[Service]
Type=simple
ExecStart=/root/frp/frpc -c /root/frp/frpc.ini  #此处安实际情况修改
 
[Install]
WantedBy=multi-user.target

Docker HUB页面:https://hub.docker.com/r/chenhw2/frp

systemctl start frps
systemctl enable frps

重启,

ps auxw

检查 frps 进程是否已经自启成功。


安装 Nginx Proxy Manager

创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/npm

cd /root/data/docker_data/npm

这边我们直接用 docker 的方式安装。

vim docker-compose.yml

英文输入法下,按 i

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'  # 冒号左边可以改成自己服务器未被占用的端口
      - '81:81'  # 冒号左边可以改成自己服务器未被占用的端口
      - '443:443' # 冒号左边可以改成自己服务器未被占用的端口
    volumes:
      - ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
      - ./letsencrypt:/etc/letsencrypt  # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中

如果Vim 粘贴有缩进问题。可以 进入 paste 模式解决,命令如下:

:set paste

按一下 esc,然后 :wq 保存退出,之后,

cd /root/data/docker_data/npm   # 来到 dockercompose 文件所在的文件夹下

docker-compose up -d 

理论上我们就可以输入 http://ip:81 访问了。

注意:

1、不知道服务器 IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的 IP。

2、遇到访问不了的情况,请再次检查在宝塔面板的防火墙和服务商的后台防火墙是否打开对应了端口。

默认登陆名和密码:

Email:    admin@example.com
Password: changeme

更新 Nginx Proxy Manager

cd /root/data/docker_data/npm

docker-compose down 

cp -r /root/data/docker_data/npm /root/data/docker_data/npm.archive  # 万事先备份,以防万一

docker-compose pull

docker-compose up -d    # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] 

输入 y

利用 Docker 搭建的应用,更新非常容易~

卸载 Nginx Proxy Manager

cd /root/data/docker_data/npm

docker-compose down 

rm -rf /root/data/docker_data/npm  # 完全删除映射到本地的数据

可以卸载得很干净。

在NPM中设置二级域名,访问对象的目标地址为 服务器公网ip + frpc.ini 中设置的服务对象的 remote_port

🌰:

frpc.ini

[common]
server_addr = 8.8.8.8 #假设为服务器的ip地址
server_port = 7000
token = oneisall

[EG]
type = tcp
local_ip = 192.168.100.200
local_port = 3000
remote_port = 3300 # 可以通过 https://8.8.8.8:3000 访问位于本地 192.168.100.200:3000 的服务

将服务器的ip地址 8.8.8.8 解析到域名域名 *.oneisall.one

那么我们在NPM中的设置为:

https://one.oneisall.one(开启域名的泛解析并添加证书) -> 8.8.8.8:3300

当然,如果你只需要内网穿透:

我们将服务器的ip地址 8.8.8.8 解析到域名域名 oneisall.one

那么你可以通过 http://oneisall.one:3300 访问到 http://192.168.100.200:3000

至此,

我们是使用 frp服务 搭配 NPM 实现了(二级)域名不加端口号访问本地服务。

🎉