加固城防 – 用`nmap`和`iptables`审计你的网络安全

《网络迷踪:SRE的TCP/IP故障排查艺术》

系列第六篇:加固城防 – 用
nmap

iptables
审计你的网络安全

“案发现场”:

你刚刚部署了一台新的应用服务器,并按照文档,在防火墙上只开放了80和443端口。一周后,安全团队在进行例行扫描时,突然给你发来一个高危告警:“你的服务器
10.0.0.10
上,发现了一个对外开放的Redis服务(端口6379),并且没有密码保护!”

你大吃一惊:“这不可能!我明明配置了防火墙!”

这个场景暴露了一个严峻的现实:我们自认为的安全配置,可能因为各种原因(如错误的规则、被其他服务修改、或者根本没生效)而存在漏洞。我们必须拥有一套工具和方法,能从“攻击者”的视角,来审视我们自己的服务器,看看它到底对外暴露了哪些“窗口”。


一、
nmap
:你的“端口扫描雷达”


nmap
(Network Mapper) 是世界上最著名、最强大的开源网络扫描和安全审计工具。它可以快速地扫描一台或多台主机,告诉你:

这台主机是否在线?它对外开放了哪些TCP和UDP端口?每个端口上运行着什么服务?(甚至能猜出服务的版本号)对方可能是什么操作系统?

核心理念: 我们要用
nmap
来模拟一次“善意的黑客攻击”,从外部视角,看看我们的服务器究竟长什么样。

实战演练:对自己的服务器进行一次“安全体检”

警告: 未经授权,严禁对任何不属于你的网络或服务器进行扫描。本教程所有操作,都应在你自己的测试服务器或获得明确授权的环境中进行。

1. 最基础的快速扫描

案情设定: 我们想快速检查一下服务器
10.0.0.10
开放了哪些常见的TCP端口。

输入(在你自己的另一台机器上执行,而不是在目标机上):


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
:
nmap
默认会扫描最常见的1000个端口,这里告诉我们有996个是关闭的。关键证据:

22/tcp open ssh
: 22端口开放,运行的是SSH服务,正常。
80/tcp open http
: 80端口开放,运行HTTP服务,正常。
443/tcp open https
: 443端口开放,运行HTTPS服务,正常。
6379/tcp open redis
: 问题暴露! 6379端口竟然是开放的!

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
...

结果分析与注释:

nmap
不仅发现端口是开放的,还进一步确认了上面运行的是Redis 6.2.6版本。这个信息对于安全评估至关重要,因为特定版本的软件可能存在已知的安全漏洞。


二、
iptables
/
firewalld
:Linux的“防火墙守卫”

现在我们已经确认了漏洞的存在。接下来,我们需要登录到服务器
10.0.0.10
上,检查并修复它的防火墙规则。

现代Linux发行版主要使用两种防火墙管理工具:


iptables
:经典、强大但语法复杂的底层工具。
firewalld
:在CentOS/RHEL 7+ 中默认使用,更易于管理。
ufw
(Uncomplicated Firewall):在Ubuntu中默认使用,是
iptables
的一个简化前端。

我们以经典的
iptables
为例。

实战演练:审查并修复防火墙规则

1. 查看当前的防火墙规则

输入:


sudo iptables -L -n --line-numbers

命令解析:


-L
: 列出规则 (List)。
-n
: 以数字形式显示IP和端口,不进行DNS反向解析,速度更快。
--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
: 我们清晰地看到了第六条规则,它明确地
ACCEPT
(接受)了所有到6379端口的TCP流量。这可能是在调试时不小心添加,然后忘记删除的。

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:
sudo service iptables save
Ubuntu (使用
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背后的“隐形路由”》,让你对一个网络请求的完整生命周期,有更宏观、更全面的认识。

© 版权声明

相关文章

暂无评论

none
暂无评论...