FRP内网穿透,NGINX反向代理(配置SSL),实现多子域名转发服务(三级子域名)

一、安装并配置frp服务端

1.1 在服务器安装frps

在有公网ip的主机上,下载frp官方GitHub最新的frp二进制文件:

wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
#如果下载失败,前面加个:mirror.ghproxy.com
wget https://mirror.ghproxy.com/github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz

解压到/bin/frp目录:

#先创建目录
mkdir -p /bin/frp
tar -xvf frp_0.61.0_linux_amd64.tar.gz -C /bin/frp

创建一个systemctl服务:

nano /lib/systemd/system/frps.service

内容如下:

[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/bin/frp/frp_0.61.0_linux_amd64/frps -c /bin/frp/frp_0.61.0_linux_amd64/frps.toml 

[Install]
WantedBy=multi-user.target

服务端frps的启动与停止

# 启动frps 
sudo systemctl start frps 
# 打开自启动
sudo systemctl enable frps
# 重启应用
sudo systemctl restart frps
# 停止应用
sudo systemctl stop frps
# 查看应用的日志
sudo systemctl status frps
# 停止开机自启动
systemctl disable frps

例如:

❯ systemctl start frps
❯ systemctl enable frps
Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /lib/systemd/system/frps.service.
❯ systemctl status frps
● frps.service - frp server
     Loaded: loaded (/lib/systemd/system/frps.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-11-30 21:01:07 CST; 15s ago
   Main PID: 2565486 (frps)
      Tasks: 4 (limit: 2153)
     Memory: 8.7M
        CPU: 141ms

1.2 配置服务端

编辑服务端配置文件/bin/frp/frp_0.61.0_linux_amd64/frps.toml

bindAddr = "0.0.0.0"
bindPort = 7000
subdomainHost = "frp.xxxxxx.xxx"
vhostHTTPPort = 7000
vhostHTTPSPort = 7000
auth.method = "token"
# token为客户端连接服务端的钥匙🔑
auth.token = "xxxxxx"
# 以下为在服务端启动该的web界面,可以查看客户端连接的详细信息,不配置也没关系
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "xxxxx"
webServer.password = "xxxxxxxx"

其中,只需要将 *.{subdomainHost} 解析到 frps 所在服务器。之后用户可以通过 subdomain 自行指定自己的 web 服务所需要使用的二级域名,通过 {subdomain}.{subdomainHost} 来访问自己的 web 服务。

例如,这里将*.frp.xxxxxx.xxx解析到服务器,既可以通过xx.frp.xxxxxx.xxx访问。

最后 systemctl restart frps重启服务。

二、nginx反向代理frp

2.1 申请并安装ssl证书

2.1.1 通过dns api申请ssl证书,支持泛域名及根域名

先到阿里云控制台获取key和secret,然后在服务器终端输入:

export Ali_Key="xxxxxxx"
export Ali_Secret="xxxxxxxxxxxx"
#注意引号,否者会报no matches found: *.frp.xxxxxxx.xxx 错误
acme.sh --issue --dns dns_ali -d frp.xxxxxx.xxx -d '*.frp.xxxxxx.xx'

经过等待后,提示Cert success.即说明证书签发成功。

2.1.2 使用 --install-cert 命令安装证书

# 先新建证书目录
mkdir -p /etc/nginx/ssl/frp.xxxxxx.xxx
# 再安装证书到该目录
acme.sh --install-cert -d frp.xxxxxx.xxx \
--key-file /etc/nginx/ssl/frp.xxxxxx.xxx/key.pem \
--fullchain-file /etc/nginx/ssl/frp.xxxxxx.xxx/fullchain.pem \
--reloadcmd "nginx -s reload"

提示Reload successful即安装成功。

2.1.3 配置 SSL 相关的设置

nano etc/nginx/snippets/ssl-params.conf

内容如下:

ssl_session_cache        shared:SSL:10m;
ssl_session_timeout      60m;

ssl_session_tickets      on;

ssl_stapling             on;
ssl_stapling_verify      on;

resolver                 8.8.4.4 8.8.8.8  valid=300s;
resolver_timeout         10s;
ssl_prefer_server_ciphers on;

ssl_protocols            TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

# 以下配置来自 [提高安全性的最佳 Nginx 配置](https://godruoyi.com/posts/best-nginx-configuration-for-improved-security),建 议参考。
server_tokens   off;
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
add_header  X-Frame-Options  deny;
add_header  X-Content-Type-Options  nosniff;
add_header x-xss-protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";

2.2 nginx反向代理frp

创建一个nginx站点配置文件

nano /etc/nginx/sites-available/frp.xxxxxx.xxx.conf

内容如下:

server {
    listen 80;
    server_name frp.xxxxxx.xxx *.frp.xxxxxx.xxx;

    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl fastopen=3 reuseport;
    server_name frp.xxxxxx.xx *.frp.xxxxxx.xxx;

    # 证书文件绝对路径
    ssl_certificate          /etc/nginx/ssl/frp.xxxxxx.xxx/fullchain.pem;
    ssl_certificate_key      /etc/nginx/ssl/frp.xxxxxx.xxx/key.pem;
    # 引入ssl配置文件
    include snippets/ssl-params.conf;

    access_log  /var/log/nginx/frp.xxxxxx.xxx.access.log;
    error_log  /var/log/nginx/frp.xxxxxx.xxx.error.log;

    location / {
        proxy_pass http://127.0.0.1:7000;
        # 这个Host的header一定要加,不然转发后frp拿不到通过哪个域名访问的,导致转发失败
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}

启用该站点

ln -s /etc/nginx/sites-available/frp.xxxxxx.xxx.conf /etc/nginx/sites-enabled         3

测试并重载:

❯ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
❯ nginx -s reload

三、安装并配置客户端

3.1 在内网主机安装frpc

在内网主机上,下载frp官方GitHub最新的frp二进制文件:

wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
#如果下载失败,前面加个:mirror.ghproxy.com
wget https://mirror.ghproxy.com/github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz

解压到/bin/frp目录:

#先创建目录
mkdir -p /bin/frp
tar -xvf frp_0.61.0_linux_amd64.tar.gz -C /bin/frp

创建一个systemctl服务:

nano /lib/systemd/system/frpc.service

内容如下:

[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/bin/frp/frp_0.61.0_linux_amd64/frpc -c /bin/frp/frp_0.61.0_linux_amd64/frpc.toml 

[Install]
WantedBy=multi-user.target

常见命令:

❯ systemctl start frpc
❯ systemctl enable frpc
Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /lib/systemd/system/frps.service.
❯ systemctl status frpc
● frpc.service - frpc service
     Loaded: loaded (/lib/systemd/system/frpc.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-11-30 23:28:16 HKT; 17s ago
   Main PID: 84950 (frpc)
      Tasks: 6 (limit: 19038)
     Memory: 4.7M
        CPU: 31ms
     CGroup: /system.slice/frpc.service

3.2 配置客户端

编辑服务端配置文件/bin/frp/frp_0.61.0_linux_amd64/frpc.toml

serverAddr = "frp.xxxxxx.xxx"
serverPort = 7000

auth.method = "token"
#填在服务端设置的参数
auth.token = "xxxxxxxxxxxxx"

transport.tls.enable = true   #是否和服务端之间启用TLS连接
transport.tls.disableCustomTLSFirstByte = false
#默认为true,当配置为true时,无法和vhostHTTPSPort端口复用,会报错:
# connect to server error: remote error: tls: unrecognized name

[[proxies]]
name = "xxxx"
type = "http"
# 可填写本地局域网内其他主机的ip,若本机则可以不填或者填127.0.0.1
localIp = "127.0.0.1"
#本地的端口
localPort = 80
# 填子域名
subdomain = "test"

最后,systemctl restart frpc 重启客户端。

这样,通过访问https://test.frp.xxxxxxx.xxx就可以访问内网的服务啦。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容