当前位置:   article > 正文

firewalld防DDOS攻击配置及模拟测试_firewall 限制ip每秒连接数

firewall 限制ip每秒连接数

规则配置

#firewall 接受 tcp syn 即rst 包的频率 限制 暂定 200/s 可根据实际测试结果和服务器配置进行调整
pak_num_limit=200
pak_limit_burst=600
#限制每个ip最大同时连接数
ip_max_conn_limit=2
#-Syn 洪水攻击(--limit 1/s 限制syn并发数每秒1次)
# ipv4
echo 'add  ipv4 syn limit .....'
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 4   -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST SYN -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT  5   -p tcp --dport 22  --tcp-flags SYN,ACK,FIN,RST SYN -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 4   -p tcp --dport 80 --tcp-flags SYN,ACK,FIN,RST SYN -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT  5   -p tcp --dport 80  --tcp-flags SYN,ACK,FIN,RST SYN -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 4   -p tcp --dport 443 --tcp-flags SYN,ACK,FIN,RST SYN -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT  5   -p tcp --dport 443  --tcp-flags SYN,ACK,FIN,RST SYN -j $def_reject_policy
# ipv6
echo 'add  ipv6 syn limit .....'
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 4   -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST SYN -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT  5   -p tcp --dport 22  --tcp-flags SYN,ACK,FIN,RST SYN -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 4   -p tcp --dport 80 --tcp-flags SYN,ACK,FIN,RST SYN -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT  5   -p tcp --dport 80  --tcp-flags SYN,ACK,FIN,RST SYN -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 4   -p tcp --dport 443 --tcp-flags SYN,ACK,FIN,RST SYN -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT  5   -p tcp --dport 443  --tcp-flags SYN,ACK,FIN,RST SYN -j $def_reject_policy

# 扫描 flood 
# ipv4 
echo 'add  ipv4 rst limit .....'
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 4   -p tcp  --dport 22   --tcp-flags SYN,ACK,FIN,RST RST -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT  5   -p tcp --dport 22  --tcp-flags SYN,ACK,FIN,RST RST -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 4   -p tcp  --dport 80   --tcp-flags SYN,ACK,FIN,RST RST -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT  5   -p tcp --dport 80  --tcp-flags SYN,ACK,FIN,RST RST -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 4   -p tcp  --dport 443   --tcp-flags SYN,ACK,FIN,RST RST -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT  5   -p tcp --dport 443  --tcp-flags SYN,ACK,FIN,RST RST -j $def_reject_policy
#ipv6 
echo 'add  ipv6 rst limit .....'
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 4   -p tcp  --dport 22   --tcp-flags SYN,ACK,FIN,RST RST -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT  5   -p tcp --dport 22  --tcp-flags SYN,ACK,FIN,RST RST -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 4   -p tcp  --dport 80   --tcp-flags SYN,ACK,FIN,RST RST -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT  5   -p tcp --dport 80  --tcp-flags SYN,ACK,FIN,RST RST -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 4   -p tcp  --dport 443   --tcp-flags SYN,ACK,FIN,RST RST -m limit  --limit $pak_num_limit/s --limit-burst $pak_limit_burst -j ACCEPT
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT  5   -p tcp --dport 443  --tcp-flags SYN,ACK,FIN,RST RST -j $def_reject_policy

#限制每个客户端最大链接数
# ip6
echo 'add  ipv6 conn  limit .....'
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --syn --dport 80 -m connlimit --connlimit-above $ip_max_conn_limit -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --syn --dport 22 -m connlimit --connlimit-above $ip_max_conn_limit -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --syn --dport 443 -m connlimit --connlimit-above $ip_max_conn_limit -j $def_reject_policy
# ip4
echo 'add  ipv4 conn  limit .....'
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --syn --dport 80 -m connlimit   --connlimit-above $ip_max_conn_limit -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --syn --dport 22 -m connlimit  --connlimit-above $ip_max_conn_limit -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --syn --dport 443 -m connlimit --connlimit-above $ip_max_conn_limit -j $def_reject_policy

# 其他 攻击包 过滤 
# ipv4
echo 'add  ipv4  risk  pak drop policy .....'
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --tcp-flags ALL ALL -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --tcp-flags ALL FIN,PSH,URG -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --tcp-flags ALL NONE -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --tcp-flags SYN,RST SYN,RST -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv4 filter INPUT 3 -p tcp --tcp-flags SYN,FIN  SYN,FIN -j $def_reject_policy
# ipv6
echo 'add  ipv6  risk  pak drop policy .....'
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --tcp-flags ALL NONE -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --tcp-flags SYN,RST SYN,RST -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --tcp-flags SYN,FIN  SYN,FIN -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --tcp-flags ALL ALL -j $def_reject_policy
firewall-cmd --direct --permanent  --add-rule ipv6 filter INPUT 3 -p tcp --tcp-flags ALL FIN,PSH,URG -j $def_reject_policy
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

