Chinaunix首页 | 论坛 | 博客
  • 博客访问: 437532
  • 博文数量: 71
  • 博客积分: 26
  • 博客等级: 民兵
  • 技术积分: 1246
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 14:46
个人简介

linux --- 一切皆文件

文章分类

全部博文(71)

文章存档

2021年(1)

2019年(2)

2018年(4)

2017年(7)

2016年(11)

2015年(1)

2014年(2)

2013年(33)

2012年(10)

分类: LINUX

2018-08-13 14:38:27

负载均衡配置如下:
公网VIP:12.12.12.12,监听协议:UDP,监听端口:53
负载本机服务:协议 TCP,监听端口:22

黑客可通过 12.12.12.12访问TCP 22端口,进行成功建立三次握手。
原因如下:
1. 黑客发送syn包到12.12.12.12 TCP 22端口,此时lvs会新建会话,会话新建失败,因为没有相应的规则。因此将此报文发送到本机linux协议栈。
2. 本机回复syn-ack报文,到达黑客主机
3. 黑客主机回应ack报文,此时lvs查找会话失败,进入新建流程,新建流程中判断代码如下:
static int tcp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_protocol *pp, int *verdict, struct ip_vs_conn **cpp)函数中有如下逻辑:
if (!th->syn && sysctl_ip_vs_tcp_drop_entry &&
(svc = ip_vs_lookup_vip(af, iph.protocol, &iph.daddr))) {
IP_VS_INC_ESTATS(ip_vs_esmib, DEFENCE_TCP_DROP);
*verdict = NF_DROP;
return 0;
}
首先不是syn包,并且此VIP上有tcp监听,才会丢弃此报文。但是现在此VIP上没有TCP监听,因此ACK报文又进入Linux协议栈导致三次握手成功。
4. 黑客就可以和lvs本机监听的22端口进行通信,从而进行探测行动。

临时修复方案:
在公网VIP:12.12.12.12,监听协议:UDP,监听端口:53,同时也监听TCP 80端口,但是TCP 80端口不映射RS,此时可以缓解此问题。
流程如下:
1. 黑客发送syn包到12.12.12.12 TCP 22端口,此时lvs会新建会话,会话新建失败,因为没有相应的规则。因此将此报文发送到本机linux协议栈。
2. 本机回复syn-ack报文,到达黑客主机
3. 黑客主机回应ack报文,此时lvs查找会话失败,进入新建流程,新建流程中判断代码如下:
if (!th->syn && sysctl_ip_vs_tcp_drop_entry &&
(svc = ip_vs_lookup_vip(af, iph.protocol, &iph.daddr))) {
IP_VS_INC_ESTATS(ip_vs_esmib, DEFENCE_TCP_DROP);
*verdict = NF_DROP;
return 0;
}
首先不是syn包,并且此VIP上有tcp监听,因此会将三次握手的最后那个ack报文给丢弃掉,从而导致三次握手失败。

总结
但是其实临时修复方案中,还是会有syn包进入本地,其实业务的syn包进入本地是不被允许的,因此要进行二次开发,在VIP进入本机协议栈之前进行拦截并丢弃处理。

阅读(3842) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~