13_网络管理进阶:防火墙与监控
网络管理进阶:防火墙与监控
当 Linux 服务器需要对外提供服务(如 Web、数据库),或出现 “带宽莫名跑满”“端口被占用” 等问题时,仅靠ip addr和ping已无法应对 —— 此时需要用防火墙管控流量、用监控工具定位异常。今天这篇文章,带你掌握两大核心能力:用 iptables/nftables 实现端口过滤与地址转换,用 iftop/nload/netstat 监控流量与端口,再通过实战解决端口转发、带宽跑满、端口冲突等高频问题,让服务器网络 “可控、可查、可排障”。
一、防火墙进阶:iptables/nftables 管控流量
Linux 防火墙的核心是 “过滤或转发网络数据包”,传统用 iptables,新一代用 nftables(性能更强、配置更简洁)。两者原理相通,重点掌握 “端口过滤”“SNAT/DNAT 地址转换”,满足企业 “对外服务管控”“内网共享上网”“端口转发” 等需求。
1. 先分清:iptables 与 nftables 的关系
| 对比维度 | iptables | nftables(推荐) | 关键差异 |
|---|---|---|---|
| 定位 | 传统防火墙工具(2001 年发布) | 新一代防火墙工具(2014 年发布,替代 iptables) | nftables 合并表结构、支持批量规则,性能提升 30%+ |
| 配置文件 | /etc/sysconfig/iptables(CentOS)、/etc/iptables/rules.v4(Ubuntu) | /etc/nftables.conf | nftables 配置更简洁,支持变量和条件判断 |
| 依赖 | 依赖内核模块(iptable_filter、iptable_nat 等) | 仅依赖 nft 内核模块 | 减少内核模块加载,降低系统开销 |
| 适用场景 | 老系统兼容、简单规则配置 | 新系统(CentOS 8+、Ubuntu 20.04+)、复杂规则 | 企业新部署服务器优先选 nftables |
注意:同一系统不要同时启用 iptables 和 nftables,会导致规则冲突,推荐新系统直接用 nftables。
2. 核心能力 1:端口过滤(允许 / 禁止特定端口访问)
端口过滤是防火墙最基础的功能 —— 比如 “只允许外部访问 80(HTTP)、443(HTTPS)端口,禁止访问 22(SSH)端口(仅允许内网 IP 访问)”。
(1)用 iptables 配置端口过滤(CentOS 7 示例)
\# 1. 清空现有规则(首次配置前执行,避免冲突)
sudo iptables -F # 清空filter表规则
sudo iptables -t nat -F # 清空nat表规则(地址转换用)
\# 2. 配置默认策略(先拒绝所有,再允许特定流量,遵循“最小权限”)
sudo iptables -P INPUT DROP # 默认拒绝所有入站流量
sudo iptables -P OUTPUT ACCEPT # 默认允许所有出站流量
sudo iptables -P FORWARD DROP # 默认拒绝转发(非路由器场景)
\# 3. 允许回环网卡(本地进程通信必需,如127.0.0.1)
sudo iptables -A INPUT -i lo -j ACCEPT
\# 4. 允许已建立的连接(避免已连接的SSH/HTTP会话被断开)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
\# 5. 允许外部访问80(HTTP)、443(HTTPS)端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
\# 6. 仅允许内网IP(192.168.1.0/24)访问22(SSH)端口
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
\# 7. 查看规则(验证配置)
sudo iptables -L -n # -n:IP显示为数字,不反向解析(更快)
(2)用 nftables 配置端口过滤(CentOS 9 示例)
nftables 用 “表 - 链 - 规则” 结构,配置更简洁:
\# 1. 清空现有规则并创建表(inet表示同时支持IPv4和IPv6)
sudo nft flush ruleset
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \\; policy drop \\; }
sudo nft add chain inet filter output { type filter hook output priority 0 \\; policy accept \\; }
sudo nft add chain inet filter forward { type filter hook forward priority 0 \\; policy drop \\; }
\# 2. 允许回环网卡和已建立连接
sudo nft add rule inet filter input iifname lo accept
sudo nft add rule inet filter input ct state established,related accept
\# 3. 允许80、443端口,仅内网访问22端口
sudo nft add rule inet filter input tcp dport {80,443} accept
sudo nft add rule inet filter input tcp dport 22 ip saddr 192.168.1.0/24 accept
\# 4. 查看规则
sudo nft list ruleset
3. 核心能力 2:SNAT/DNAT 地址转换(共享上网与端口转发)
地址转换是企业组网的关键功能:SNAT(源地址转换) 实现内网多设备共享一个公网 IP 上网,DNAT(目的地址转换) 实现 “外部访问公网 IP 的 80 端口,自动转发到内网服务器的 8080 端口”(即端口转发)。
(1)SNAT 配置(内网共享公网 IP,iptables 示例)
场景:内网 192.168.1.0/24 的设备,通过 Linux 服务器的公网网卡(eth0,IP:203.0.113.10)共享上网。
\# 1. 开启内核IP转发(临时生效)
sudo echo 1 > /proc/sys/net/ipv4/ip\_forward
\# 永久生效:编辑/etc/sysctl.conf,添加“net.ipv4.ip\_forward=1”,再执行sudo sysctl -p
\# 2. 配置SNAT规则(将内网源IP转换为公网IP)
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10
(2)DNAT 配置(端口转发,后续实战会详细用)
场景:外部访问公网 IP(203.0.113.10)的 80 端口,自动转发到内网 Tomcat 服务器(192.168.1.100:8080)。
\# iptables 配置DNAT
sudo iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
二、网络监控工具:定位流量异常与端口问题
当服务器出现 “带宽跑满导致服务卡顿”“端口被占用无法启动服务” 时,需要用监控工具快速定位根源 —— 核心工具包括:iftop(看带宽占用)、nload(实时流量)、netstat/lsof(查端口占用)。
1. iftop:可视化查看带宽占用(谁在 “偷” 带宽?)
iftop 能实时显示 “各 IP 之间的带宽占用”,适合定位 “哪个 IP / 端口占用过多带宽”。
(1)安装与基础用法
\# Ubuntu安装
sudo apt install iftop -y
\# CentOS安装
sudo dnf install iftop -y
\# 启动iftop(默认监控默认网卡,指定网卡加-i参数,如-i eth0)
sudo iftop -i eth0
(2)关键界面解读(启动后按h显示帮助)
| 界面元素 | 含义 | 异常判断标准 |
|---|---|---|
| 左侧两列 | 通信双方 IP: 端口 | 某 IP 持续占用>50% 带宽,且非业务 IP(如爬虫、异常进程) |
| 中间列 | 实时带宽(Rx:接收,Tx:发送) | Rx/Tx 持续>100Mbps(超出服务器带宽上限) |
| 右侧列 | 累计带宽与连接状态 | 某连接累计带宽远超正常业务(如 1 小时内 100GB) |
(3)常用操作快捷键
-
s:切换显示源 IP; -
d:切换显示目的 IP; -
n:显示 IP 而非主机名(避免反向解析卡顿); -
q:退出 iftop。
2. nload:实时监控网卡流量(上下行趋势一目了然)
nload 更侧重 “网卡整体流量趋势”,适合快速查看 “当前总带宽使用情况”,界面简洁易读。
(1)安装与基础用法
\# Ubuntu安装
sudo apt install nload -y
\# CentOS安装
sudo dnf install nload -y
\# 启动nload(默认监控所有网卡,指定网卡加网卡名,如nload eth0)
sudo nload eth0
(2)界面解读
-
上半部分:显示 “Incoming(入站流量)”,包括实时速度(Curr)、平均速度(Avg)、峰值速度(Peak);
-
下半部分:显示 “Outgoing(出站流量)”,指标同上;
-
右侧:显示网卡 IP 和总流量统计;
-
操作:按
左右箭头切换网卡,按q退出。
3. netstat/lsof:排查端口占用(谁占了 8080 端口?)
当启动服务时提示 “Address already in use”(端口被占用),用 netstat 或 lsof 能快速找到占用端口的进程 PID。
(1)netstat 查端口占用(需安装 net-tools 包)
\# 安装net-tools(部分系统默认未安装)
sudo apt install net-tools -y # Ubuntu
sudo dnf install net-tools -y # CentOS
\# 查8080端口的占用情况(-t:TCP端口,-u:UDP端口,-l:监听中,-n:数字显示,-p:显示进程)
sudo netstat -tlnp | grep 8080
\# 输出示例:tcp 0 0 0.0.0.0:8080 0.0.0.0:\* LISTEN 1234/java
\# 解读:PID=1234的java进程(Tomcat)占用8080端口
(2)lsof 查端口占用(功能更强,支持更多过滤)
\# 安装lsof(部分系统默认未安装)
sudo apt install lsof -y # Ubuntu
sudo dnf install lsof -y # CentOS
\# 查8080端口的占用进程
sudo lsof -i :8080
\# 输出示例:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
\# java 1234 ubuntu 42u IPv6 12345 0t0 TCP \*:http-alt (LISTEN)
\# 解读:java进程(PID=1234)占用8080端口(http-alt是8080的默认服务名)
三、实战:解决 3 个高频网络问题
结合企业真实场景,拆解端口转发、带宽监控、端口占用的完整解决流程。
实战 1:配置端口转发(80 端口转发到 8080 的 Tomcat)
场景:内网 Tomcat 服务器(192.168.1.100:8080)需对外提供服务,但运营商封禁 8080 端口,需通过 Linux 网关(公网 IP:203.0.113.10)将 80 端口转发到 8080。
步骤 1:开启内核 IP 转发(必需)
\# 临时开启
sudo echo 1 > /proc/sys/net/ipv4/ip\_forward
\# 永久开启(重启生效)
sudo echo "net.ipv4.ip\_forward=1" >> /etc/sysctl.conf
sudo sysctl -p # 立即生效
步骤 2:用 iptables 配置 DNAT 规则
\# 1. 清空nat表现有规则(可选,避免冲突)
sudo iptables -t nat -F
\# 2. 配置DNAT:外部访问203.0.113.10:80,转发到192.168.1.100:8080
sudo iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
\# 3. 配置SNAT(可选,确保Tomcat响应能返回给外部)
sudo iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 8080 -j SNAT --to-source 192.168.1.1(网关内网IP)
步骤 3:验证转发效果
\# 1. 本地验证(在网关服务器上执行)
curl http://203.0.113.10 # 应返回Tomcat默认页面(同访问http://192.168.1.100:8080)
\# 2. 外部验证(用其他公网机器)
curl http://203.0.113.10 # 同样返回Tomcat页面,说明转发成功
步骤 4:保存 iptables 规则(避免重启丢失)
\# CentOS系统
sudo iptables-save > /etc/sysconfig/iptables
\# Ubuntu系统
sudo iptables-save > /etc/iptables/rules.v4
\# 重启后恢复规则(CentOS)
sudo iptables-restore < /etc/sysconfig/iptables
实战 2:监控并解决 “带宽跑满” 问题
场景:服务器带宽为 100Mbps,近期频繁跑满,导致 Web 服务卡顿,需定位并处理。
步骤 1:用 iftop 找到占带宽的 IP / 端口
\# 启动iftop,监控公网网卡eth0
sudo iftop -i eth0 -n # -n:不解析主机名,速度更快
假设发现 “IP=198.51.100.200” 持续占用 80Mbps 带宽,且端口为 80(HTTP)。
步骤 2:用 netstat 找到对应进程
\# 查与198.51.100.200的80端口连接对应的进程
sudo netstat -tlnp | grep :80
\# 输出:tcp 0 0 0.0.0.0:80 0.0.0.0:\* LISTEN 4567/nginx
\# 解读:Nginx进程(PID=4567)处理80端口连接,198.51.100.200可能是爬虫或异常客户端
步骤 3:分析 Nginx 日志,确认是否为异常访问
\# 查看Nginx访问日志(假设日志路径为/var/log/nginx/access.log)
sudo grep "198.51.100.200" /var/log/nginx/access.log | wc -l
\# 输出:10000(1分钟内有1万次请求,远超正常用户,判定为恶意爬虫)
步骤 4:处理异常访问(封禁 IP)
\# 用iptables封禁198.51.100.200
sudo iptables -A INPUT -s 198.51.100.200 -j DROP
\# 验证:iftop中该IP的带宽占用降为0,服务器带宽恢复正常
实战 3:排查 “Tomcat 端口被占用” 问题
场景:启动 Tomcat 时提示 “Failed to start connector [Connector [HTTP/1.1-8080]]: Address already in use”,需解决端口占用。
步骤 1:用 lsof 找到占用 8080 端口的进程
sudo lsof -i :8080
\# 输出:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
\# java 7890 ubuntu 42u IPv6 56789 0t0 TCP \*:http-alt (LISTEN)
\# 解读:PID=7890的java进程占用8080端口(可能是残留的Tomcat进程)
步骤 2:关闭占用进程(优先正常关闭,再强制关闭)
\# 1. 尝试正常关闭(发送15信号,让进程保存数据后退出)
sudo kill 7890
\# 2. 等待3秒,验证端口是否释放
sudo lsof -i :8080 # 若仍有输出,执行强制关闭
\# 3. 强制关闭(发送9信号,立即终止,慎用!)
sudo kill -9 7890
步骤 3:验证端口释放,重启 Tomcat
\# 确认8080端口已释放
sudo lsof -i :8080 # 无输出,说明端口释放
\# 重启Tomcat
sudo /usr/local/tomcat/bin/startup.sh
\# 验证:访问http://localhost:8080,能正常显示Tomcat页面
四、进阶技巧:保存规则与抓包分析
1. 技巧 1:保存 iptables 规则(避免重启丢失)
不同 Linux 发行版的规则保存路径不同,需针对性操作:
| 系统类型 | 保存命令 | 恢复命令 | 配置文件路径 |
|---|---|---|---|
| CentOS/RHEL | sudo iptables-save > /etc/sysconfig/iptables |
sudo iptables-restore < /etc/sysconfig/iptables |
/etc/sysconfig/iptables |
| Ubuntu/Debian | sudo iptables-save > /etc/iptables/rules.v4 |
sudo iptables-restore < /etc/iptables/rules.v4 |
/etc/iptables/rules.v4 |
自动化建议:写定时任务(crontab)每小时保存一次规则,避免意外重启丢失:
\# 添加定时任务
sudo crontab -e
\# 添加一行:0 \* \* \* \* /usr/sbin/iptables-save > /etc/sysconfig/iptables # 每小时保存一次(CentOS)
2. 技巧 2:用 tcpdump 抓包分析异常网络请求
当遇到 “客户端访问服务超时,但端口通”“频繁出现 RST 包” 等问题时,用 tcpdump 抓包分析数据包内容,定位异常原因。
(1)基础用法:抓 80 端口的 HTTP 请求
\# 安装tcpdump
sudo apt install tcpdump -y # Ubuntu
sudo dnf install tcpdump -y # CentOS
\# 抓eth0网卡上80端口的TCP请求,保存到文件(便于后续分析)
sudo tcpdump -i eth0 -n tcp port 80 -w http.pcap
\# 选项解读:
\# -i eth0:监控eth0网卡;
\# -n:不解析IP和端口名;
\# tcp port 80:只抓TCP的80端口;
\# -w http.pcap:保存到http.pcap文件(用Wireshark打开分析)
(2)分析异常请求(如 SYN Flood 攻击)
SYN Flood 攻击会发送大量 SYN 包(建立连接请求),但不回复 ACK,导致服务器连接队列满,无法处理正常请求。抓包验证:
\# 抓SYN包,统计数量
sudo tcpdump -i eth0 -n tcp port 80 and 'tcp\[tcpflags] & tcp-syn != 0' | wc -l
\# 输出:5000(10秒内有5000个SYN包,远超正常,判定为SYN Flood)
\# 处理:开启iptables的SYN Cookies防护(echo 1 > /proc/sys/net/ipv4/tcp\_syncookies)
五、避坑指南:3 个常见网络管理误区
1. 避坑 1:iptables 规则顺序错误(先拒绝后允许)
误区:先配置 “拒绝所有” 规则,再配置 “允许 80 端口”,导致 80 端口也被拒绝。
原理:iptables 规则按顺序执行,匹配到第一条规则后不再执行后续规则。
正确顺序:先允许 “回环网卡、已建立连接、特定端口”,最后配置默认拒绝:
\# 正确顺序示例
sudo iptables -A INPUT -i lo -j ACCEPT # 先允许回环
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 再允许已建立连接
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 再允许80端口
sudo iptables -P INPUT DROP # 最后默认拒绝
2. 避坑 2:netstat 提示 “command not found”
误区:直接执行netstat -tlnp,提示命令不存在,误以为系统故障。
原因:新系统(如 CentOS 8、Ubuntu 20.04)默认不安装 net-tools 包(netstat 属于该包)。
解决:安装 net-tools 或用 ss 命令(替代 netstat,系统自带):
\# 方法1:安装net-tools
sudo dnf install net-tools -y
\# 方法2:用ss命令(功能类似netstat)
sudo ss -tlnp | grep 8080 # 查8080端口占用
3. 避坑 3:同时启用 iptables 和 nftables
误区:认为 “多一层防火墙更安全”,同时启用 iptables 和 nftables。
后果:两者规则冲突,导致部分流量被错误过滤(如 iptables 允许 80 端口,nftables 拒绝 80 端口,最终 80 端口无法访问)。
解决:二选一,新系统优先用 nftables,老系统用 iptables,禁用另一个:
\# 禁用iptables(CentOS)
sudo systemctl stop iptables
sudo systemctl disable iptables
\# 启用nftables
sudo systemctl start nftables
sudo systemctl enable nftables
总结:网络管理进阶的 “核心能力链”
-
防火墙管控:用 iptables/nftables 实现 “端口过滤(防非法访问)、SNAT(内网共享上网)、DNAT(端口转发)”,构建服务器安全边界;
-
流量监控:iftop 定位 “谁占带宽”,nload 看 “整体流量趋势”,netstat/lsof 查 “端口占用”,快速定位异常;
-
问题解决:端口转发靠 DNAT,带宽跑满靠 “iftop+iptables 封禁”,端口占用靠 “lsof+kill”,抓包分析靠 tcpdump;
-
避坑关键:规则顺序 “先允许后拒绝”,工具缺失补安装,防火墙二选一不冲突。
掌握这些能力,你就能应对企业服务器的大部分网络问题 —— 从 “被动排查” 变成 “主动管控”,让服务器网络既安全又高效。

浙公网安备 33010602011771号