一 概述

本文致力于解决以下痛点:

  1. 希望能够远程登录在办公室的电脑主机(Windows下可以使用向日葵,但Linux没什么好方法)
  2. 希望能够将办公室电脑主机上的服务发布在互联网上以实现随时随地访问,或通过域名直接访问
  3. 希望能直接使用公网IP登录到办公室电脑主机内的docker容器,以方便在外地登录使用

Frp是一种内网穿透技术,可以将内网服务器上的一个端口映射到一台公网服务器的某端口上,基于此特性,可以很好的解决以上这些痛点

二 准备

  1. 一台公网服务器,假设该服务器的IP为:66.66.66.66;并在控制台上放开该服务器的部分端口,如22,80,443,7000,7001
  2. 一个域名,并指向该公网服务器,具体做法为:在控制台上添加A解析,解析地址为66.66.66.66
  3. 一台能联网的电脑

做完这些准备后,首先需要在公网服务器上安装配置服务端,然后在需要做穿透的电脑上安装配置客户端

FRP官方文档:https://gofrp.org/docs/
FRP历史各版本文档:https://www.bookstack.cn/read/frp/spilt.2.spilt.3.README_zh.md
(官方文档很简洁明了,但是少了很多对FRP功能的叙述,可以先按照官方文档进行基本的安装。配置文件热更新等高级功能建议参考历史版本文档)

三 配置 Frp

FRP官方文档:https://gofrp.org/docs/
FRP历史各版本文档:https://www.bookstack.cn/read/frp/spilt.2.spilt.3.README_zh.md
(官方文档很简洁明了,但是少了很多对FRP功能的叙述,可以先按照官方文档进行基本的安装。配置文件热更新等高级功能建议参考历史版本文档)

3.1 公网服务器上的服务端

3.1.1 安装Frp

以root身份登录到公网服务器上,安装Frp的服务端,Frp的安装包可以前往github自行下载:https://github.com/fatedier/frp/releases 也可以通过AheadAI的公共资源站进行下载:

# 进入root目录
cd /root
# 获取 Frp 安装包
wget https://mirrors.aheadai.cn/pkgs/frp_0.48.0_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.48.0_linux_amd64.tar.gz
# 重命名文件夹
mv frp_0.48.0_linux_amd64 frps
# 进入解压后的文件夹
cd frps

Frp 无需进行编译,只需要修改配置文件即可。在进入解压目录后,找到 frps.ini文件,修改配置如下:

[common]
 # 默认为 7000 端口,且这个 7000 端口需要在公网服务器的安全组中打开
bind_port = 7000
# frpc Client客户端连接Frps服务端时的token 为了安全,务必要添加且尽可能复杂
token = xxxxxxxxxxxx

# web端管理控制面板相关配置【可选,不过建议打开以实现Frp流量监控和配置热重载等效果】
dashboard_port = 7500
dashboard_user = username
dashboard_pwd = password

# 需要穿透 http 的统一访问端口(http类型的内网穿透,必须设置vhost_http_port,并且所有的http类型的客户端都将通过同一个vhost_http_port访问)
vhost_http_port = 7001
# https的访问端口(如果需要的话)
# vhost_https_port = 7443

修改完毕后,保存文件并退出,启动frps

./frps -c ./frps.ini

如果没有报错,说明启动正常,可以按下Ctrl+C停止服务并使用systemctl来将Frp添加为守护进程以方便管理

3.1.2 配置守护进程

使用文本编辑器,如 vim 创建并编辑 frps.service 文件。

vim /etc/systemd/system/frps.service

写入以下内容:

[Unit]
# 服务名称,可自定义
Description = frps
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /root/frps/frps -c /root/frps/frps.ini

[Install]
WantedBy = multi-user.target

然后保存退出,可以使用systemctl命令管理frp了

# 重新加载systemctl的守护进程
systemctl daemon-load 
# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps
# 配置Frp开机自启
systemctl enable frps

如果报错说没有systemctl 命令,则说明需要安装,使用apt或yum安装即可

# apt 的安装命令
apt install systemd
# yum 的安装命令
yum install systemd

3.2 内网电脑上的客户端

3.2.1 安装Frp

