求Socket服务端程序,防止攻击的解决办法与思路?

linda9989 2012-02-25 01:35:17
WSAAsyncSelect TCP 模式的数据包,按理说正常只有50-200以内的客户端连接数量。

加了心跳包检测(3分钟内如果客户端没响应,服务端将主动关闭连接)

客户端每40秒发送一个心跳包以示存活状态。

但是这个模式是基于消息处理的,假如被攻击的时候,有100客户端,每秒调用2个空的连接(只是connect,什么都不干)

这时候,就容易造成服务端主界面无响应,而其他正常的客户端反而连接不上(提示服务器主动关闭了连接)

如何防止这种大量空的connection造成的攻击?


难道一定要改成IOCP模式吗?
...全文
963 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆弱的肠胃 2012-05-28
  • 打赏
  • 举报
回复
使用VPN如何?
linda9989 2012-05-25
  • 打赏
  • 举报
回复
你要是期待TCP自带的keepAlive的来检测存活,到时候你会死得很难看

当双方网络出现闪断(比如掉电、拔网线、ADSL断线等等),双方是收不到任何信息的,所以心跳包是必须要的。

对于这种网络攻击,目前是没有任何廉价的办法防范,跟你换SOCKET模型也没太大关系。

除非是用到硬件防火墙,当然这种成本也会比较高..
Kaile 2012-03-30
  • 打赏
  • 举报
回复
硬件防火墙是做这个事的,要想安全,恐怕要做点投资
56625079 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

首先可以通过套接字的底层配置解决部分问题:
1、AFD.SYS 保护参数设定
2、SYN攻击保护参数设定
这些都在MSDN上有专门的专题介绍

从用户程序的处理上来看
在连接建立后,应该立即rcv,超时就关闭,并且记录IP,对于恶意攻击的,可以实行封IP
如果应用协议是自己定的,可以加上几个字节的验证,一旦接受到不符合的,立即拉黑名单,封它几个小时
[/Quote]

在ACCEPT之前,有没有办法判断来源IP?
smwhotjay 2012-03-30
  • 打赏
  • 举报
回复
汪宁宇 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
心跳机制解决的主要是已获授权长连接非正常断线的检测问题

对于大量肉鸡的流量攻击,恐怕没有有效的办法,只能是增加服务器,增加带宽,来多少,消化多少
传统的做法,设计一个IP链表,记录其访问频率,如果访问频率超常,就果断拉黑。其实这样做,也是副作用多多的:)
[/Quote]

拉黑?WIN2003有办法拉黑吗?

貌似如果是流量攻击,哪怕单个IP的,机房都无能为力吧
linda9989 2012-03-02
  • 打赏
  • 举报
回复
继续关注,求解决方案....
CppCoder 2012-03-01
  • 打赏
  • 举报
回复
TCP/IP是三、四层的协议

PPTP和L2TP协议工作在OSI模型的第二层
使用VPN不知道能不能防范DDOS攻击

学习,关注

ok1234567 2012-03-01
  • 打赏
  • 举报
回复

心跳机制解决的主要是已获授权长连接非正常断线的检测问题

对于大量肉鸡的流量攻击,恐怕没有有效的办法,只能是增加服务器,增加带宽,来多少,消化多少
传统的做法,设计一个IP链表,记录其访问频率,如果访问频率超常,就果断拉黑。其实这样做,也是副作用多多的:)
fishion 2012-02-26
  • 打赏
  • 举报
回复
心跳机制是很有必要的,tcp的keepalive机制触发的是几分钟甚至几十分钟的
quwei197874 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ok1234567 的回复:]

首先可以通过套接字的底层配置解决部分问题:
1、AFD.SYS 保护参数设定
2、SYN攻击保护参数设定
这些都在MSDN上有专门的专题介绍

