程序员老王因忘记关闭3389端口被黑客入侵服务器 手把手教你检测系统漏洞并扫描端口安全技巧
老王的故事,听起来是不是很耳熟?
老王是我们公司的老程序员了,干了十几年开发,代码写得那叫一个漂亮。但有一天,他突然接到一个电话——公司内网被黑了,客户数据有泄露的风险。
当时老王整个人都懵了。他排查了半天,发现根源竟然简单到让他哭笑不得:他的开发服务器,3389端口(Windows远程桌面端口)一直开着,而且没有修改默认端口,密码还是”123456”。
黑客根本没用任何高深的手段,就是跑了一个端口扫描器,发现了这个开着的3389端口,然后用字典暴力破解进去了。整个过程不超过10分钟。
老王事后说:”我宁愿被代码bug搞死,也不想被端口搞死。”
为什么3389端口这么危险?
3389是Windows系统的远程桌面协议(RDP)端口。它的存在本身没有问题,就像你家里装了防盗门,这是正常的。
危险的地方在于:
- 默认端口不变:默认3389,黑客扫端口的时候第一个就找到它
- 密码强度不够:很多人用弱密码,甚至不设置密码
- 暴露在互联网上:很多服务器没有做端口隐藏,直接暴露在公网
- 版本漏洞:老旧的RDP版本有已知漏洞(比如CVE-2019-0708,蓝屏漏洞)
老王的那台服务器,是放在云服务器上的,为了调试方便,他一直没改端口,密码也忘了换。结果就被”顺手牵羊”了。
第一步:学会检测你的服务器开了哪些端口
在讲修复方法之前,咱们先学会怎么”体检”。
Windows系统自检
打开命令提示符(以管理员身份),输入:
netstat -ano | findstr "LISTENING"
这个命令会列出所有正在监听的网络端口。你会看到类似这样的输出:
协议 本地地址 外部地址 状态 PID
TCP 0.0.0.0:135 0.0.0.0:0 监听 964
TCP 0.0.0.0:445 0.0.0.0:0 监听 4
TCP 0.0.0.0:3389 0.0.0.0:0 监听 1234
TCP 127.0.0.1:5985 0.0.0.0:0 监听 680
看到3389了吧?这就是老王当年的样子。
如果你用的是Linux,命令是:
ss -tulpn
# 或者
netstat -tulpn
用Nmap扫描自己的服务器
Nmap是网络安全领域最经典的端口扫描工具,几乎所有安全工程师都会用。
安装Nmap(Windows): 下载地址是nmap.org,安装后打开命令行即可使用。
扫描本机:
nmap -sS 127.0.0.1
扫描内网其他机器(如果你有权限):
nmap -sS 192.168.1.0/24
扫描指定端口范围:
nmap -p 1-65535 192.168.1.100
扫描结果示例:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
3389/tcp open ms-wbt-server
如果你看到3389显示”open”,那就要引起重视了。
第二步:修复方案——从根源上堵住漏洞
方案一:修改RDP默认端口(最简单有效)
右键”我的电脑” → 属性 → 远程设置 → 远程桌面 → 勾选”允许远程连接到此计算机”旁边的选项,然后点”选择用户”可以管理权限。
但改端口需要通过注册表:
- 按 Win+R,输入
regedit打开注册表编辑器 - 找到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp - 找到
PortNumber这个值,双击修改,比如改成53389(十进制) - 重启电脑生效
之后连接远程桌面就要用新端口了:mstsc → 输入 IP地址:53389
老王的教训:他当时连改端口都懒得改,觉得”反正内网安全”。结果黑客就是用的端口扫描发现的。
方案二:用Windows防火墙限制访问
不是所有服务器都需要所有人能连RDP的。你可以通过防火墙只允许特定IP访问。
Windows防火墙设置: 控制面板 → Windows Defender防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → TCP → 特定端口(3389)→ 允许连接 → 仅限特定IP地址
这样,除了你指定的IP,其他人连都连不上。
Linux防火墙(iptables):
# 只允许192.168.1.100访问3389端口
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 3389 -j ACCEPT
# 其他所有访问3389的请求全部拒绝
iptables -A INPUT -p tcp --dport 3389 -j DROP
方案三:禁用RDP(如果不常用远程桌面)
如果你一年都用不了几次远程桌面,那直接关掉是最好的。
Windows命令行关闭RDP:
# 禁用远程桌面
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections -Value 1
# 重启生效
Restart-Service TermService
Linux上禁用SSH(类似逻辑):
sudo systemctl stop sshd
sudo systemctl disable sshd
第三步:定期检查端口安全——建立你的”安全巡检”习惯
老王的问题不只是3389,他服务器的其他端口也一样没人管。建议养成定期”体检”的习惯。
写一个简单的巡检脚本
Windows PowerShell脚本(保存为 check-ports.ps1):
# 检查所有开放端口
Write-Host "=== 正在扫描开放端口 ===" -ForegroundColor Cyan
$ports = netstat -ano | findstr "LISTENING" | ForEach-Object {
$_.Split() | Where-Object { $_ -match '^\d+$' } | Select-Object -Last 1
} | Get-Unique
foreach ($pid in $ports) {
$process = Get-Process -Id $pid -ErrorAction SilentlyContinue
if ($process) {
Write-Host "端口 PID: $pid 进程: $($process.ProcessName)" -ForegroundColor Yellow
}
}
Write-Host "=== 扫描完成 ===" -ForegroundColor Green
运行方式:右键PowerShell → 以管理员身份运行 → 输入 .\check-ports.ps1
Linux Bash脚本(保存为 check_ports.sh):
#!/bin/bash
echo "=== 开放端口扫描 ==="
ss -tulpn 2>/dev/null | grep LISTEN
echo "=== 高危端口检查 ==="
for port in 22 80 443 3389 445 135 139; do
if ss -tulpn | grep -q ":$port "; then
echo "[警告] 端口 $port 处于开放状态"
fi
done
echo "=== 扫描完成 ==="
运行:chmod +x check_ports.sh && ./check_ports.sh
配置自动化扫描任务
Windows任务计划程序:
# 创建每天运行的任务
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\Scripts\check-ports.ps1 -OutputFile C:\Logs\port-check.log"
$trigger = New-ScheduledTaskTrigger -Daily -At "2:00AM"
Register-ScheduledTask -TaskName "PortCheck" -Action $action -Trigger $trigger -RunLevel Highest
Linux cron定时任务:
# 每天早上2点执行扫描
crontab -e
# 添加这一行:
0 2 * * * /home/user/check_ports.sh >> /var/log/port-check.log 2>&1
第四步:进阶——用Nmap做全面安全扫描
Nmap不只是看端口开没开,它还能探测服务版本、操作系统、甚至一些已知漏洞。
基础扫描:
nmap -sV 192.168.1.100
-sV 会探测每个端口的服务版本,帮你发现哪些服务过时了。
全面扫描:
nmap -sS -sV -O -p- 192.168.1.100
-sS:SYN扫描(半开扫描,比较隐蔽)-sV:探测服务版本-O:探测操作系统-p-:扫描全部65535个端口
漏洞扫描(需要Nmap脚本):
nmap --script vuln 192.168.1.100
这个会用Nmap的漏洞检测脚本扫描常见漏洞,比如RDP的BlueKeep(CVE-2019-0708)。
扫描结果解读示例:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
80/tcp open http Apache httpd 2.4.29
3389/tcp open ms-wbt-server Microsoft Terminal Service
| vuln: CVE-2019-0708 (BlueKeep)
| DISA CRITICAL: Remote desktop services (RDP)
| vulnerability allows unauthenticated attackers
| to connect to the target machine and execute code
|_ https://nvd.nist.gov/vuln/detail/CVE-2019-0708
看到这个 BlueKeep 标记了吗?如果你的RDP版本有漏洞,Nmap会直接标出来。老王的服务器如果当时扫一下,可能就不会中招了。
老王后来的改变
老王被这事后彻底长记性了。他现在做了这几件事:
- 把所有服务器的3389端口都改了,改成了不常见的端口号
- 配置了防火墙白名单,只有公司VPN出来的IP才能连远程桌面
- 装了 fail2ban(Linux)或 类似的登录失败锁定机制,连续5次密码错误就锁定IP
- 每周用Nmap扫一次,形成报告存档
- 密码强制要求:大小写字母+数字+特殊字符,长度12位以上
他说:”安全不是靠运气,是靠习惯。”
给你的安全自检清单
如果你不确定自己的服务器安不安全,照着这个清单打勾:
- [ ] 3389端口是否已修改为非默认端口?
- [ ] 远程桌面是否限制了特定IP访问?
- [ ] 密码是否够强(12位以上,含大小写+数字+符号)?
- [ ] 是否安装了最新的安全补丁?
- [ ] 是否关闭了不必要的端口和服务?
- [ ] 是否配置了防火墙规则?
- [ ] 是否定期扫描端口并检查异常?
- [ ] 是否开启了登录失败锁定机制?
全部打勾了,你的服务器才算真正安全。
老王的经历告诉我们:安全这件事,最大的漏洞不是技术,而是”以为没事”的心态。 端口开着没人管、密码简单到离谱、从不检查有没有异常——这些”小事”叠加起来,就是灾难。
你现在就可以花5分钟,运行一下上面的命令看看自己的服务器。如果发现端口开着,花10分钟改掉。这一步,可能就能避免下一次”老王事件”。
记住:最好的安全,是从现在开始,每天多问一句”我的端口安全吗?”
