客户的网络有个怪毛病:每天上午都好好的,一过中午十二点就开始卡。网页转圈,远程桌面用着用着就断,但内网互访倒是没受什么影响。下午六点以后,又自己好了,跟定了闹钟似的。
客户先怀疑运营商,宽带那边派人来测了一圈,说链路没问题。又怀疑是我们机房出口带宽不够,我上去看了下,峰值才用了三成,根本不是流量的事。
我一开始也没头绪。卡的时候我 ping 网关,丢包不算严重,但延迟明显有抖动,一抖一抖的。我寻思是不是链路质量不行,又想着他们机房那台交换机是塔式的,塞在楼梯间下面,夏天那个位置热得很,就怀疑是光模块过热。还专门找了个新模块换上,没用,照样下午卡。
后来我干脆在网关出口挂着 tcpdump 看,看了一会儿发现个规律:新建连接大量失败,但已经建好的连接都活得好好的。网页打不开,是因为每次访问都要新建连接;远程桌面能撑一阵,是因为它连着不断。
这个现象指向性其实很强——链路层没问题,是有状态的东西在丢新建连接。防火墙、NAT、conntrack,就这几样会干这种事。
上去一查:
cat /proc/sys/net/netfilter/nf_conntrack_count
六万三千多。再看 max:
cat /proc/sys/net/netfilter/nf_conntrack_max
65536。表快满了。
conntrack 表满以后,新连接直接被 drop,老连接不受影响——跟症状完全对上了。这台网关是客户的出口,全公司上网都走它做 NAT,表一满,谁都建不了新连接。
那谁把表占满了?用 conntrack 命令按源地址统计了一下,好家伙,有个内网 IP 一个人占了四万六千多条,全是往外的 80、443 连接。一问客户,那是台 Windows Server 2008,跑着个不知道谁留下的旧系统,好几年没人管了。
远程上去看,进程列表里有个 svchost,名字后面多了个空格,路径在 C:\Windows\Temp 下面——经典木马伪装。任务计划里挂着个每小时跑一次的项,指向同一个文件。杀毒软件不知道什么时候被关了,事件日志里能看到它被禁之前报过几次威胁,都没人处理。
就是个挖矿木马,被控以后一直往外连矿池和中转。它一天到晚都在连,白天公司人多、业务忙,新建连接一多,把本来就快满的表顶爆了;晚上没人上网,表没满,就不卡。所以症状才那么准时。
处理倒不复杂:先把那台机器从网上摘了,删掉木马文件和计划任务,打了能打的补丁——2008 早就没有补丁了,只能让客户尽快把这机器淘汰。然后在防火墙上给它单独做了白名单出网。conntrack 数当场从六万三掉到三千出头,网络马上恢复。
事后客户挺不好意思,说那台机器是之前一个外包公司留下的,一直没人管。我说这种没人管的机器,要么关掉,要么隔离,别光着屁股扔在业务网里。
这事的教训就一条:以后再遇到"时好时坏"的网络问题,先看一眼 conntrack,别急着骂运营商、换光模块。新建连接全挂、老连接没事,这个特征记住了,能省好几天事。
评论