2024-10-23更新:更安全的方式请看浅析Frp的https转发

去年英特尔发布了基于12代酷睿小核的N系列处理器,其中的N100、N305被奉为nas神U,今年我也搞了一台N100小主机当家庭服务器用,自己插一根16G内存加上一个6盘位硬盘笼这不比云服务器性价比高啊

但是由于当地运营商政策,我把光猫改桥接后没几天就来电话了bili_smilies,导致我连公网v6都没有,所以只好走内网穿透的路子了

一、准备工作

内网穿透自然少不了一台带公网IP的服务器了,由于我所有nas相关的服务只在内网供我自己使用,暴露到公网的只有一些建站需求,所以从省钱的角度考虑我需要一台低延迟、低带宽的服务器,当然CPU内存硬盘什么的也尽可能低,网穿+反代+小水管带宽根本废不了多少性能。

以上介绍了适合我的情况,小伙伴们要根据适合自己的情况选服务器哦

根据不同的内存,我会分别推荐以下几种搭建方式:

  • 内存>=1G:搭建1Panel面板,使用里面的OpenResty和frps应用
  • 内存≈512M:宿主机部署frps,安装docker部署nginx proxy manager
  • 内存≈256M:宿主机部署frps和nginx,自己手搓配置

二、客户端搭建

客户端(也就是家里的服务器)我们使用frp来进行内网穿透

下面介绍frp的两种搭建方式:Docker安装和直接部署

1、Docker安装frpc(以Rocky linux为例)

首先输入下面的命令安装docker,已经装好的可以跳过

# 添加Docker Repo
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# 更新源
dnf update
# 在安装 Docker CE 的时候,会同步安装 docker-compose-plugin 插件
dnf install -y docker-ce

成功安装后输入docker --version可以看到输出的版本信息

然后安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果下载缓慢可以尝试国内的代理

sudo curl -L "https://ghproxy.com/https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

赋予文件运行权限

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

链接docker-compose文件

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

至此就算安装完成了,输入docker-compose --version会输出版本信息

然后安装frpc

cd到你想安装的路径下,创建docker-compose.yml文件

version: '3.3'    #报版本错误就把这行删掉
services:
    frpc:
        restart: always
        network_mode: host
        volumes:
            - './frpc.toml:/etc/frp/frpc.toml'    #配置文件
        container_name: frpc  #容器名称
        image: snowdreamtech/frpc

然后创建frpc.toml文件,输入下面的配置

serverAddr = "x.x.x.x"    #你的云服务器ip
serverPort = 7000    #frp服务端口

auth.method = "token"    #认证方式
auth.token = "moke0721"    #认证密码

webServer.addr = "0.0.0.0"
webServer.port = 7400    #客户端面板端口
webServer.user = "yourId"    #客户端面板用户名
webServer.password = "yourPasswd"    #客户端面板密码
webServer.pprofEnable = false

完成后输入docker-compose up -d就会拉取镜像创建容器

完成后浏览器访问你的ip:frp客户端面板端口进入面板,在Configure处你就能看到刚才编写的配置

在下面添加你需要内网穿透的端口,内容如下

[[proxies]]
name = "RD"    #隧道名称
type = "tcp"    #传输协议
localIP = "127.0.0.1"    #需要穿透的内网ip
localPort = 2333    #需要穿透的内网端口
remotePort = 2333    #外网访问端口

每个端口都要写一份这个配置,完成后点击上方Upload更新配置

2、直接部署frpc

到项目的releases页面下载适合自己系统的压缩包并解压到安装目录

打开其中的frpc.toml文件修改配置如下

serverAddr = "x.x.x.x"    #你的云服务器ip
serverPort = 7000    #frp服务端口

auth.method = "token"    #认证方式
auth.token = "fgewsfes"    #认证密码

webServer.addr = "0.0.0.0"
webServer.port = 7400    #客户端面板端口
webServer.user = "yourId"    #客户端面板用户名
webServer.password = "yourPasswd"    #客户端面板密码
webServer.pprofEnable = false

输入./frpc -c ./frpc.toml尝试运行

此时用内网的其他设备访问你的ip:frp客户端面板端口,可进入面板说明配置正确

回到客户端停止frpc,下面要将frpc注册为systemd服务,输入下面的命令编写

vim /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frpc
After = network.target syslog.target
Wants = network.target

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

[Install]
WantedBy = multi-user.target

wq保存后即可使用systemd管理frpc

# 启动frp
sudo systemctl start frpc
# 停止frp
sudo systemctl stop frpc
# 重启frp
sudo systemctl restart frpc
# 查看frp状态
sudo systemctl status frpc

完成后浏览器访问你的ip:frp客户端面板端口进入面板,在Configure处你就能看到刚才编写的配置

在下面添加你需要内网穿透的端口,内容如下

[[proxies]]
name = "RD"    #隧道名称
type = "tcp"    #传输协议
localIP = "127.0.0.1"    #需要穿透的内网ip
localPort = 2333    #需要穿透的内网端口
remotePort = 2333    #外网访问端口

每个端口都要写一份这个配置,完成后点击上方Upload更新配置

三、服务端搭建

1、1Panel面板+OpenResty、Frps(内存至少1G)

使用ssh登录你的云服务器,输入下面命令安装1Panel面板(以Rocky linux为例)

curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sh quick_start.sh

