通过frp+nginx实现内网服务的https访问

写下这个配置过程主要是因为frp官网的为本地 HTTP 服务启用 HTTPS》我进行了尝试没有成功,于是就想通过反向代理+内网穿透实现这个功能。放在这里也正好和大家一起交流讨论一下。

前提

  1. 一台有带有公网IP的服务器
  2. 一台内网服务器
  3. 公网服务器安装好Nginx(安装过程略)
  4. 公网和内网服务器已经分别下载好frp(使用方法参见:https://gofrp.org/zh-cn/docs/examples/)

申请SSL证书

( Let’s Encrypt)参考:

Certbot

这里我是:

  1. 安装Certbot

    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
    
  2. 运行 Certbot

    运行时要保证80端口未被占用(若需要保持我的网络服务器运行,参见官网参考教程)

    sudo certbot certonly --standalone
    

运行完成后,会在本地生成证书,终端会显示安装位置:

Successfully received certificate.
Certificate is saved at: /path/to/your/fullchain.pem
Key is saved at:         /path/to/your/privkey.pem

配置Nginx服务

方法:配置 Nginx 监听 80 和 443 端口,并将 HTTP 请求重定向到 HTTPS,同时将请求转发到 8080 端口。

编辑: /etc/nginx/sites-available/default 文件

# Redirect all HTTP requests to HTTPS
server {
    listen 80;
    server_name www.example.com;  # 替换为你的域名

    # 重定向所有 HTTP 请求到 HTTPS
    return 301 https://$host$request_uri;
}

# HTTPS server configuration
server {
    listen 443 ssl;
    server_name www.example.com;  # 替换为你的域名

    # SSL 证书和密钥文件路径
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    # 定义访问日志和错误日志的位置
    # access_log /var/log/nginx/access.log;
    # error_log /var/log/nginx/error.log;

    location / {
        # 将所有请求转发到 8080 端口
        proxy_pass http://127.0.0.1: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;
    }
}

配置完成后,所有的 HTTP 请求会自动重定向到 HTTPS,HTTPS 请求会被转发到 8080 端口。

接着测试Nginx配置并启动服务:

sudo nginx -t
sudo systemctl restart nginx

确保没有错误后,Nginx 服务将会启动并应用新的配置。

配置内网穿透服务

公网服务器(frps.toml)

bindPort = 7000  # 与内网服务器的通信端口
vhostHTTPPort = 8080 

内网服务器(frpc.toml)

serverAddr = "1.1.1.1" #你的公网服务器IP
serverPort = 7000

[[proxies]]
name = "one-api"
type = "http"
localPort = 8080
customDomains = ["www.example.com","www.example.cn"] 

这个配置是当用户访问 www.example.com 或者 www.example.cn 的时候, frp 会将内网服务器的8080端口服务暴露在公网上。

由于Nginx已经配置好了证书,当用户访问 www.example.com 时,会自动进行HTTPS加密通信,并将端口指向frp监听的端口。

测试与验证

完成以上配置后,可以就可以启动内网穿透服务,并进行验证:

  1. 启动 frps 和 frpc 服务

    在公网服务器上启动 frps:

    ./frps -c ./frps.toml
    

    在内网服务器上启动 frpc:

    ./frpc -c ./frpc.toml
    
  2. 访问测试

    打开浏览器,输入 https://www.example.com 进行访问,检查是否能够成功连接到内网服务器的服务。如果一切配置正确,应该能够看到内网服务的页面。

15 个赞

好诶好诶

是不是还要添加个 A 记录

感谢

是的

刚好需要学习一下

frp是为了拿证书的时候能访问到吗

我都是直接转发端口 然后用nginx再反代开启ssl

可以不用nginx直接frp穿https么

不懂就问,frp是干什么用的

From 配置调优 to 开发调优

代理/中转软件,

谢谢保姆级教程。nice

贡献一个 :grinning:

frp推荐这个工具,挺好用的.