规则测试

模拟请求测试
模拟tcp flood请求工具有 hping 和 nping hping 不支持ipv6 因此 最好使用 nping 来进行测试。两个工具都是 kali机的自带工具。可以直接下载kali虚拟机然后进行测试,也可自行百度安装。

– -6 表示测试ipv6 , 默认ipv4 端口 22 tcp请求 请求头标志位 syn fd15:4ba5:5a2b:1008:5bd8:79c3:7405:ca47 是ip地址,-c 100表示连续请求100次
nping -6 --tcp -p 22 --flags syn fd15:4ba5:5a2b:1008:5bd8:79c3:7405:ca47 -c100

最大连接数测试
最大连接数测试可以通过 编写tcp 服务端和客户端程序,在机器上进行连接数量测试,这里使用go语言编写,
服务端代码:

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
	"os"
)

func main(){
	log.Println("程序运行参数:",os.Args)
	if len(os.Args)>1 && len(os.Args[1])>0{
		log.Println("====>监听地址端口:",os.Args[1])
	}else{
		log.Println(" 没有参数!")
		return
	}
	fmt.Println("服务启动...")
	listen,err := net.Listen("tcp",os.Args[1])
	if(err != nil){
		fmt.Println("listen failed,err:",err)
		return
	}
	for{
		conn,err := listen.Accept()
		if(err != nil){
			fmt.Println("accept failed ,err:",err)
			continue
		}
		//开启携程处理
		go process(conn)
	}
}

func process(conn net.Conn) {
	defer conn.Close()
	for{
		reader:=bufio.NewReader(conn)
		var buf [128]byte
		n,err := reader.Read(buf[:])
		if err!=nil {
			fmt.Println("read from client failed err:",err)
			break

		}
		recvStr := string(buf[:n])
		fmt.Println("recvStr:",recvStr)
		conn.Write([]byte("已收到数据,谢谢"))
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

客户端代码:

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
	"os"
	"strings"
)

func main(){
	log.Println("程序运行参数:",os.Args)
	if len(os.Args)>1 && len(os.Args[1])>0{
		log.Println("====>监听地址端口:",os.Args[1])
	}else{
		log.Println(" 没有参数!")
		return
	}
	//conn,err:=net.Dial("tcp",fmt.Sprint("192.168.47.10:",os.Args[1]))
	conn,err:=net.Dial("tcp",os.Args[1])
	if err != nil{
		fmt.Println("连接主机错误,err:",err)
		return

	}
	defer conn.Close()
	ir:=bufio.NewReader(os.Stdin)
	for{
		fmt.Print("请输入发送内容:")
		input,_ := ir.ReadString('\n')
		inputInfo := strings.Trim(input,"\r\n")
		if strings.ToUpper(inputInfo)=="Q"{
			fmt.Println("收到退出指令,开始推出。。。")
			return
		}
		_,err = conn.Write([]byte(inputInfo))
		if err != nil {
			return
		}
		var buf [512]byte
		n,err := conn.Read(buf[:])
		if err != nil {
			return
		}
		fmt.Println(string(buf[:n]))
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

将上述代码分别编译成可执行程序 部署到需要测试的服务器,然后进行连接测试即可。
编译命令

set GOARCH=amd64
set GOOS=linux
go build main.go -o tcpserv
go build main.go -o tcpcli  
  • 1
  • 2
  • 3
  • 4

服务端执行命令:

tcpserv  ip:port      --运行并监听指定ip和端口 如 192.168.47.10:80
tcpcli  ip:port      --连接服务端所在的ip和监听的端口 如 192.168.47.10:80
  • 1
  • 2

通过如下命令查看 连接数,超过限制连接数时是否可以继续增加连接

[root@localhost ~]# netstat -an|grep fe80
tcp6       0      0 fe80::afb9:dd2b:a39b:22 fe80::f91e:ad1:62:27123 ESTABLISHED
tcp6       0      0 fe80::afb9:dd2b:a39b:22 fe80::f91e:ad1:62:27141 ESTABLISHED
tcp6       0      0 fe80::afb9:dd2b:a39b:22 fe80::f91e:ad1:626:1329 ESTABLISHED
tcp6       0      0 fe80::afb9:dd2b:a39b:22 fe80::f91e:ad1:62:27130 ESTABLISHED
  • 1
  • 2
  • 3
  • 4
  • 5

经测试该限制对ip6不起作用。
通过 ip(6)tables -nvL 查看 防火墙各规则命中数,如果超限时 被规则 命中并拦截 证明规则生效,如下该规则 被命中5次

[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 974 packets, 72397 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    5   260 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 #conn src/32 > 3 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 754 packets, 79106 bytes)
 pkts bytes target     prot opt in     out     source               destination   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/669615
推荐阅读
相关标签
  

闽ICP备14008679号