前言

最近,继续遨游 GayHub 的海洋,在 FRP 的项目中找到了一个用于 FRPC 上线的消息通知插件,若 FRPC 连接了 FRPS,那么该插件就会向所设定的通知渠道发送上线通知。在日常渗透测试中,有时候需要对目标机器设置相关代理,此处有时用到 FRP 穿透工具,但是弄完配置文件并在目标机器执行相关命令后,我们还得去 FRPS 控制面板查看服务有没有上线,步骤相对繁杂,此处的插件正好可以解决该问题。

frp-notify 介绍

frp-notify 一个专注于消息通知的 frp server manager plugin 实现,让你对进入 frps 的连接了如指掌,不再裸奔,项目链接如下:

该插件支持 log日志DingTalkWxWork飞书Gotify 形式的消息通知,基本涵盖了主流的几大通知渠道,可在 frp-notify.json 文件中按需配置通知插件,同时也支持配置多个插件,多渠道通知。

注:本教程将使用 frp-notify 插件配合 Gotify 通知一起使用,若不使用 Gotify 作为消息通知的话,可略过相关 Gotify 的配置操作。并前往该项目查看其它通知相关配置。

Gotify 配置

在使用 frp-notify 插件之前,我们需安装 Gotify ,其项目地址如下:

其使用说明文档如下:

此处博主使用 Docker 安装运行的 Gotify ,若未安装 Docker 可使用二进制文件运行,其文档中有相关说明。

先创建一个待映射到容器中的目录:

mkdir -p /var/gotify/data

再启动对应容器(本地无对应容器镜像则会自动 Pull 并启动):

docker run -itd -p 10080:80 -v /var/gotify/data:/app/data gotify/server

此处是将本地的 10080 端口映射到容器中的 80 端口,本地的端口可自定义修改。接下来防火墙或安全组放通 10080 端口并浏览器访问,即可使用账号:admin 和密码:admin 登录(登录后强烈建议修改账号和密码),点击 APPS 创建一个通知应用,创建成功后记录该应用的 Token 字段:

image-20221008200857402

接下来就是配置 frp-notify 了。

frp-notify 配置

此处 frp-notify 插件放置的目录为:/ur/local/frp-notify,用户可自主选择所放置目录,其余操作仅需将该目录路径修改即可。

在项目的 Releases 处下载最新的对应机器架构的包,并解压到 /usr/local/frp-notify 目录下,并编辑配置 frp-notify.json 文件,删除其余通知字段,保留并设置如下:

[root@localhost frp_notify]# vim frp-notify.json 
[root@localhost frp_notify]# cat frp-notify.json 
{
  "blacklist": [
  ],
  "whitelist": [
  ],
  "notify_plugins": [
    {
      "name": "gotify",
      "config": {
        "server_proto": "http",
        "server_addr": "127.0.0.1:10080",
        "app_token": "**********"         # Gotify 的通知应用 Token
      }
    }
  ]
}
[root@localhost frp_notify]# 

启动 frp_notify ,命令如下:

./frp-notify start -c ./frp-notify.json -b 127.0.0.1:50080

若无报错,则正常启动。此时另开一个终端窗口修改 FRPS 客户端配置文件, 在 frps.ini 文件中添加如下字段:

[root@localhost frp]# vim frps.ini
# 追加如下字段
[plugin.frp-notify]
addr = 127.0.0.1:50080                             # frp-notify 地址
path = /handler                                    # frp-notify url, 固定配置
ops = Login,NewProxy,NewWorkConn,NewUserConn       # 通知的操作
[root@localhost frp]# 

重启 FRPS,此时若有终端链接,Gotify 则会推送相关消息了:

image-20221008203246787

至此,frp_notify + Gotify 的 FRP 用户上线消息通知就完成了,接下来就完善一下后续的开机自启以及其它操作吧!

开机自启动

上述虽然成功运行了 frp_notify 服务,但是会占用一个终端窗口,下面通过 system 服务使其开机自启动,在 frp_notify 项目中给了一份系统服务配置文件 frp_notify.service,下面我们就这个系统服务配置文件进行简单修改,最终如下:

