《网络迷踪:SRE的TCP/IP故障排查艺术》
系列第六篇:加固城防 – 用
nmap
和
iptables
审计你的网络安全
nmap
iptables
“案发现场”:
你刚刚部署了一台新的应用服务器,并按照文档,在防火墙上只开放了80和443端口。一周后,安全团队在进行例行扫描时,突然给你发来一个高危告警:“你的服务器
上,发现了一个对外开放的Redis服务(端口6379),并且没有密码保护!”
10.0.0.10你大吃一惊:“这不可能!我明明配置了防火墙!”
这个场景暴露了一个严峻的现实:我们自认为的安全配置,可能因为各种原因(如错误的规则、被其他服务修改、或者根本没生效)而存在漏洞。我们必须拥有一套工具和方法,能从“攻击者”的视角,来审视我们自己的服务器,看看它到底对外暴露了哪些“窗口”。
一、
nmap
:你的“端口扫描雷达”
nmap
(Network Mapper) 是世界上最著名、最强大的开源网络扫描和安全审计工具。它可以快速地扫描一台或多台主机,告诉你:
nmap
这台主机是否在线?它对外开放了哪些TCP和UDP端口?每个端口上运行着什么服务?(甚至能猜出服务的版本号)对方可能是什么操作系统?
核心理念: 我们要用
来模拟一次“善意的黑客攻击”,从外部视角,看看我们的服务器究竟长什么样。
nmap
实战演练:对自己的服务器进行一次“安全体检”
警告: 未经授权,严禁对任何不属于你的网络或服务器进行扫描。本教程所有操作,都应在你自己的测试服务器或获得明确授权的环境中进行。
1. 最基础的快速扫描
案情设定: 我们想快速检查一下服务器
开放了哪些常见的TCP端口。
10.0.0.10
输入(在你自己的另一台机器上执行,而不是在目标机上):
nmap 10.0.0.10
输出:
Starting Nmap 7.80 ( https://nmap.org ) at 2025-08-12 11:00 UTC
Nmap scan report for 10.0.0.10
Host is up (0.0015s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
6379/tcp open redis
Nmap done: 1 IP address (1 host up) scanned in 0.50 seconds
结果分析与注释:
:
Host is up
首先确认了目标主机是在线的。
nmap
:
Not shown: 996 closed ports
默认会扫描最常见的1000个端口,这里告诉我们有996个是关闭的。关键证据:
nmap
: 22端口开放,运行的是SSH服务,正常。
22/tcp open ssh
: 80端口开放,运行HTTP服务,正常。
80/tcp open http
: 443端口开放,运行HTTPS服务,正常。
443/tcp open https
: 问题暴露! 6379端口竟然是开放的!
6379/tcp open redis
2. 更深入的服务版本探测
为了获取更多信息,我们可以让
尝试去识别每个端口上运行的服务的具体版本。
nmap
输入:
# -sV: 进行服务和版本探测 (Service/Version detection)
sudo nmap -sV 10.0.0.10
输出(截取Redis部分):
...
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 6.2.6
...
结果分析与注释:
不仅发现端口是开放的,还进一步确认了上面运行的是Redis 6.2.6版本。这个信息对于安全评估至关重要,因为特定版本的软件可能存在已知的安全漏洞。
nmap
二、
iptables
/
firewalld
:Linux的“防火墙守卫”
iptables
firewalld
现在我们已经确认了漏洞的存在。接下来,我们需要登录到服务器
上,检查并修复它的防火墙规则。
10.0.0.10
现代Linux发行版主要使用两种防火墙管理工具:
:经典、强大但语法复杂的底层工具。
iptables
:在CentOS/RHEL 7+ 中默认使用,更易于管理。
firewalld
(Uncomplicated Firewall):在Ubuntu中默认使用,是
ufw
的一个简化前端。
iptables
我们以经典的
为例。
iptables
实战演练:审查并修复防火墙规则
1. 查看当前的防火墙规则
输入:
sudo iptables -L -n --line-numbers
命令解析:
: 列出规则 (List)。
-L
: 以数字形式显示IP和端口,不进行DNS反向解析,速度更快。
-n
: 显示规则的行号,便于后续删除或修改。
--line-numbers
输出(一个有问题的配置示例):
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
2 ACCEPT all -- 127.0.0.1 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379
结果分析与注释:
: 致命问题!
Chain INPUT (policy ACCEPT)
链的默认策略(
INPUT
)是
policy
(接受)。这意味着,任何没有被明确拒绝的流量,都会被默认放行! 这是一个非常不安全的配置。
ACCEPT
: 我们清晰地看到了第六条规则,它明确地
num 6
(接受)了所有到6379端口的TCP流量。这可能是在调试时不小心添加,然后忘记删除的。
ACCEPT
2. 修复防火墙规则
正确的安全实践是: 默认策略设为
(丢弃),然后只把你需要的端口明确地
DROP
。
ACCEPT
“手术”过程:
删除错误的规则:
# -D: 删除规则 (Delete),INPUT是链名,6是行号
sudo iptables -D INPUT 6
(强烈推荐)修改默认策略为DROP:
警告: 在修改默认策略为DROP之前,请务必确保你的SSH(22端口)和其它管理端口的ACCEPT规则已经存在且正确,否则你会被立刻锁在服务器外面!
sudo iptables -P INPUT DROP
保存规则:
的修改是临时的,需要保存才能在重启后生效。
iptables
CentOS/RHEL:
Ubuntu (使用
sudo service iptables save
):
iptables-persistent
sudo netfilter-persistent save
3. 最终验证
回到你的另一台机器,再次执行
扫描。
nmap
输入:
nmap 10.0.0.10
预期输出:
...
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
6379/tcp filtered redis
结果分析:
现在,6379端口的状态变成了
(被过滤)。这意味着
filtered
的探测包被防火墙直接丢弃了,它没有收到任何回应。这正是我们想要的安全状态!
nmap
本章总结
今天,我们完成了从“故障排查者”到“安全审计员”的角色转变。
攻击者视角: 我们学会了使用
,像黑客一样从外部审视自己的服务器,找出所有暴露在外的端口和服务。防御者工具: 我们掌握了使用
nmap
(或
iptables
/
firewalld
)来查看和管理防火墙规则。安全第一原则: 我们理解了 “默认拒绝,显式允许” 这一防火墙配置的黄金法则,并学会了如何修复不安全的规则。
ufw
我们已经能保障单台服务器的安全。但在现代架构中,流量很少直接打到应用服务器上,它会先经过一系列的“交通枢纽”和“安检口岸”。
在下一篇中,我们将进入更高维度的网络世界,学习《流量迷局 – 理解负载均衡(L4/L7)与CDN背后的“隐形路由”》,让你对一个网络请求的完整生命周期,有更宏观、更全面的认识。