打开浏览器,端口检测输入一个域名,端口检测敲下回车。端口检测你大概不会去想,端口检测这个动作背后有多少次连接在发生。端口检测但如果你恰好是端口检测个运维,或者只是端口检测对网络有点好奇,你可能会在某个深夜盯着终端里一行行滚动的端口检测日志,突然意识到:80端口,端口检测这个HTTP协议的端口检测默认入口,正默默承受着整个互联网最原始的端口检测喧嚣。
我上周排查一个线上问题,端口检测客户说网站时好时坏。端口检测登录服务器,端口检测`netstat -tlnp | grep :80`,端口检测输出干净得让人不安——只有一个nginx进程在监听。但`ss -s`显示的TCP连接数却高得离谱,大量连接卡在`SYN_RECV`状态。这不是服务挂了,是有人拿80端口当靶子打。SYN Flood,最老套的DoS手法,靠伪造源IP发SYN包,服务器回了SYN-ACK却等不到最后的ACK,半开连接堆满队列,正常用户自然挤不进来。
80端口之所以总被盯上,原因朴素得很:它是HTTP的默认端口,任何一台跑Web服务的机器,防火墙再严也得给它留条缝。扫描器最喜欢扫这个口,因为一旦开放,大概率能拿到一个Web应用,而Web应用意味着可能有SQL注入、文件上传、目录遍历。攻击面大,门槛低,脚本小子的自动化工具跑一圈,总能捞到几条鱼。
检测80端口的状态,方法多到不值一提。`telnet ip 80`,能连上就说明TCP握手没问题。`curl -I http://ip`,看返回的HTTP头,状态码是200还是403,Server字段暴露的是nginx还是Apache。但真正有意思的不是“通不通”,而是“通着的时候在发生什么”。
我习惯用`tcpdump`抓包看细节。`tcpdump -i eth0 port 80 -nn -c 100`,一百个包瞬间刷屏。正常流量里,客户端端口是随机的,SYN、SYN-ACK、ACK、GET、200 OK,节奏清晰。异常流量呢?同一个源IP反复SYN,或者源IP来自五湖四海但TTL值出奇一致——伪造的。还有更隐蔽的,慢速攻击,一个连接发一个字节,拖着你玩,Apache的MaxClients很快就被占满。
有个细节值得说:很多云厂商的安全组默认封了80端口的入站,你得手动开。这其实是好事,逼你确认一次“我真的要把这个服务暴露给全世界吗”。我见过太多人开完就忘了,跑个测试页面,上面挂着phpinfo(),数据库密码明文写在里面。80端口开着,等于把家门钥匙插在锁孔上。
检测工具本身也分层次。`nmap -p 80 --script http-headers
说到底,80端口检测不是目的,是起点。看到端口开着,下一步该问:谁在监听?监听的那个进程是什么版本?配置里有没有关掉不必要的HTTP方法?日志里有没有异常的User-Agent?这些问题没有自动化工具能替你回答。你得登录上去,`ps aux | grep nginx`,翻`access.log`,看那些凌晨三点的请求来自哪里,请求了什么路径。有时候你会发现,攻击者比你更了解你的应用。
最后提一句HTTPS。443端口现在承担了大部分正经流量,但80端口不会消失。它还在那里,重定向到443,或者跑着一些内部服务,或者只是忘了关。每次我扫自己维护的机器,看到80端口开着,都会多看一眼。那一眼,往往能看出很多故事。