P4 DDoS Defense

SYN-Flood Defense based P4

Posted by Boyu Cai on Saturday, April 30, 2022

SYN+ ECMP

Idea

ECMP:

根据数据包传输路径和地址来计算哈希值,并对哈希值进行求模运算,将值与端口进行映射,来达到随机情况下的链路数据包的负载均衡。

SYN Defense

基于P4的寄存器来对SYN进行计数,防御策略请阅读SYN DEFENSE,在此处我们进行对防御流表周期性的替换,让攻击者难以获取防御节点和防御策略,通过P4-Utils控制器来对交换机的流表进行随即替换。

Topology

multi_hop_topo

  • s1 s6 交换机负责安装负载均衡计算流表
  • s2 s3 s4 s5 负责进行数据包的清洗

P4 Switch

ECMP Implementation

使用v1mode内置哈希函数进行哈希值的计算,通过对ipv4.srcAddripv4.dstAddrtcp.srcPort tcp.dstPortipv4.protocol进行哈希计算,通过设置最大值4,将结果控制在0~3之间。然后在流表中建立端口与哈希值的单值映射。

P4 Code:

hash(meta.ecmp_hash,
	    HashAlgorithm.crc16,
	    (bit<1>)0,
	    {
          hdr.ipv4.srcAddr,
	      hdr.ipv4.dstAddr,
          hdr.tcp.srcPort,
          hdr.tcp.dstPort,
          hdr.ipv4.protocol
        },
	      num_nhops);

详细参数如下:

@pure
extern void hash<O, T, D, M>(out O result, in HashAlgorithm algo, in T base, in D data, in M max);

Table rule

table_add ecmp_group_to_nhop set_nhop 1 0 =>  00:00:00:02:01:00 2
table_add ecmp_group_to_nhop set_nhop 1 1 =>  00:00:00:03:01:00 3
table_add ecmp_group_to_nhop set_nhop 1 2 =>  00:00:00:04:01:00 4
table_add ecmp_group_to_nhop set_nhop 1 3 =>  00:00:00:05:01:00 5

在流表中,我们将哈希值02号端口映射,其余值类推可得。

SYN-Defense

核心代码与SYN DEFENSE类似,在此不再赘述。

详细代码参照https://github.com/dmucby/P4-Defense/tree/master/SYN%2BECMP

Controller

借用P4-Utils天生对P4交换机的支持,我们进行如下设定,在一段周期内,控制器将随机对s2 s3 s4 s5 交换机进行随机选择两个交换机部署防御流表规则,在进行下一周期时,交换机需要重置,因此我们需要补充转发流表规则。

Defense deployment

nums = [0,0,0,0,0,0]
table1 = random.randint(1,4)
table2 = random.randint(1,4)
nums[table1] = 1
nums[table2] = 1

for i in range(6):
   if(nums[i] == 1):
      sw = "s" + str(i)
      self.controller[sw].table_add("syn_counters", "syn_defence_action", ["1"])

Experimental

我们使用同样的攻击工具hping3,让h1h2发动SYN-FloodDDoS攻击,通过监控数据包的流量来查看防御效果,由于个人电脑内存限制,我们只进行百万数据包级别的攻击测试。

h1终端使用如下攻击命令:

hping3 -q -n -S -p 5001 --faster 10.0.6.2 

Result

微信截图_20220429180843

通过实验结果可看出,h1s1-eth1端口发出攻击数据包,然后s2 s3 s4 s4 均衡收集到数据包,并从出口eth2看出数据包进行清洗,s6eth2端口收到了少量的攻击包。

Experimental summary

由于策略的设定,主机可能会收到少部分攻击流数据包,但由于只部署部分防御流表规则,大大减少了防御开销,对于这样的结果,也可以接受。但本实验存在一定漏洞,需要在后续工作中进行改正。