从用户程序的处理上来看
在连接建立后,应该立即rcv,超时就关闭,并且记录IP,对于恶意攻击的,可以实行封IP
如果应用协议是自己定的,可以加上几个字节的验证,一旦接受到不符合的,立即拉黑名单,封它几个小时
[/Quote]如果用很多肉鸡来攻击,那可怎么办啊?
stjay 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chenjiawei007 的回复:]

引用 6 楼 chenjiawei007 的回复:
TCP不需要心跳检测的,只要用recv判断返回值是不是-1就可以。

还有connect的这种攻击,可以通过协议来解决,

就是当你accept之后, 放入线程池当中立刻recv接收登陆命令,如果没接收到,那就是非法connect,立刻断开。

当然如果真的用心来攻击你,会模拟你的客户端登陆,这时候你要做限制,限制客户端在10内,……
[/Quote]

每个socket开一个keepalive定时器是不是很浪费?
汪宁宇 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chenjiawei007 的回复:]

TCP不需要心跳检测的,只要用recv判断返回值是不是-1就可以。

还有connect的这种攻击,可以通过协议来解决,

就是当你accept之后, 放入线程池当中立刻recv接收登陆命令,如果没接收到,那就是非法connect,立刻断开。

当然如果真的用心来攻击你,会模拟你的客户端登陆,这时候你要做限制,限制客户端在10内,或者多少50秒内只能同时登陆N次,这样服务器的并发就立……
[/Quote]

WSAAsyncSelect 非阻塞模式,没办法去立即recv
chenjiawei007 2012-02-25
  • 打赏
  • 举报
回复
TCP不需要心跳检测的,只要用recv判断返回值是不是-1就可以。

还有connect的这种攻击,可以通过协议来解决,

就是当你accept之后, 放入线程池当中立刻recv接收登陆命令,如果没接收到,那就是非法connect,立刻断开。

当然如果真的用心来攻击你,会模拟你的客户端登陆,这时候你要做限制,限制客户端在10内,或者多少50秒内只能同时登陆N次,这样服务器的并发就立刻降低下来了。也是现在服务器的主流设计。
汪宁宇 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 playstudy 的回复:]

TCP模式需要心跳检测吗?LZ能告诉我吗?我是新手
[/Quote]

心跳包检测只是为了检测存活,当一方网络出现位置错误时,是收不到FD_CLOSE事件的
quwei197874 2012-02-25
  • 打赏
  • 举报
回复
tcp中如果呗syn洪水攻击了,现在是没什么办法的,就是那些门户网站想新浪什么的也很头疼这个问题
羽飞 2012-02-25
  • 打赏
  • 举报
回复
这不就是网上流传的DDOS攻击吗
心跳还是需要的,要不然也不知道连接什么时候失效
如果担心大量攻击,可以这样,当connect之后,如果在规定的时间内,如果没有消息传过来(一般连接后先做一次握手)就断开这个链接,这样会减少一些无效的连接
向立天 2012-02-25
  • 打赏
  • 举报
回复
基于消息处理不太合理吧
就算不是恶意攻击
当链接量大
并发高的时候不还是会假死么
playStudy 2012-02-25
  • 打赏
  • 举报
回复
TCP模式需要心跳检测吗?LZ能告诉我吗?我是新手
chenjiawei007 2012-02-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chenjiawei007 的回复:]
TCP不需要心跳检测的,只要用recv判断返回值是不是-1就可以。

还有connect的这种攻击,可以通过协议来解决,

就是当你accept之后, 放入线程池当中立刻recv接收登陆命令,如果没接收到,那就是非法connect,立刻断开。

当然如果真的用心来攻击你,会模拟你的客户端登陆,这时候你要做限制,限制客户端在10内,或者多少50秒内只能同时登陆N次,这样服务器的并发就立刻……
[/Quote]

那是设计问题。TCP底层本身就有keepalive设计了,发心跳包专门检测socket是否正常连接是有点浪费的。
加载更多回复(1)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