firewalld防DDOS攻击配置及模拟测试

规则配置

#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

规则测试

模拟请求测试
模拟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("已收到数据,谢谢"))
	}
}

客户端代码:

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]))
	}
}

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

set GOARCH=amd64
set GOOS=linux
go build main.go -o tcpserv
go build main.go -o tcpcli  

服务端执行命令:

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

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

[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

经测试该限制对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   
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值