如果内网电脑是 Linux 操作系统,则使用与服务端相同的frp压缩包即可,如果是Windows电脑,则获取后缀为zip的压缩包文件,或在AheadAI的公共资源站上进行下载:https://mirrors.aheadai.cn/pkgs/frp_0.48.0_windows_amd64.zip

先介绍内网电脑是Linux的情况:

# 进入root目录
cd /root
# 获取 Frp 安装包
wget https://mirrors.aheadai.cn/pkgs/frp_0.48.0_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.48.0_linux_amd64.tar.gz
# 重命名文件夹
mv frp_0.48.0_linux_amd64 frpc
# 进入解压后的文件夹
cd frpc

在进入解压目录后,找到 frpc.ini文件,修改配置如下:

[common]
server_addr = 66.66.66.66 # 公网服务器的IP地址
server_port = 7000 # frps.ini文件中填写的端口
token = xxxxxxxxxx # 填写与frps.ini文件中一样的token
admin_addr = 127.0.0.1 # 启用 admin 端口,用于提供 API 服务,可以用于客户端配置文件热加载
admin_port = 7400 # adnin 具体端口

# 如果想要直接 ssh 到内网服务器上,需进行以下配置
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6666
# 进行以上配置后,即可通过 ssh root@66.66.66.66 -p 6666  命令登陆到内网服务器

注意:server_port, remote_port 这些端口需要在公网服务器的防火墙中放开

  • 如果内网电脑是Windows,那么首先下载Windows的frp安装包:https://mirrors.aheadai.cn/pkgs/frp_0.48.0_windows_amd64.zip

    解压后,右下角Windows一般都会提示说有病毒,可以将frp的解压后的目录添加到白名单中防止误杀

    找到 frpc.ini 这个配置文件,形式与Linux中的相同\

    打开cmd,进入frp所在的文件夹,cmd一般都在C盘打开,如果读者是解压在C盘以外的盘,如D盘,E盘,则首先需要切换盘符再cd到目录,如下:image-20241105112237626

3.2.2 配置守护进程

此步骤与服务端的守护进程步骤相同,首先创建守护进程文件:

使用文本编辑器,如 vim 创建并编辑 frpc.service 文件。

vim /etc/systemd/system/frpc.service

写入以下内容:

[Unit]
# 服务名称,可自定义
Description = frpc
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /root/frpc/frpc -c /root/frpc/frpc.ini

[Install]
WantedBy = multi-user.target

然后保存退出,可以使用systemctl命令管理frp了

# 重新加载systemctl的守护进程
systemctl daemon-load 
# 启动frp
systemctl start frpc
# 停止frp
systemctl stop frpc
# 重启frp
systemctl restart frpc
# 查看frp状态
systemctl status frpc
# 配置Frp开机自启
systemctl enable frpc

如果报错说没有systemctl 命令,则说明需要安装,使用apt或yum安装即可

# apt 的安装命令
apt install systemd
# yum 的安装命令
yum install systemd

3.2.3 配置免密登录

内网服务器需要启动ssh,使用server status sshd命令查看ssh服务是否已经开启,若未开启或显示无sshd服务,则说明需要安装ssh:

yum install openssh-server -y
service sshd restart

如果要使用vscode连接和使用服务器上的资源,经常会需要输入密码,可以通过下面的方式更方便的配置免密

先下载gitbash:https://github.com/git-for-windows/git/releases/download/v2.43.0.windows.1/Git-2.43.0-64-bit.exe

打开后,执行命令:ssh-keygen -t rsa 在本机上生成一个密钥,命令执行过程中会需要一些输入,直接回车即可。

然后执行ssh-copy-id user@66.66.66.66即可,66.66.66.66 是服务器的公网IP。假如服务器的ssh端口不是22,则使用: ssh-copy-id -p 端口号 user@1.2.3.4 命令

3.3 防止 Frp 掉线

如果内网服务器所处的网路环境出现波动,比如偶尔会出现断网的情况,那么frpc就会中断,状态会变成failed,此时其实需要要重启frpc其实就可以了,但是这样做很麻烦,能不能直接实现网络恢复后,frpc也自动恢复呢,为了解决这个问题,笔者编写了一个脚本用于自动监测frpc的状态并自动尝试重连

