Navigation Menu

Skip to content

zngw/frptables

Repository files navigation

GitHub Org's stars

godoc oproxy.cn goreportcard.com deps.dev

watchers stars forks issues branches releases tags license GitHub go.mod Go version (subdirectory of monorepo) GitHub release (latest SemVer) GitHub tag (latest SemVer) GitHub pull requests GitHub issues GitHub code size in bytes GitHub language count GitHub search hit counter GitHub top language

frptables

监控frps日志文件,自定义规则,使用系统自带的防火墙(iptables、firewall、Microsoft Defender)拦截tcp连接的ip,防止暴力破解

前提

1、因为需要用到命令行修改系统防火墙,所以运行程序需要root或管理员权限

2、需要frps在0.36及以上版本,并且开启日志功能,日志输出等级为info。

#日志输出,可以设置为具体的日志文件或者console
log_file = /usr/local/frp/log/frps.log

#日志记录等级,有trace, debug, info, warn, error
log_level = info

tcp连接日志格式为 2021/08/21 15:35:29 [I] [proxy.go:162] [f1aec30e84827422] [ZNGW] get a user connection [210.0.159.76:32832]

如果日志格式发生了调整,需要修改rules/parse.go中的解析规则

注意

本程序只对frp日志进行分析,添加防火墙阻止消息,若有误加入防火墙的,需要手动删除。

配置

# frps日志文件
frps_log: ./log/frps.log

# 输出日志目录
logs: ./tlog/

# frps 名字端口对应配置
name_port:
  "ZNGW": 3389

# 启用防火墙类型 iptables / firewall / md (Microsoft Defender)
tables_type: iptables

# ip白名单:
allow_ip:
  - 127.0.0.1

# 端口白名单
allow_port:
  - 80
  - 443

# 规则访问
rules:

  # 按数组顺序来,匹配到了就按匹配的规则执行,跳过此规则。
  # 地区 country-国家, regionName-省名,名字中不带省字, city-市名,名字中也不带市字
  # 端口: -1 所有端口
  # time: 时间区间
  # count: 访问次数,-1不限,0限制。其他为 time时间内访问count次,超出频率就限制

  - # 中国上海IP允许
    port: -1
    country: 中国
    regionName: 上海
    city: 上海
    time: 1
    count: -1

  - # 中国地区IP 10分钟3次,超出这频率添加防火墙
    port: -1
    country: 中国
    regionName: 浙江
    city:
    time: 600
    count: 3

  - # 其他地区IP 直接加入防火墙
    port: -1
    country:
    regionName:
    city:
    time: 1
    count: 0

启动

直接使用nohup ./frptables -c config.yml &启动

也可以新建/etc/systemd/system/frptables.service文件加入系统,以服务方式启动

[Unit]
Description=frps daemon
After=syslog.target  network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frptables -c /usr/local/frp/config.yml
Restart= always
RestartSec=1min

[Install]
WantedBy=multi-user.target