使用HAProxy防范简单的DDos攻击
程序员文章站
2022-07-13 17:34:36
...
第一部分: 系统级防护
1.TCP syn flood 攻击
syn flood攻击是通过发送大量SYN包到一台服务器,使其饱和或者至少造成其上行带宽饱和。
如果攻击规模很大,已经撑满了你的所有Internet带宽,那么唯一的方法就是请求你的ISP给与协助。
我们本地的HAProxy上可以做一点简单防护,聊胜于无。
修改/etc/sysctl.conf,加入如下内容:
# Protection SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 1024
第二部分: HAProxy的防护功能
HAProxy 1.5版本中多了一些有趣的功能,我们可以拿来防范一些小规模的攻击行为。
主要是stick-table表中可以存储额外的附加信息了。
形式如下:
stick-table type {ip | integer | string [len ] | binary [len ]} size [expire ] [nopurge] [peers ] [store ]*
每个主机只能有一个stick-table,表中能存储的额外信息类型如下:
- server_id : 用户请求被分配到的服务器的ID。形式为整数。
这个值可以被"stick match", "stick store","stick on"规则使用。
It is automatically enabled when referenced.
- gpc0 : 第一个通用计数器,形式为一个正32位整数。
可以用于任何东西。通常会用于给一些特定的entry打tag。
- conn_cnt : Connection计数器,形式为一个正32位整数。
记录了匹配当前entry的,从一个客户端处接收到的连接的绝对数量。
这个数量并不意味着被accepted的连接数量,单纯就是收到的数量。
- conn_cur : 当前连接数,形式为一个正32位整数。
当一新连接匹配指定的entry的时候,这个数值增加。
当连接结束的时候,这个数值减少。
通过这个值可以了解一个entry上任意时间点的准确的连接数。
- conn_rate() : connection的连接频率 (takes 12 bytes).
这个值统计指定时间范围内(毫秒为单位)进来的connection的频率。
这个数值可以通过ACL匹配一些规则。
- sess_cnt : Session计数器,形式为一个正32位整数。
记录了匹配当前entry的,从一个客户端处接收到的session的绝对数量。
一个session指的是一个已经被layer 4规则接受的connection。
- sess_rate() : session的连接频率 (takes 12 bytes).
这个值统计指定时间范围内(毫秒为单位)进来的session的频率。
这个数值可以通过ACL匹配一些规则。
- http_req_cnt : HTTP请求计数器,形式为一个正32位整数。
记录了匹配当前entry的,从一个客户端接受到的HTTP请求的绝对数量。
无论这个请求是合法还是非法。
1.TCP syn flood 攻击
syn flood攻击是通过发送大量SYN包到一台服务器,使其饱和或者至少造成其上行带宽饱和。
如果攻击规模很大,已经撑满了你的所有Internet带宽,那么唯一的方法就是请求你的ISP给与协助。
我们本地的HAProxy上可以做一点简单防护,聊胜于无。
修改/etc/sysctl.conf,加入如下内容:
# Protection SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 1024
第二部分: HAProxy的防护功能
HAProxy 1.5版本中多了一些有趣的功能,我们可以拿来防范一些小规模的攻击行为。
主要是stick-table表中可以存储额外的附加信息了。
形式如下:
stick-table type {ip | integer | string [len ] | binary [len ]} size [expire ] [nopurge] [peers ] [store ]*
每个主机只能有一个stick-table,表中能存储的额外信息类型如下:
- server_id : 用户请求被分配到的服务器的ID。形式为整数。
这个值可以被"stick match", "stick store","stick on"规则使用。
It is automatically enabled when referenced.
- gpc0 : 第一个通用计数器,形式为一个正32位整数。
可以用于任何东西。通常会用于给一些特定的entry打tag。
- conn_cnt : Connection计数器,形式为一个正32位整数。
记录了匹配当前entry的,从一个客户端处接收到的连接的绝对数量。
这个数量并不意味着被accepted的连接数量,单纯就是收到的数量。
- conn_cur : 当前连接数,形式为一个正32位整数。
当一新连接匹配指定的entry的时候,这个数值增加。
当连接结束的时候,这个数值减少。
通过这个值可以了解一个entry上任意时间点的准确的连接数。
- conn_rate() : connection的连接频率 (takes 12 bytes).
这个值统计指定时间范围内(毫秒为单位)进来的connection的频率。
这个数值可以通过ACL匹配一些规则。
- sess_cnt : Session计数器,形式为一个正32位整数。
记录了匹配当前entry的,从一个客户端处接收到的session的绝对数量。
一个session指的是一个已经被layer 4规则接受的connection。
- sess_rate() : session的连接频率 (takes 12 bytes).
这个值统计指定时间范围内(毫秒为单位)进来的session的频率。
这个数值可以通过ACL匹配一些规则。
- http_req_cnt : HTTP请求计数器,形式为一个正32位整数。
记录了匹配当前entry的,从一个客户端接受到的HTTP请求的绝对数量。
无论这个请求是合法还是非法。