起因
最近自己的frp服务器上,老是会被一些莫名其妙的人尝试暴力破击我的远程链接密码,虽然16位大小写数字加特殊字符的密码很难破解,但看着也烦,还影响心情。于是打算自己写一个小工具,分析破解的IP所在地和攻击频率,将它加到防火墙中去直接屏蔽。
步骤分析
1、监听日志
frp 0.36之后的版本是有tcp连接的日志的,格式为2021/08/24 12:04:04 [I] [proxy.go:162] [70107e20979a59c9] [ZNGW] get a user connection [119.1.97.214:3807]
只要实时监听日志文件,并从这个格式中提取出我们需要的 配置的TCP转发名(ZNGW)和请求者IP(119.1.97.214) 就可以了
2、获取IP地理位置
可以通过获取ip位置的一些api接口获取,如http://ip-api.com/json/ip地址字串
?lang=zh-CN
{
status: "success",
country: "中国",
countryCode: "CN",
region: "GZ",
regionName: "贵州",
city: "兴义",
zip: "",
lat: 25.0502,
lon: 104.9877,
timezone: "Asia/Shanghai",
isp: "Chinanet",
org: "Chinanet GZ",
as: "AS4134 CHINANET-BACKBONE",
query: "119.1.97.214"
}
3、根据配置规则决定是否限制
可以指定一张规则表,什么地方的ip可以访问,什么地方的ip不能访问,什么地方的ip访问有频率限制等
# 规则访问
rules:
# 按数组顺序来,匹配到了就按匹配的规则执行,跳过此规则。
# 地区以 http://ip-api.com/json/?lang=zh-CN 查询的结果为准
# 端口: -1 所有端口
# time: 时间区间
# count: 访问次数,-1不限,0限制。其他为 time时间内访问count次,超出频率就限制
- # 中国上海IP允许
port: -1
country: 中国
regionName: 上海
city: 上海
time: 1
count: -1
- # 中国地区IP跳过地域判断
port: -1
country: 中国
regionName:
city:
time: 600
count: 3
- # 其他地区IP禁止
port: -1
country:
regionName:
city:
time: 1
count: 0
4、加入防火墙
linux有iptables和firewall二种防火墙,win中有Microsoft Defender,这些都是可以通过命令行来添加拒绝通过的规则的。
- iptables:
iptables -I INPUT -s 119.1.97.214 -j DROP
- firewall:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="119.1.97.214" reject"
- Microsoft Defender:
netsh advfirewall firewall add rule name=119.1.97.214 dir=in action=block protocol=TCP remoteip=119.1.97.214
大致思路是这样,然后抽空花了点时间,用Go写了一个这样的小工具。完整代码:https://github.com/zngw/frptables
测试
目前已经在frp服务器上运行1天了,效果还是有的,可以明显看日志文件链接数变少了,也添加了几个明显的攻击者IP到防火墙中