[Unit]
Description=Frp notify service
After=network.target

[Service]
Type=simple
User=nobody
Group=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp_notify/frp-notify start -c ./frp-notify.json -b 127.0.0.1:50080
WorkingDirectory=/usr/local/frp_notify/

[Install]
WantedBy=multi-user.target

其中,相关修改字段说明如下:

  • Group:守护运行程序的用户组。
  • ExecStart:对相关运行命令修改,具体启动路径以服务所放置的目录修改,增加 --log-level error 字段以修改日志输出等级。
  • WorkingDirectory:服务所在的工作目录,指定后后面的配置文件可使用相对路径指定,否则,请使用绝对路径。

将系统服务配置文件 frp_notify.service 移动到相关目录下:

mv ./frp_notify.service /usr/lib/systemd/system/

文件移动完成,修改一下 frp_notify 目录及服务文件的所属用户与用户组信息:

chown -R nobody:nobody /usr/local/frp_notify

daemon-reload 重载配置一下:

systemctl daemon-reload

启动 frp_notify 服务:

systemctl start frp_notify.service
若无报错,则服务启动成功。

再设置开机自启:

systemctl enable frp_notify.service

其余操作命令如下:

# 停止运行服务
systemctl stop frp_notify.service

# 查看服务状态
systemctl status frp_notify.service

Nginx 反代 Gotify Web

Gotify 启动后,其工作的端口可使用浏览器访问,若服务非 80 端口启动,则需指定端口,下面给出 Nginx 反代该服务( Gotify 的文档中有相关配置,此处加上了 SSL ),其 Nginx 的 server 如下:

server {
    listen 80;
    listen 443 ssl http2;
    listen [::]:80;
    listen [::]:443 ssl http2;
    server_name example.com;  # 解析的域名,自定义替换
    
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }

    #SSL配置
    # RSA Cert
    ssl_certificate /xxxxx/fullchain.pem;
    ssl_certificate_key /xxxxx/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384::!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;
    # add_header Strict-Transport-Security "max-age=31536000" always;    # HSTS 设置,按需启用

    error_page 497  https://$host$request_uri;

    location / {
        proxy_pass http://127.0.0.1:10080;
        proxy_redirect default;
        proxy_set_header Host $host;
        
        # WebSockt场景使用,此处使用 WebSocket 通信,若不使用,请注释下方三行
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;

        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;
        
        client_max_body_size 50m; 
        client_body_buffer_size 5m;
        client_body_timeout 60s;
        send_timeout 60s;
        proxy_connect_timeout 60s; 
        proxy_read_timeout 60s; 
        proxy_send_timeout 60s;
        proxy_buffer_size 32k; 
        proxy_buffers 4 16k; 
        proxy_busy_buffers_size 32k;
        proxy_temp_file_write_size 32k; 
        proxy_ignore_client_abort on;
        proxy_intercept_errors on;
    }
    
    # . files
    location ~ /\.(?!well-known) {
        deny all;
    }
    
    # robots.txt
    location = /robots.txt {
        default_type text/html;
        add_header Content-Type "text/plain; charset=UTF-8";
        return 200 "User-Agent: *\nDisallow: /";
    }

    access_log /dev/null;
    error_log /dev/null;
}

按需修改上述的域名、证书、日志等字段并保存上述配置,再操作 Nginx 检查配置文件并重新加载,此时即可通过相关域名访问 Gotify Web了。若为公网服务器,那么其安全组放通的 10080 端口即可关闭,后续操作使用域名访问即可。

另:Gotify 也在 Android 上提供了一个 APP,可前往 Google 应用商店进行下载使用,其通知也会同步到该 APP 上。
End

本文标题:frp_notify + Gotify 实现 FRP 用户上线通知

本文链接:https://www.isisy.com/1380.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2022 年 10 月 09 日
如果觉得我的文章对你有用,请随意赞赏