开发的TM软件受到硬件防火墙阻击,不明白!(200分)

Z

zbzb

Unregistered / Unconfirmed
GUEST, unregistred user!
2002年帮公司编写的内部即时聊天TM软件(类似QQ这样的软件,功能当然没有QQ强大),用Delphi7编写的,网络采用UDP协议,使用IndyUDP控件,客户端和服务端之间采用心跳包来维持对方的状态,心跳包大约在15-25秒之间(随机)互发发送一次,心跳包非常小,仅“包头+状态+当前时间”。
多年以来,该TM软件使用都很正常(登录用户稳定在300以上,分布在多个省市),但最近公司给各个分支机构部署了硬件防火墙,却碰到问题,就是该TM软件确会出现不同程度的自动断线,而且断线后就一直无法登录。
经过初步检查发现,客户端是因为无法收到服务器的心跳包而断线的;同时断线后,该客户端所在机器就无法访问服务端的对应端口!从而导致无法登录!但关闭客户端程序15分钟左右后再开启,则又可以登录了,但过一段时间还是会断线,就是说进入上述问题的循环了。
硬件防火墙目前试用过两个品牌共三个版本的(国产的一个,美国的CheckPoint的两个),其中仅CheckPoint的一个版本不会导致上述问题,其他的两种防火墙都会。CheckPoint防火墙方面认为应该是心跳包被认为是攻击包而被阻击所造成,但无法防火墙配置,而国产防火墙则说他们根本没有限制。
现在,领导要从程序的角度去解决问题,大家认为程序要如何入手?
 
[客户端是因为无法收到服务器的心跳包...]
换个方向,由客户端给服务器发心跳包。
 
谢谢回答,心跳包本来就是双向的,互相都要知道对方的状态。
 
帮顶,关注ing。。。。。。。。。。。
 
包头+状态+当前时间
在一定时内,形成了一定规则的数据包,防火墙检测到了该行为,认为是一种恶意的数据包,所以把你卡了。你在程序里做个适当的变换就可以。
 
心跳检测自己写贝,不要用socket函数
 
关于防火墙穿透,建议看看我的blog:
http://ms.mblogger.cn/eyes4/
建议发送的包按时间做一个变化,并且时间不要太短,发送心跳的socket与接收心跳的socket必须是同一个,这样才能保证防火墙不认为单纯的攻击。
 

Similar threads

顶部