• 创建frp插件用来管理SSH连接的IP和通知用户信息


    内容转载自我的博客

    1. 插件说明和示例

    本代码运行在特定端口用于监听frp的RPC消息并进行处理,包括通知用户frp连接信息和阻止特定IP段登录的功能。

    • frp-client登录时(Login),插件会发送以下消息
    frp-client登录
    frp版本:0.33.0
    主机ID:23d28e11011b3344
    主机名:
    系统类型:linux
    系统架构:amd64
    登录时间:2020-07-09 18:34:36
    连接池大小:5
    
    • frp-client创建代理时(NewProxy),插件会发送以下消息
    frp-client建立穿透代理
    主机ID:23d28e11011b3344
    代理名称:ssh_room02
    代理类型:tcp
    远程端口:8001
    
    • 用户尝试连接内网机器时(NewUserConn),插件会发送以下消息
    用户连接内网机器
    内网主机ID:23d28e11011b3344
    代理名称:ssh_room02
    代理类型:tcp
    登录时间:2020-07-09 18:39:01
    用户IP和端口:202.103.44.150:63017
    用户位置:湖北省武汉市 电信
    允许用户连接:True
    

    若用户IP在拒绝名单,则返回False,被拒绝连接的用户在终端显示如下信息:

    zfb@super-pc:~/$ ssh -p 8001 myserver@67.89.12.34
    kex_exchange_identification: Connection closed by remote host
    zfb@super-pc:~/$ 
    

    本插件所有代码均在仓库frp_info中可查看使用

    2. frp服务端插件开发

    frp服务端插件的工作原理见server_plugin_zh.md。简单来说就是我们创建的插件需要提供一个web服务,frp会在收到指定操作时把相关信息通过POST请求来发送给特定的url,而插件收到请求后可以根据内容来决定frp如何处理相关操作。若文件frps.ini添加以下内容

    [plugin.frp-info]
    addr = 127.0.0.1:6666
    path = /handler
    ops = Login,NewProxy,NewWorkConn,NewUserConn
    

    这表明frp会在收到Login, NewProxy, NewWorkConn, NewUserConn中的任意一种操作时将该操作的相关信息发送给插件,由插件决定是否进行下一步操作,插件的工作步骤如下:

    • 监听127.0.0.1:6666
    • 创建/handler路由
    • 接收frp的post请求发来的json数据
    • 根据数据决定返回值
    • 返回json数据

    示例中的监听端口、路由名称、操作类型均可以自定义,开发插件也可以使用任何喜欢的编程语言,由于本人对Go语言不甚熟悉,所以采用python编写代码

    3. frp-info插件使用说明

    3.1 创建虚拟环境

    插件基于python3编写,搭建flask服务(运行在虚拟环境),在当前项目主目录下创建虚拟环境并安装库:

    #! /bin/bash
    # 自动安装venv管理虚拟环境
    sudo apt-get install python3-venv -y
    # 创建虚拟环境venv
    python3 -m venv venv
    # 激活虚拟环境并安装库
    source venv/bin/activate && pip install  -r requirements.txt && deactivate
    

    3.2 修改配置文件

    1. 修改frps.ini文件,添加以下内容
    [plugin.frp-info]
    addr = 127.0.0.1:6666
    path = /handler
    ops = Login,NewProxy,NewWorkConn,NewUserConn
    
    1. 修改uwsgi_frp-info.ini文件来配置uwsgi启动参数,保证http监听端口与步骤1设置一致
    2. 更改config.py来修改flask安全秘钥以及钉钉群机器人的安全秘钥和接口秘钥

    3.3 运行代码

    然后在项目主目录下输入以下命令测试启动uwsgi及插件frp-info:
    source venv/bin/activate && uwsgi --ini uwsgi_frp-info.ini -d /dev/null && deactivate
    此时可通过cat ./log/frp-info.log查看日志,或通过lsof -i:6666查看端口占用
    最后重启frps服务service frps restart即可实现插件的安装配置

    4. 添加插件自启动

    修改frp-info.service文件的uwsgi路径和配置文件路径为本机的路径,修改用户为本机的用户名

    [Unit]
    Description=Frp-info service
    After=network.target
    
    [Service]
    Type=simple
    User=ubuntu
    Restart=on-failure
    RestartSec=5s
    WorkingDirectory=/home/ubuntu/frp-info
    ExecStart=/home/ubuntu/frp-info/venv/bin/uwsgi --ini /home/ubuntu/frp-info/uwsgi_frp-info.ini
    
    [Install]
    WantedBy=multi-user.target
    

    然后将此文件移动到系统服务目录:sudo mv ./frp-info.service /etc/systemd/system/
    启动开机自启功能:systemctl enable frp-info
    手动运行服务:service frp-info start
    则所有配置完成,插件已正常工作,若重新启动系统,则frpsfrp-info的service都会启动

    5. 服务管理的命令

    重载服务后台(手动修改service文件后执行):sudo systemctl daemon-reload
    关闭服务:service frp-info stop
    手动重启服务:service frp-info restart
    查看开机自启的服务:systemctl list-unit-files --type=service|grep enabled

    ubuntu@VM-16-13-ubuntu:~/$ systemctl status frp-info.service
    ● frp-info.service - Frp-info service
       Loaded: loaded (/etc/systemd/system/frp-info.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2020-07-08 23:33:29 CST; 4min 41s ago
     Main PID: 5040 (uwsgi)
        Tasks: 14 (limit: 2122)
       CGroup: /system.slice/frp-info.service
               ├─5040 /home/ubuntu/frp-info/venv/bin/uwsgi --ini /home/ubuntu/frp-info/uwsgi_frp-info.ini
               ├─5057 /home/ubuntu/frp-info/venv/bin/uwsgi --ini /home/ubuntu/frp-info/uwsgi_frp-info.ini
               ├─5058 /home/ubuntu/frp-info/venv/bin/uwsgi --ini /home/ubuntu/frp-info/uwsgi_frp-info.ini
               ├─5059 /home/ubuntu/frp-info/venv/bin/uwsgi --ini /home/ubuntu/frp-info/uwsgi_frp-info.ini
               ├─5060 /home/ubuntu/frp-info/venv/bin/uwsgi --ini /home/ubuntu/frp-info/uwsgi_frp-info.ini
               └─5063 /home/ubuntu/frp-info/venv/bin/uwsgi --ini /home/ubuntu/frp-info/uwsgi_frp-info.ini
    
    Jul 08 23:35:43 VM-16-13-ubuntu uwsgi[5040]: [pid: 5059|app: 0|req: 3/13] 127.0.0.1 () {34 vars in ...
    ubuntu@VM-16-13-ubuntu:~/$
    
  • 相关阅读:
    记某农信社面试
    sublime2 c++的一些使用配置
    switch case
    sizeof与strlen的区别 浅谈
    求最大公约数
    Android基础控件——PopupWindow模仿ios底部弹窗
    Android基础控件——ListView实现时间轴效果
    Android基础控件——CardView的使用、仿支付宝银行卡
    Android基础控件——AlertDialog、ProgressDialog实现单选对话框、多选对话框、进度条对话框、输入框对话框
    Android基础——适配安卓6.0新权限系统
  • 原文地址:https://www.cnblogs.com/zfb132/p/14193350.html
Copyright © 2020-2023  润新知