Gin+Fail2ban+Cloudfare实现防爆破等

前言:

最近受某学长刺激,授权爆破他的网站,短时间内就被他的网站防住了~

好滴~ 最近又开始捣鼓服务器了,我也想搞~ 所以我就简单说一下我的实现。

以下我简单说下我的思路来实现防爆破与CC等攻击:👇

  1. 通过Cloudfare获取到原始IP
  2. Fail2ban读取日志
  3. 回调通知Cloudfare进行防御

要用到的有:Gin框架nginx服务器cloudfare免费版Fail2ban工具

获取到原始IP

其实有个思路是已经有模块与nginx进行二进制编译后

access日志就已经是原始IP了,但是刚好我是后端接口怼的CF

那么我为什么不写个中间件然后模拟Nginx日志结构,同样实现日志。

说干就干,下面直接贴代码: (实现了高并发下的读写

package middleware

import (
	"GoBackEnd/common" // 这里自己改下
	"fmt"
	"github.com/gin-gonic/gin"
	"io"
	"io/ioutil"
	"os"
	"sync"
	"time"
)

// NginxLogMiddleware 为记录CF原始IP
func NginxLogMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		var bodySize int
		// todo 拿到目录路径
		nginxPath := common.Path("access.log") // 自己写个函数获取哈~
		// todo 拿到将要合成的信息
		ip := c.ClientIP()
		utcTimeStr := time.Now().Format("02/Jan/2006:15:04:05")
		url := c.Request.URL
		method := c.Request.Method
		status := c.Writer.Status()
		body, err := ioutil.ReadAll(c.Request.Body)
		http := c.Request.Proto
		if err != nil {
			bodySize = -1
		}
		bodySize = len(body)
		header := c.Request.UserAgent()
		// todo 写入标准格式
		res := fmt.Sprintf("%v - - [%v +8000] \"%v %v %v\" %v %v \"-\" \"%v\"", ip, utcTimeStr, method, url, http, status, bodySize, header) // 因为是东八区我就写死了
		// todo 写入文件
		file, _ := os.OpenFile(nginxPath, os.O_WRONLY|os.O_APPEND, 0666)
		defer file.Close()
		wr := &SyncWriter{sync.Mutex{}, file} // 添加上锁
		wg := sync.WaitGroup{}
		wg.Add(1)
		go func(content string) { // fork子协程去写
			fmt.Fprintln(wr, content)
			wg.Done()
		}(res)
		wg.Wait()
		c.Next()
	}
}

type SyncWriter struct {
	m      sync.Mutex
	Writer io.Writer
}

func (w *SyncWriter) Write(b []byte) (n int, err error) {
	w.m.Lock()
	defer w.m.Unlock()
	return w.Writer.Write(b)
}
image-20220225101411647

然后直接放到默认路由里面,所有流量都要走~

image-20220225101614873 image-20220225101648740

Fail2ban的安装与设置

$ sudo apt install fail2ban
$ systemctl stop fail2ban
$ cd /etc/fail2ban

这里说下Fail2ban的加载文件规则:依次进行

  • /etc/fail2ban/jail.conf
  • /etc/fail2ban/jail.d/*.conf
  • /etc/fail2ban/jail.local
  • /etc/fail2ban/jail.d/*.local

我们需要做的就是: 分别写入匹配规则与拉黑设置

$ cd /etc/fail2ban/jail.d
$ vim nginxcc.conf # 开始写入
##############################
[nginxcc]                                                                                                             
enabled = true                                                                                                        
port = http,https  # 禁止80 443                                                                                                   
filter = nginxcc      # 使用的是哪个                                                                                                
logpath = /home/ubuntu/HengY1Service/access.log # 框架里面配置的日志                                                       
bantime = 1200    # 被禁止多久                                                                                   
findtime = 30     # 扫描多长时间的                                                                                   
maxretry = 10     # 单位时间内次数                                                                                      
action = %(action_mwl)s   # 调用cloudfare内置脚本                                                                                      
         custom-cloudflare   # custom-cloudflare是后面要自己写的
         
:wq
##############################
$ cd /etc/fail2ban/filter.d
$ vim nginxcc.conf
##############################
[Definition]
failregex =(?i)^<HOST> .* "(GET|POST|HEAD).*HTTP.*" (404|503) .*$
ignoreregex =.*(robots.txt|favicon.ico|jpg|png|webp|js|css)

:wq
##############################

然后验证下自己写对没:access.log最好有点东西

$ fail2ban-regex /home/ubuntu/HengY1Service/access.log /etc/fail2ban/filter.d/nginxcc.conf
$ systemctl restart fail2ban
$ fail2ban-client status # 看下nginxCC开启没
$ fail2ban-client status nginxcc
$ fail2ban-client set nginxcc unbanip 1.1.1.1 # 解封你要的IP
image-20220225102817422

通知Cloudfare进行防御

到这里的话还是不行的,因为你虽然拿到了源IP,但是是过CDN过来的IP你没有封

但是Fail2ban已经考虑到了,提供了脚本。这就是为什么要设置action

$ cd /etc/fail2ban/action.d
$ cp cloudflare.conf custom-cloudflare.conf
$ vim custom-cloudflare.conf # 翻看到最下面
# 填写 cftoken 与 cfuser cfuser就是你注册的邮件 cftoken 是GlobalToken
$ systemctl restart fail2ban
image-20220225103713641

然后可以自己试试效果了~ (我的是:api.hengy1.top) 可以来试试效果

image-20220225103819706 image-20220225104523559

总结:

逼逼两句:

  1. 构造日志参数与高并发读写要注意
  2. 正则匹配必须有<HOST>,正则测试https://regex101.com/
  3. 一定要CF来防御,思路得先串通
  4. Fail2ban有点反应延迟
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准库中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用Gin和WebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准库中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用GolangGin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准库中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang Gin和WebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用GinGolang的标准库来构建强大的Web应用程序,并处理WebSocket通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值