前言

  • 本文主要讲述frp结合nginx进行内网穿透,并实现多子域名转发以及https访问

环境准备

  • 带公网IP的云服务器1台(我这里使用的是阿里云轻量应用服务器)
  • 已备案域名1个
  • 软路由 or 待穿透设备
  • frp
  • nginx

服务端frps

  • 我们首先在服务器下载frp(下载速度慢的话可以手动从GitHub上下载,然后上传到服务器)
wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
  • 进行解压
tar -zxvf frp_0.48.0_linux_amd64.tar.gz
  • frp 服务端配置
vim frps.ini
[common]
# 服务器端监听客户端连接请求的端口
bind_port = 17000
token = mytoken
# 服务器端监听http请求的端口(由于80端口被nginx占用,因此指定其他端口)
vhost_http_port = 17080
# 服务器用以显示连接状态的站点端口,以下配置中可以通过访问IP:17500登录查看frp服务端状态等信息
dashboard_addr = 0.0.0.0
dashboard_port = 17500
# dashboard对应的用户名/密码
dashboard_user = user
dashboard_pwd = pwd
# 二级frp域名 三级sub子域名做saas
# 如果 frps 配置了 subdomain_host,则frpc中想自定义custom_domains 中不能是属于 subdomain_host 的子域名或者泛域名。
subdomain_host = frp.xxxx.com
# 日志文件路径
log_file = ./frps.log
# 日志记录错误级别,分为:trace, debug, info, warn, erro
log_level = warn
# 日志保存最大天数
log_max_days = 3
  • 这里配置文件要注意以下几点

    • bind_port: frp绑定端口,默认是7000,我这里改为了17000
    • token: 客户端连接时的token,建议添加(后面客户端配置会用到)
    • vhost_http_port: http监听端口,默认80,我这里改为了17080
    • dashboard相关配置: 可设置可不设置,访问对应端口会有一个frp的看板页面
    • subdomain_host: 二级frp域名,后面我们可以将多个需要穿透的服务映射到三级域名
  • 配置启动命令
vim /lib/systemd/system/frps.service
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini

[Install]
WanteBy=multi-user.target
  • 这里需要注意的是ExecStart命令中frps的路径和frps.ini的路径要修改成自己的
  • 配置完成后,我们运行 systemctl start frps 命令即可启动frps,再执行 systemctl enable frps 实现开机自启

nginx配置(实现多子域名转发)

  • 在配置nginx之前我们还有两件事需要做

    • 一是域名DNS解析,我们要添加两条解析记录

| 主机记录 | 记录类型 | 记录值 |
| - | - | - |
| frp | A | 服务器IP |
| *.frp | A | 服务器IP |

    • 二是服务器防火墙端口开放:17000端口、17500端口、17022端口(后面配置ssh会用到),17080端口不必开放,我们下面会通过nginx进行反代
    • nginx的下载安装我这里就不做演示了,我们直接进行nginx配置
    • 不需要https访问话直接用下面配置就可以
    server {
        listen 80;
        server_name *.frp.xxx.com frp.xxx.com;
        location / {
            proxy_pass http://127.0.0.1:17080;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
    }
    • 接下来讲https访问如何配置(不需要可跳过此部分)
    • 首先我们要申请通配符域名ssl证书,这里我用的是 ohttps 网站,网址是 ohttps.com,大家也可以自行选择,输入域名(*.frp.xxx.com) 进行证书申请即可,申请成功后,会生成一个cer文件和一个key文件,下载后上传到服务器即可
    • nginx配置如下
    server {
      listen        80;
      server_name   ql.frp.xxx.com;
      rewrite ^(.*) https://ql.frp.xxx.com$1 permanent;
    }
    
    server {
      listen        80;
      server_name   openwrt.frp.xxx.com;
      rewrite ^(.*) https://openwrt.frp.xxx.com$1 permanent;
    }
    
    server {
      listen                     443;
      server_name                *.frp.xxx.com;
      ssl                        on;
      root                       html;
      index                      index.html index.htm;
      ssl_certificate            conf.d/cert/*.frp.xxx.com/*.frp.xxx.com_chain.cer;
      ssl_certificate_key        conf.d/cert/*.frp.xxx.com/*.frp.xxx.com_key.key;
      ssl_session_timeout        5m;
      ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers                ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
      ssl_prefer_server_ciphers  on;
      location / {
        proxy_pass          http://127.0.0.1:17080;
        proxy_set_header    Host            $host:80;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header   X-Powered-By;
      }
    }
    • 上面两个80端口的监听是为了跳转到443,这里我使用*.frp.xxx.com通配跳转会将三级域名编码,所以只能分开写了
    • 另外还需要注意ssl_certificatessl_certificate_key对应的是你的cer和key文件的存放地址
    • 配置完成后重载配置文件或者重启nginx即可

    客户端frpc

    • 我使用的openwrt是默认有安装frp的,没有的话安装方式同服务器端,或者也可以使用docker安装: https://hub.docker.com/r/chenhw2/frp
    • 安装过程我就不演示了,我们直接编写 frpc.ini 配置文件
    [common]
    server_addr=xxx.xxx.xxx.xxx
    server_port=17000
    token=mytoken
    user=ruochen
    log_level=info
    log_max_days=3
    protocol=tcp
    log_file=/var/etc/frp/frpc.log
    tcp_mux=true
    tls_enable=false
    login_fail_exit=false
    
    [ssh]
    type=tcp
    remote_port=17022
    local_ip=192.168.11.1
    local_port=22
    use_encryption=true
    use_compression=true
    
    [openwrt]
    type=http
    subdomain=openwrt
    local_ip=192.168.11.1
    local_port=80
    use_encryption=true
    use_compression=true
    
    [ql]
    type=http
    subdomain=ql
    local_ip=192.168.11.1
    local_port=5700
    use_encryption=true
    use_compression=true
    • [common] 参数要注意以下几点

      • server_addr: 填写你服务器的ip即可
      • server_port: 对应frps的bind_port
      • token: 对应frps的token
      • user: 用户标识,加不加都无所谓
    • [common] 下面就是每个服务的配置,要注意服务名称是唯一的,不能重复
    • 我们看一下[ssh]的配置

      • type: 协议类型
      • remote_port: 远程端口,也就是frps所在服务器端口
      • local_ip: 需要穿透的本地ip
      • local_port: 本地端口
      • use_encryption: 开启数据加密,将frpc与frps之间的通信内容加密传输,将会有效防止流量被拦截
      • use_compression: 使用压缩,压缩传输内容,加快流量转发速度,会额外消耗CPU资源
      • 通过上述配置后,我们就可以通过服务器ip+17022访问到我们的本地设备终端
    • 然后我们再讲一下[openwrt]配置

      • subdomain: 三级子域名
      • 其他配置同[ssh]
      • 这里我配置了三级子域名,由于我们前面使用nginx反代了17080端口,我们就可以直接通过openwrt.frp.xxx.com访问我们的网站
    • [ql]的配置类似,这里就不过多阐述了

    总结

    • 通过以上配置,我们就实现了frp与nginx结合的多子域名内网穿透,大家如果有更多的设备(nas之类的)想要内网穿透,继续在frpc配置文件中添加配置即可
    END
    本文作者:
    文章标题:frp内网穿透,多子域名转发,https访问
    本文地址:https://iruochen.net/archives/23/
    版权说明:若无注明,本文皆ruochen's blog原创,转载请保留文章出处。
    最后修改:2023 年 04 月 09 日
    如果觉得我的文章对你有用,请随意赞赏