创建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:~/$
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容