# 获取脚本
wget -P /root https://mirrors.aheadai.cn/scripts/check_frpc.sh
# 赋予可执行权限
chmod +x /root/check_frpc.sh
# 下载守护进程脚本
wget -P /usr/lib/systemd/system https://mirrors.qiql.net/script/check_frpc.service
# 重载守护进程服务
systemctl daemon-reload
# 启动Frp监听
systemctl start check_frpc.service
# 检查Frp服务状态
systemctl status check_frpc.service
# 将Frp监听服务添加到开机自启中
systemctl enable check_frpc.service
# 检查log
tial -f /root/log

3.4 转发内网服务

假如在内网服务器上启动了一个web服务或http服务,希望通过域名的方式直接进行访问(假设域名为xxxxxx.com),可以参考以下步骤:

3.4.1 配置 https 证书

本小节以阿里云为例,在阿里云控制台上搜索数字证书,进入该控制台选项

image-20241107195213723

然后点击左侧的SSL证书管理,点击个人测试证书(原免费证书),点击立即购买

image-20241107195422441

然后点击创建证书,填写自己的域名并提交审核

image-20241107195628762

审核完成之后,点击更多

image-20241107200040426

点击下载,点击Nginx类型证书右侧的下载

image-20241107200121641

3.4.2 安装Nginx

首先,需要在公网服务器上安装Nginx,用于接收http请求,假设安装至/usr/local/nginx/目录

# 获取nginx安装包
wget https://mirrors.aheadai.cn/pkgs/nginx-1.23.0.tar.gz

# 解压
tar -zxvf nginx-1.23.0.tar.gz 

cd nginx-1.23.0
# 安装必要的依赖【centos操作系统】
sudo yum -y install pcre-devel
sudo yum -y install openssl-devel

# 进行配置,--prefix是指定安装路径,--with-http_ssl_module 是使得Nginx支持https
./configure --prefix=/usr/local/nginx --with-http_ssl_module

# 编译Nginx -j 默认使用机器上所有的核心,-j 2 可以只指定两个核心
make -j

# 进行安装,将编译得到的二进制文件和配置文件等拷贝到之前由--prefix参数所指定的目录中去
make install

# 切换到Nginx的安装目录
cd /usr/local/nginx 

# 启动Nginx
sudo  ./sbin/nginx

安装完毕后,修改Nginx的配置文件,假如读者也是安装在/usr/local/nginx/目录,那么直接 vim /usr/local/nginx/conf/nginx.conf 文件

参考以下配置:

# 接收http请求,并将http请求强制跳转为https
    server {
        listen       80;
        server_name  xxxxxx.com;
        rewrite ^(.*)$ https://$host$1 permanent;
    }

    server {
        listen       443 ssl;
        server_name  xxxxxx.com;
        access_log  logs/host-https.*ai.qiql.net.access.log  main;
        # 下面的.pem文件和.key文件就是前文中下载的https证书文件,读者自行上传至服务器即可
        ssl_certificate /root/nginx/cert/xxxxxxx.com.pem;
        ssl_certificate_key /root/nginx/cert/xxxxxx.com.key;
        ssl_trusted_certificate  /root/nginx/cert/xxxxxx.com.pem;
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://127.0.0.1:7001;#这里的7001就是frpc.ini文件中的vhost_http_port字段
        }
        error_page  500 502 503 504  /50x.html;

        location /50x.html {
            root   /usr/local/nginx/1.23.0/html;
        }
    }

保存退出后,执行/usr/local/nginx/sbin/nginx -s reload以重载Nginx配置

3.4.3 配置frpc

以上都是公网服务器端的配置,在内网服务器的frpc.ini文件中,进行如下修改

[jupyter.aheadai.cn]
type=http
local_ip = 127.0.0.1 
local_port = xxx # 内网服务所启动的端口号
http_user = abc #[可选,用于身份验证]
http_pwd = abc  #[可选,用于身份验证]
custom_domains = xxxxxx.com # 域名

保存frpc.ini 文件,然后使用./frpc reload -c ./frpc.ini命令进行热重载,就可以在浏览器中通过访问 https://xxxxxx.com 使用内网服务器中的服务了

本文系作者 @ admin 原创发布在 文档中心 | AheadAI ,未经许可,禁止转载。