我正用这个把头撞到墙上......
我从桌面上为我拥有的特定服务器运行 nmap,以检查一些可能存在安全问题的开放端口。它返回不应打开的端口:
nmap -T5 WWW.XXX.YYY.ZZZ
Starting Nmap 7.12 ( https://nmap.org ) at 2016-08-09 21:21 CEST
Nmap scan report for mydomain.com (WWW.XXX.YYY.ZZZ)
Host is up (0.0034s latency).
Not shown: 992 filtered ports
PORT STATE SERVICE
80/tcp open http
110/tcp open pop3
143/tcp open imap
443/tcp open https
993/tcp open imaps
995/tcp open pop3s
Nmap done: 1 IP address (1 host up) scanned in 3.33 seconds
必须打开http和https。但其他的则不然……我从 5 个不同的 IP 地址运行此测试。
好吧,也许由于 nmap 如何选择打开/过滤/关闭端口而导致误报。所以我尝试远程登录这些端口并且......我确实有一个连接:
[meandmyself@MacBook ~]$ telnet WWW.XXX.YYY.ZZZ 110
Trying WWW.XXX.YYY.ZZZ...
Connected to mydomain.com.
Escape character is '^]'.
在目标主机上,我仔细检查了 netstat 和 iptables,看看是否遗漏了某些内容:
[21:55] ovh-user@mydomain:~ $ sudo netstat -tanlp | grep LISTEN
[sudo] password for ovh-user:
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1016/master
tcp 0 0 WWW.XXX.YYY.ZZZ:4444 0.0.0.0:* LISTEN 353/sshd
tcp 0 0 0.0.0.0:5665 0.0.0.0:* LISTEN 2485/icinga2
tcp 0 0 127.0.0.1:8999 0.0.0.0:* LISTEN 826/php-fpm.conf)
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 25433/mysqld
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 346/rpcbind
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 828/nginx -g daemon
tcp6 0 0 :::9000 :::* LISTEN 25477/java
tcp6 0 0 :::111 :::* LISTEN 346/rpcbind
除了 rpcbind 之外,我知道所有这些服务,只有 nginx 可以从外部访问。端口 110、143、993 和 995 上没有任何内容...
然后我仔细检查了我的 iptables :
[21:33] ovh-user@mydomain:~ $ sudo iptables -v -L INPUT
Chain INPUT (policy DROP 8 packets, 352 bytes)
pkts bytes target prot opt in out source destination
2602 749K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
76 5472 ACCEPT all -- lo any anywhere anywhere
272 8912 ACCEPT icmp -- any any anywhere anywhere
1 64 ACCEPT tcp -- any any anywhere anywhere tcp dpt:4444
27 1604 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
1 44 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https
0 0 ACCEPT tcp -- any any anywhere anywhere tcp spt:ftp state ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere tcp spt:ftp-data state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere tcp spts:1024:65535 dpts:1024:65535 state ESTABLISHED
[21:34] ovh-user@mydomain:~ $ sudo iptables -v -L FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[21:55] ovh-user@mydomain:~ $ sudo iptables -t nat -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 1342 packets, 49898 bytes)
pkts bytes target prot opt in out source destination
pop 或 imap 端口上没有打开任何内容...
从我对 UNIX 服务和防火墙的基本了解来看,我不明白。为什么 telnet 为我提供“已连接到 mydomain.com”的端口,但没有进程在侦听该端口?有没有办法跟踪 telnet 如何到达某些地方?
答案1
也为那些将头撞到墙上的人提供了详细的答案。
1)找到你的服务器开放的端口
首先,使用地图诊断哪些端口打开以及哪些端口关闭/过滤。 Nmap 有不同的扫描模式要找到开放的端口,您应该尝试所有这些模式。
您最终会得到一个打开的端口列表,其中一些是合乎逻辑的,但其他则不然。
就我而言,端口 110、143、993、995 不应该打开。
2)这些端口是否真的开放了
[meandmyself@MacBook ~]$ telnet WWW.XXX.YYY.ZZZ 110
Trying WWW.XXX.YYY.ZZZ...
Connected to mydomain.com.
Escape character is '^]'.
就我而言,当我尝试访问服务器的端口 110 时,会有一个真正的答案。
这里是可怕的部分,端口似乎被打开了。
3)服务器端诊断
A)我的服务器上是否有正在运行的进程正在侦听此端口
网络统计或者拉索夫可以显示是否有正在运行的进程正在侦听这些打开的端口。
[21:55] ovh-user@mydomain:~ $ sudo netstat -tanlp | grep LISTEN
[sudo] password for ovh-user:
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1016/master
tcp 0 0 WWW.XXX.YYY.ZZZ:4444 0.0.0.0:* LISTEN 353/sshd
tcp 0 0 0.0.0.0:5665 0.0.0.0:* LISTEN 2485/icinga2
tcp 0 0 127.0.0.1:8999 0.0.0.0:* LISTEN 826/php-fpm.conf)
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 25433/mysqld
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 346/rpcbind
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 828/nginx -g daemon
tcp6 0 0 :::9000 :::* LISTEN 25477/java
tcp6 0 0 :::111 :::* LISTEN 346/rpcbind
就我而言,没有进程在端口 110、993 上侦听...只有进程在端口 25、4444、5665、8999、3306、111、80、9000 上侦听。
B) 我的服务器是否允许传入端口 110 的请求
诊断 iptables 规则INPUT, FORWARD and PREROUTING chains
[21:33] ovh-user@mydomain:~ $ sudo iptables -v -L INPUT
就我而言,有一个默认DROP
策略,这意味着必须明确指定每个开放端口才有机会到达正在运行的进程。
我现在可以得出结论,我的服务器不可能应答端口 110 上的请求。
4) 谁在响应端口 110 上向我的服务器发出的请求?
我的计算机和服务器之间的路径中的每个 actif 节点都可能是响应请求的节点。请记住,它还包括我自己的计算机。
要诊断此问题,请使用 nmap 和 telnet 进行测试:
- 另一台计算机
- 不同的接入点/ISP 盒
- 不同的位置(使用 ssh 隧道和其他服务器来代理您的请求)
就我而言,我使用位于同一数据中心的另一台服务器进行了测试。重点是看看我的托管提供商设置的前端防火墙是否可以处理端口 110、143 上的请求...我还用手机在端口 110 上测试了 telnet,果汁SSH超过4G。
通过这些测试,端口 110 上的请求没有得到任何答复。
5)所以是我的电脑在本地打开这些端口
就我而言,我是在 OSX 10.11.5 上进行测试的。我运行 lsof 和 netstat 来跟踪我自己的计算机是否侦听特定端口:
[meandmyself@MacBook ~]$ sudo netstat -anv | grep LISTEN
tcp46 0 0 *.3306 *.* LISTEN 131072 131072 827 0
tcp4 0 0 127.0.0.1.4380 *.* LISTEN 131072 131072 453 0
tcp4 0 0 127.0.0.1.4370 *.* LISTEN 131072 131072 453 0
tcp6 0 0 ::1.12993 *.* LISTEN 131072 131072 352 0
tcp4 0 0 127.0.0.1.12993 *.* LISTEN 131072 131072 352 0
tcp6 0 0 ::1.12995 *.* LISTEN 131072 131072 352 0
tcp4 0 0 127.0.0.1.12995 *.* LISTEN 131072 131072 352 0
tcp6 0 0 ::1.12143 *.* LISTEN 131072 131072 352 0
tcp4 0 0 127.0.0.1.12143 *.* LISTEN 131072 131072 352 0
tcp6 0 0 ::1.12110 *.* LISTEN 131072 131072 352 0
tcp4 0 0 127.0.0.1.12110 *.* LISTEN 131072 131072 352 0
tcp6 0 0 ::1.12443 *.* LISTEN 131072 131072 352 0
tcp4 0 0 127.0.0.1.12443 *.* LISTEN 131072 131072 352 0
tcp6 0 0 ::1.12080 *.* LISTEN 131072 131072 352 0
tcp4 0 0 127.0.0.1.12080 *.* LISTEN 131072 131072 352 0
tcp46 0 0 *.80 *.* LISTEN 131072 131072 321 0
tcp4 0 0 127.0.0.1.49153 *.* LISTEN 131072 131072 78 0
tcp4 0 0 127.0.0.1.49152 *.* LISTEN 131072 131072 78 0
[meandmyself@MacBook ~]$ sudo lsof -i -n -P |grep LISTEN
mtmfs 78 root 4u IPv4 0x7f85fc078645d63b 0t0 TCP 127.0.0.1:49152 (LISTEN)
mtmfs 78 root 6u IPv4 0x7f85fc078645cd43 0t0 TCP 127.0.0.1:49153 (LISTEN)
httpd 83 root 4u IPv6 0x7f85fc0788d37b8b 0t0 TCP *:80 (LISTEN)
httpd 321 _www 4u IPv6 0x7f85fc0788d37b8b 0t0 TCP *:80 (LISTEN)
com.avast 352 root 3u IPv4 0x7f85fc0788dc363b 0t0 TCP 127.0.0.1:12080 (LISTEN)
com.avast 352 root 4u IPv6 0x7f85fc0788d380eb 0t0 TCP [::1]:12080 (LISTEN)
com.avast 352 root 5u IPv4 0x7f85fc078645df33 0t0 TCP 127.0.0.1:12443 (LISTEN)
com.avast 352 root 6u IPv6 0x7f85fc0788d3864b 0t0 TCP [::1]:12443 (LISTEN)
com.avast 352 root 7u IPv4 0x7f85fc0788dc3f33 0t0 TCP 127.0.0.1:12110 (LISTEN)
com.avast 352 root 8u IPv6 0x7f85fc0788d38bab 0t0 TCP [::1]:12110 (LISTEN)
com.avast 352 root 9u IPv4 0x7f85fc0788dc2d43 0t0 TCP 127.0.0.1:12143 (LISTEN)
com.avast 352 root 10u IPv6 0x7f85fc0788d3910b 0t0 TCP [::1]:12143 (LISTEN)
com.avast 352 root 11u IPv4 0x7f85fc0788dc482b 0t0 TCP 127.0.0.1:12995 (LISTEN)
com.avast 352 root 12u IPv6 0x7f85fc0788d3762b 0t0 TCP [::1]:12995 (LISTEN)
com.avast 352 root 13u IPv4 0x7f85fc0788dc5123 0t0 TCP 127.0.0.1:12993 (LISTEN)
com.avast 352 root 14u IPv6 0x7f85fc0788d370cb 0t0 TCP [::1]:12993 (LISTEN)
SpotifyWe 453 kheraud 6u IPv4 0x7f85fc078a53282b 0t0 TCP 127.0.0.1:4370 (LISTEN)
SpotifyWe 453 kheraud 7u IPv4 0x7f85fc078a533123 0t0 TCP 127.0.0.1:4380 (LISTEN)
mysqld 827 _mysql 33u IPv6 0x7f85fc0788d36b6b 0t0 TCP *:3306 (LISTEN)
Lsof 给了我第一个提示。由于我的工作是一边听音乐一边构建网站,因此看到 Apache、Mysql 和 Spotify 在它们应该监听的端口上监听我并不感到惊讶……但 Avast 为我指明了正确的方向。每个打开的端口(110、143、993、995)均以“127.0.0.1.12XXX”列出(12110、12143、12993、12995...)。
我没有成功查看 Avast 如何处理端口 110 上的真实请求(@MarkPlotnick 指出我使用 pfctl 但使用它并不那么容易 - 欢迎任何帮助)。
我关闭了 Avast 并再次运行 lsof,然后是 telnet,然后是 nmap... 错误打开的端口不再存在。
在这种情况下,我吓坏了,很快就跳到 stackexchange 上寻找线索。我应该深吸一口气,再喝一杯咖啡,然后想想我的计算机和服务器之间的路径是什么。我会尝试从其他位置进行其他测试,并发现我的服务器没有遭受安全漏洞。
结论: 1) 思考 2) 再思考 3) 测试 4) 做