Linux上部署Frps与Mac上Frpc的配置方案详细记录

正在查看 5 条回复
  • 作者
    帖子
    • #127157

      追光
      参与者

      远程办公在过去几年里经历了巨大的发展。随着技术的进步和全球互联网的普及,越来越多的公司开始意识到远程工作的潜力和优势。视频会议、实时协作工具、云计算和即时通讯工具的发展,使得远程办公变得更加高效和便捷。这些工具让团队可以随时随地共享信息和合作,无论他们身处何地。

      虽然方便但是没有公网ip、并不能很好的使用,公网与内网的连接就成了刚性需求。

      NAT(Network Address Translation,网络地址转换)穿透对远程办公非常重要。NAT是一种网络技术,允许多个设备共享单个公共IP地址,在互联网上发送和接收数据。然而,在远程办公环境中,NAT可能导致一些问题,而NAT穿透可以解决这些问题。

      Nat穿透有多种实现方式,比如虚拟局域网、Frp等工具,今天我们就比较热门的frp进行分享。

      FRP(Fast Reverse Proxy)是一个用于进行内网穿透的开源工具,它可以帮助将本地服务暴露到公共网络,实现远程访问私有网络中的服务。

      .FRP的工作方式基于客户端-服务器模型。在内网中部署FRP客户端,同时在公网中部署FRP服务器,客户端和服务器之间建立连接。

      .客户端负责将本地服务的请求发送到服务器,服务器收到请求后将流量转发给客户端中的目标服务,从而实现内外网之间的数据通信。

      下面我们就进入在Linux服务端部署流程:

    • #127158

      追光
      参与者

      在Linux上部署Frps服务端

      需要的设备:一台具有公网ip的服务器、一台或者多台无公网的mac、Win电脑。这里是具有公网ip的linux服务器配置

      1、下载适合当前版本的Frps。(可以从github下载frps对应的版本)比如我的系统是Centos7对应下载:frp_0.53.0_linux_amd64

      # 前往 FRP 的官方 GitHub releases 页面下载适用于 Linux 的版本,例如 v0.37.1
      wget https://github.com/fatedier/frp/releases/download/v0.37.1/frp_0.37.1_linux_amd64.tar.gz
      
      # 解压下载的文件
      tar -xvf frp_0.37.1_linux_amd64.tar.gz
      
      # 进入解压后的目录
      cd frp_0.37.1_linux_amd64
      

      小提示:如果使用了Linux管理面板可以直接通过电脑下载文件,并上传到方便管理的目录即可。上方的操作做的也是这个操作,可跳过上方的操作,选择适合你自己的方法来进行下载、上传。

      比如我将Frps与 Frps.toml文件拷贝到方的目录:/www/wwwroot/net/frps/

      2. 配置 FRP 服务器
      创建 FRP 配置文件 frps.atoml,用于配置 FRP 服务器。

      nano frps.atoml

      在编辑器中添加以下配置,根据需求进行修改:

      bindPort = 1443
       #用于fprs和frp进行连接验证通讯的端口,可自行设定,需要在防火墙中开启此端口
      # 如果指定了“oidc”,将使用 OIDC 设置颁发 OIDC(开放 ID 连接)令牌。默认情况下,此值为“令牌”。auth.method = “token”
      auth.method = "token"
      # 身份验证令牌 auth.token = “密码”
      auth.token = "123456"
       
      # 配置 Web 服务器以启用 frps 的仪表板。
      webServer.addr = "0.0.0.0"
      webServer.port = 16443
      #用于fprs显示连接状态流量的端口,可自行设定,需要在防火墙中开启此端口
      webServer.user = "admin"
      webServer.password = "123456"
      

      3. 启动 FRPS 服务器。(这里我常用的三种启动方式都写在下方,每行一个都有解释)

      #1、进入安装目录后 带terminal实时输出启动,测试配置时非常有用
      
      cd /www/wwwroot/net/frps
      ./frps -c ./frps.toml
      
      # 2、进入目录后执行、不带terminal实时输出启动,可关闭terminao
      cd /www/wwwroot/net/frps
      ./frps -c ./frps.toml>/dev/null 2>&1 &
      
      #3、将目录位置写入命令,直接启动
      /www/wwwroot/net/frps/./frps -c /www/wwwroot/net/frps/frps.toml
      

      启动FRP服务器后,它就开始监听来自客户端的连接。

      4、配置开机自动启动,这样每次开机frps就会自动启动

      [Unit]
      # 服务名称,可自定义
      #/etc/systemd/system
      Description = frp server
      After = network.target syslog.target
      Wants = network.target
       
      [Service]
      Type = simple
      # 启动frps的命令,需修改为您的frps的安装路径
      ExecStart = /www/wwwroot/net/frps/./frps -c /www/wwwroot/net/frps/frps.toml
       
      [Install]
      WantedBy = multi-user.target
      

      5、这一步一般情况下可以不做,但如果要让进程始终处于运行状态,可以安装Supervisor进行配置,也可以使用宝塔面板的进程管理器,配置文件如下:

      [program:FRPS]
      # 启动frps的命令
      command=/www/wwwroot/net/frps/./frps -c /www/wwwroot/net/frps/frps.toml
      # 启动frps的的frps的安装路径
      directory=/www/wwwroot/net/frps/
      autorestart=true
      startsecs=3
      startretries=3
      stdout_logfile=/www/server/panel/plugin/supervisor/log/FRPS.out.log
      stderr_logfile=/www/server/panel/plugin/supervisor/log/FRPS.err.log
      stdout_logfile_maxbytes=2MB
      stderr_logfile_maxbytes=2MB
      user=root
      priority=999
      numprocs=1
      process_name=%(program_name)s_%(process_num)02d
      
    • #127159

      追光
      参与者

      在Mac中部署frpc客户端并设置开机启动/进程守护

      1、下载Mac系统版本客户端:frp_0.53.0_darwin_arm64.tar.gz,如果是M芯片的选择darwin arm版,intel芯片的选择:darwin_amd64:


      2、解压文件后得到四个文件,我们仅留下:frpc、frpc.toml俩个文件。


      3、配置frpc.toml,连接客户端并且分配远程与本地的端口映射

      serverAddr = "写入上文服务端的公网ip"
      serverPort = 1443
      
      # 如果指定了“oidc”,将使用 OIDC 设置颁发 OIDC(开放 ID 连接)令牌。默认情况下,此值为“令牌”。auth.method = “token”
      auth.method = "token"
      # 身份验证令牌 auth.token = “密码自行设置”
      auth.token = "123456"
      
      #开放本地ssh22端口,对应远程的122端口
      #[[proxies]]
      name = "ssh"
      type = "tcp"
      localIP = "127.0.0.1"
      localPort = 22
      remotePort = 122
      
      # frpc.toml
      [[proxies]]
      name = "xyz"
      type = "tcp"
      localIP = "127.0.0.1"
      localPort = 443
      remotePort = 1443
      #服务端与此域名通讯的端口
      customDomains = ["xyz.newvfx.com"]
      #定义本地服务的域名1
      transport.useEncryption = true
      #启用加密传输
      transport.useCompression = true
      #启用压缩传输
      # 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
      #transport.proxyProtocolVersion = "v2"
      
      
      # frpc.toml
      [[proxies]]
      name = "xyz2"
      type = "tcp"
      localIP = "127.0.0.1"
      localPort = 443
      remotePort = 2443
      #服务端与此域名通讯的端口
      customDomains = ["xyz2.newvfx.com"]
      #定义本地服务的域名2
      transport.useEncryption = true
      #启用加密传输
      transport.useCompression = true
      #启用压缩传输
      #transport.proxyProtocolVersion = "v2"
      

      3、配置好文件后,启动本地客户端进行连接测试,在Terminal(终端)中进入目录,并执行启动命令:

      
      #进入客户端所在目录,可贫喜好自行修改
      cd /Applications/frp
      
      #执行启动命令
      ./frpc -c ./frpc.toml
      
      #执行启动命令后不输出信息,可关闭Terminal
      nohup ./frpc -c frpc.toml >/dev/null 2>&1 &
      

      上方两条可以通过shortcuts,或者新建为一个frpc.command的脚本。

      #!/bin/bash
      clear
      cd /Applications/frp
      ./frpc -c frpc.toml
      
      

      4、设置开机Mac开机启动与进程守护

      Mac OS各目录决定了其启动的先后和拥有的权限

      ~/Library/LaunchAgents # 以当前设置的用户登录后启动。
      /Library/LaunchAgents # 系统组件所有用户登录后都以当前用户启动
      /Library/LaunchDaemons # 系统启动时以root用户启动,无需登陆。
      

      4、1写入到用户启动项目,开机后输出密码登陆用户后启动:

      echo '<?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
          <key>Label</key>
          <string>com.jisongbin.frp</string>
          <key>ProgramArguments</key>
          <array>
              <string>/Applications/frp/frpc</string>
              <string>-c</string>
              <string>/Applications/frp/frpc.toml</string>
          </array>
          <key>RunAtLoad</key>
          <true/>
          <key>KeepAlive</key>
          <true/>
      </dict>
      </plist>' > ~/Library/LaunchAgents/com.jisongbin.frp.plist

      4、2、写入到系统启动项目:开机后即启动,不需要输入用户输入密码

      sudo sh -c 'echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
      <!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
      <plist version=\"1.0\">
      <dict>
          <key>Label</key>
          <string>com.jisongbin.frp</string>
          <key>ProgramArguments</key>
          <array>
              <string>/Applications/frp/frpc</string>
              <string>-c</string>
              <string>/Applications/frp/frpc.toml</string>
          </array>
          <key>RunAtLoad</key>
          <true/>
          <key>KeepAlive</key>
          <true/>
      </dict>
      </plist>" > /Library/LaunchDaemons/com.jisongbin.frp.plist'

      检查服务进程是否启动:

      ps -e |grep frpc

      小提示:如果进入开机自动启动后,kill掉进程会自动重新读取frpc.atoml,可以使用命令关掉进程,让其自动启动

      killall frpc
    • #127171

      追光
      参与者

      Frps部署ssl通讯方式后去掉端口号的方法与转发速度的提升

      1、tcp类型通讯协议的转发:

      需要在服务端、即有公网的服务器上配置Nginx反向代理,将域名或者ip转发到带端口的网络接口,这样就不需要输入端口号才能访问。这里我全程使用了ssl安全链接,所以转发到了https的端口上。

      转发目标:https://127.0.0.1:1443 转发host:¥host

      完整写法如下:

      
      #PROXY-START/
      
      location ^~ /
      {
          proxy_pass https://127.0.0.1:1443;
          proxy_set_header Host $http_host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $connection_upgrade;
          proxy_http_version 1.1;
          # proxy_hide_header Upgrade;
      
          add_header X-Cache $upstream_cache_status;
          #Set Nginx Cache
      
          set $static_filexVoJAVYp 0;
          if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
          {
              set $static_filexVoJAVYp 1;
              expires 1m;
          }
          if ( $static_filexVoJAVYp = 0 )
          {
              add_header Cache-Control no-cache;
          }
      }
      #PROXY-END/
      

      经验记录
      1、如果带端口访问,ssl只需要在本地服务器 或者转发服务器添加ssl证书即可

      2、如果要去掉端口,需要在转发服务器上使用反向代理,将域名转发到转发服务器的ssl模式转发端口

      访问此域名则转发到服务器的:1443端口,1443端口又转发到本地服务器端口:443

      在这个模式下,所有链接都被切换到https模式,需要在转发服务器和 本地服务器都部署当前域名的证书。转发为ssl时需要证书验证一次,到达本地服务器时候还需要本地服务器有证书。俩个证书可以不是同一个厂家的,但必须是同域名的。

      2、http、https方式的Nginx反向代理转发去端口

      2、1vhost_https_port方式Nginx反向代理配置

      server
      {
          listen 80;
      		listen 443 ssl http2;
          server_name test.newvfx.com;
          index index.php index.html index.htm default.php default.htm default.html;
      
          #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
          #error_page 404/404.html;
          ssl_certificate    /www/server/panel/vhost/cert/test.newvfx.com/fullchain.pem;
          ssl_certificate_key    /www/server/panel/vhost/cert/test.newvfx.com/privkey.pem;
          ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
          ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
          ssl_prefer_server_ciphers on;
          ssl_session_cache shared:SSL:10m;
          ssl_session_timeout 10m;
          add_header Strict-Transport-Security "max-age=31536000";
          error_page 497  https://$host$request_uri;
          #SSL-END
          
      #Jisongbin反向代理配置
       location / { 
                      proxy_redirect off;
                      proxy_set_header Host $host;
                      proxy_ssl_server_name on;
                      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;
                      #htts://https必须是域名不能用ip:[vhost_https_port]
                      proxy_pass https://test.newvfx.com:1443;
                      proxy_ssl_session_reuse on;
                      proxy_set_header Upgrade $http_upgrade;
                      proxy_set_header Connection $connection_upgrade;
                      proxy_http_version 1.1;                
      
              }
      #Jisongbin反向代理配置结束
      
      }
      

      2、2、http方式Nginx反向代理配置: vhost_http_port

        
      
      server{
              listen 80;
              server_name *.example.com;
              location / {
                  //服务器的ip和端口http://[ip]:[port]   vhost_http_port
                      proxy_pass http://your_ip: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_hide_header X-Powered-By;
              }
              access_log off;
      
    • #127181

      追光
      参与者

      补充:Nginx反向代理实现实时上传下载

      Nginx反向代理默认采用:用户将文件上传《—-》到Nginx反向代理服务器《—-》转发到后端服务器,并以网速最低的一端作为总传输速度,并在每一段传输中,以当前段的最大带宽作为区域传输速度。

      在小文件上传下载时候,这个过程非常快,所以给人造成一种实时的错觉。当进行大文件(视频、软件、音频)下载的时候,就会发现效率很低。

      具体表现:本地客户端输出流量正常,服务端输入流量正常,但从服务端到用户的速度很低、通常只有几十kb,这是由于反向代理过程中,用户需要将文件完全上传到服务端后,服务端才从服务端转发到后端,如果是大一点的视频、音频会造成超时无法播放的问题。


      用户下载、播放时的方式:
      在nginx反向代理中关闭向用户传输文件的缓存(即Nginx出方向的缓存)添加:

      添加禁用缓存,不将转发数据存储到硬盘
       proxy_buffering off;
       proxy_cache off;
       # proxy_hide_header Upgrade;
      
      注释掉以下行 不添加缓存头
       # add_header X-Cache $upstream_cache_status;
      

      用户进行上传
      如果站点是允许用户进行大文件(视频、软件、音频)上传即(Nginx入方向)的,同样会存在上述问题,我们可以通过关闭传入buffering来实现直接上传下载的目的,并设定客户端上传文件大小限制:

       
        #Jisongbin直接上传不缓存
        proxy_request_buffering off;
                   
        # jisongbin代理文件上客户端最大请求体大小
        client_max_body_size 10G;
      #add_header X-Cache $upstream_cache_status;
      

      以上是在部署与应用过程中的记录,如果你在部署中遇到问题可以跟帖留言,看到就回复啦。

    • #127184

      追光
      参与者

      (末端Apache配置)补充:Apache作为客户端服务器对视频、音频文件传输进行压缩以及浏览器缓存时间设置策略

      # 启用文件压缩
      
        # 图片
        AddType image/jpeg .jpeg .jpg .jpe .png .gif
        AddOutputFilterByType DEFLATE image/jpeg image/png image/gif
        # JavaScript
        AddType application/javascript .js
        AddOutputFilterByType DEFLATE application/javascript
        # CSS
        AddType text/css .css
        AddOutputFilterByType DEFLATE text/css
        # 视频
        AddType video/mp4 .mp4
        AddOutputFilterByType DEFLATE video/mp4
        AddType video/webm .webm
        AddOutputFilterByType DEFLATE video/webm
        AddType video/ogg .ogv
        AddOutputFilterByType DEFLATE video/ogg
        # 音频
        AddType audio/mpeg .mp3
        AddOutputFilterByType DEFLATE audio/mpeg
        AddType audio/wav .wav
        AddOutputFilterByType DEFLATE audio/wav
        AddType audio/ogg .ogg
        AddOutputFilterByType DEFLATE audio/ogg
        # 常见文件格式
        AddType application/pdf .pdf
        AddOutputFilterByType DEFLATE application/pdf
        AddType application/json .json
        AddOutputFilterByType DEFLATE application/json
        AddType application/xml .xml
        AddOutputFilterByType DEFLATE application/xml
      
      
      # 启用缓存控制
      
        ExpiresActive On
        # 图片缓存一周
        ExpiresByType image/jpeg "access plus 1 week"
        ExpiresByType image/png "access plus 1 week"
        ExpiresByType image/gif "access plus 1 week"
        # JavaScript缓存一周
        ExpiresByType application/javascript "access plus 1 week"
        # CSS缓存一周
        ExpiresByType text/css "access plus 1 week"
        # 视频缓存一年
        ExpiresByType video/mp4 "access plus 1 year"
        ExpiresByType video/webm "access plus 1 year"
        ExpiresByType video/ogg "access plus 1 year"
        # 音频缓存一年
        ExpiresByType audio/mpeg "access plus 1 year"
        ExpiresByType audio/wav "access plus 1 year"
        ExpiresByType audio/ogg "access plus 1 year"
        # 常见文件格式缓存一天
        ExpiresByType application/pdf "access plus 1 day"
        ExpiresByType application/json "access plus 1 day"
        ExpiresByType application/xml "access plus 1 day"
      
      

      Apache获取用户真实ip的配置:

      <IfModule mod_remoteip.c>
        RemoteIPHeader X-Forwarded-For
        RemoteIPProxiesHeader X-Forwarded-By
      </IfModule>
正在查看 5 条回复
  • 在下方一键注册,登录后就可以回复啦。