操作系统是 Ubuntu 12.04 LTS(服务器;无 GUI)。该机器是运行在数百英里外远程服务器场中的虚拟服务器。
我卸载了 postfix 及其所有组件(courier、dovecot),甚至停止了 sendmail 并将其卸载。
现在好像没有程序监听25端口:
netstat -lnptu | grep :25
不显示任何条目(0 行)。我使用
netstat -anp | grep :25
并且使用此命令的结果为 0 行:
fuser -v 25/tcp
从服务器内部来看,端口 25 无法通过 telnet 访问:
> telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
(当我尝试连接到端口 24 时,我得到了完全相同的答案)
即使我用我的机器的 IP 地址替换“localhost”,我仍然无法从内部连接到端口 25:
> telnet <IP-address of my server> 25
Trying <IP-address of my server>...
telnet: Unable to connect to remote host: Connection refused
但 ...
...当我使用http://www.dnstools.ch/port-scanner.html据报告,端口 25 已开放。
当我尝试从外部使用 telnet 连接到服务器上的端口 25 时,收到以下信息:
> telnet <IP-address of my server> 25
Trying <address>...
Connected to <resolved name>.
Escape character is '^]'.
Connection closed by foreign host.
因此我建立了连接,但它立即被关闭了。
当我尝试连接到一个封闭的端口时,我得到了这个:
> telnet <IP-address of my server> 24
Trying <address>...
telnet: connect to address <address>: Connection refused
telnet: Unable to connect to remote host
我甚至尝试为端口 25 添加一些 iptables 规则,但这完全没有效果。从外部看,端口 25 似乎仍处于打开状态,但没有程序在监听它。
问题 1:怎么会这样呢?
问题2:在这种情况下我该如何关闭 25 端口?
答案1
您可能有一个代表网络中的 IP 地址进行应答的安全设备。“接听并挂断”行为很常见。您可以通过观察端口 25 响应的 IP TTL 值并将其与来自您机器的实际开放端口响应进行比较来确认此行为(端口 24 等封闭端口响应也可能来自安全设备,因此比较没有用)。您可以像这样使用 Nmap 来实现此目的:
sudo nmap -sS -p 25,80 target.example.com -oX - | grep reason_ttl
假设您的目标上的端口 80 是开放的,而端口 25 给出了奇怪的响应,您应该会看到类似以下内容:
<host starttime="1398878935" endtime="1398878935"><status state="up" reason="reset" reason_ttl="52"/>
<ports><port protocol="tcp" portid="25"><state state="open" reason="syn-ack" reason_ttl="54"/><service name="smtp" method="table" conf="3"/></port>
<port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="52"/><service name="http" method="table" conf="3"/></port>
请原谅 XML 的这种不美观之处,但如果您查看state
元素的reason_ttl
属性,您会发现,在一种情况下,响应的 TTL 低于另一种情况,这表明数据包在引发响应之前在网络中传输得更远。这不是一种万无一失的方法,因为安全设备可以谎报出站 TTL,但它可能有助于满足您的好奇心。
无论如何,根据 netstat 和其他工具的输出,您可以确定该端口实际上并没有在您的机器上监听。