根据提示完成安装后访问你的ip:端口/安全入口即可访问面板

在左侧应用商店内安装OpenResty和Frp服务端,记得Frp服务端设置的端口和账号密码,记得勾选外部访问

如果你上面的frpc配置正确,那么登录到后台就能发现刚才建立的隧道

此时输入你的ip:端口就可以访问到家里的服务器了

如果你还想通过域名访问,请继续往下看

在1Panel面板左侧点击网站,点击创建网站,类型选择反向代理

主域名处填写你的域名,代理地址处填写127.0.0.1:隧道公网端口(这里填docker的虚拟网卡会更好)

然后在你的dns提供商把域名解析到你的云服务器就可以通过域名访问了

如果你还想使用https访问,请继续看(以cloudflare为例)

登录cloudflare,点击我的账户资料

在左边点击API令牌,选择API 令牌行对应的创建令牌按钮

进入后选择编辑区域 DNS,在区域资源最后一栏选择自己的域名

选择继续以显示摘要->创建令牌

一定要牢记你的令牌,如果泄露一定要及时删除令牌

在1Panel面板网站栏里点击证书

首先创建DNS账户

名称随便填,类型选择Cloudflare,email填写注册cloudflare的邮箱,API Token填写刚才获取的令牌

然后创建Acme 账户

邮箱填你的邮箱,类型选Let's Encrypt,加密算法建议不要选太简单的

完成后点击申请证书,填入你的域名,DNS和Acme 账户选你刚刚创建的,点击确认

等待一会就会在日志里看到申请成功的提示

回到网站页面,点击你刚刚创建的反向代理的配置选项

进入https,启用HTTPS

选择访问HTTP自动跳转到HTTPS,Acme 账户选择你刚刚创建的,证书就会弹出来

点击保存,再访问你的网站就会看到代表https的锁已经出现了,OpenResty会自动帮你续签证书

2、直接部署frps,安装docker部署nginx proxy manager(0.5G内存左右)

直接部署frps的步骤和frpc大同小异,这里直接给出docker-compose.yml和frps.toml

#docker-compose
services:
    frps:
        restart: always
        network_mode: host
        volumes:
            - '/root/data/docker_data/frps/frps.toml:/etc/frp/frps.toml'
        container_name: frps
        image: snowdreamtech/frps
# frps.toml 
bindPort = 7000 # 服务端与客户端通信端口 
auth.token = "fgewsfes" # 身份验证令牌,frpc要与frps一致

# Server Dashboard,可以查看frp服务状态以及统计信息
webServer.addr = "0.0.0.0" # 后台管理地址 这里不需要改动
webServer.port = 7500 # 后台管理端口
webServer.user = "admin" # 后台登录用户名
webServer.password = "admin" # 后台登录密码

重点是nginx proxy manager的配置,下面是nginx proxy manager的docker-compose

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

同样输入docker-compose up -d拉取镜像创建容器

完成后浏览器输入ip:81(你设置的端口)进入管理面板,默认账号密码如下

  • Email: admin@example.com
  • Password: changeme

在添加反向代理之前,确保你已经完成了域名解析(见第一种方式

在nginx proxy manager里点击Add Proxy

Domain Names中填写你的域名,下方填写访问方式,ip(127.0.0.1)和端口

点击Save就可以了,此时你就可以使用域名访问你的网站了

如果你需要https访问,请继续看

选择刚才创建的反向代理,右边三个点点击Edit

上方找到SSL进入

第一栏选择Request a new SSL Certificate,勾选Force SSL

下方输入你的邮箱,勾选最后的同意,点击Save

然后你就可以使用https访问你的网站啦,nginx proxy manager会自动帮你续签证书

3、直接部署frps和nginx(内存大约256M)

直接部署frps可见第二步

下面安装nginx(以Rocky linux为例)

导入nginx库

sudo tee /etc/yum.repos.d/nginx-mainline.repo<<EOF

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/9/x86_64/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

EOF

安装dnf-utils

dnf -y install dnf-utils

安装nginx

dnf -y install nginx

系统自动注册相关服务,此时可用systemd控制nginx

# 启动 nginx
systemctl start nginx.service
# 停止 nginx
systemctl stop nginx.service
# 重启
systemctl reload nginx.service

下面配置反向代理

cd到/usr/local/nginx/conf目录下,打开nginx.conf

修改配置如下

server {
	listen       80; #监听端口,不建议改
	server_name  yourdomain.com; #你的域名

	location / {
		root   html;
		index  index.html index.htm;
		proxy_pass  http://127.0.0.1:8080  #你的反代地址和端口
	}
}

然后输入systemctl reload nginx.service重启nginx,此时你就可以使用域名访问你的网站了

如果你想用https访问,请继续看

首先安装Certbot,Certbot可以帮你申请免费证书

dnf install -y certbot python3-certbot-nginx

安装后开始申请证书(yourdomain.com替换为你的域名)

certbot --nginx -d yourdomain.com -d www.yourdomain.com

然后打开刚刚的nginx配置文件,修改如下

server {
    listen 80;
    server_name yourdomain.com; #你的域名
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com; #你的域名

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256";

    location / {
        proxy_pass http://localhost:8080;  # 你的反代地址和端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

然后输入systemctl reload nginx.service重启nginx,此时你就可以使用https访问你的网站了