13_网络管理进阶:防火墙与监控

网络管理进阶:防火墙与监控

当 Linux 服务器需要对外提供服务(如 Web、数据库),或出现 “带宽莫名跑满”“端口被占用” 等问题时,仅靠ip addrping已无法应对 —— 此时需要用防火墙管控流量、用监控工具定位异常。今天这篇文章,带你掌握两大核心能力:用 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

总结:网络管理进阶的 “核心能力链”

  1. 防火墙管控:用 iptables/nftables 实现 “端口过滤(防非法访问)、SNAT(内网共享上网)、DNAT(端口转发)”,构建服务器安全边界;

  2. 流量监控:iftop 定位 “谁占带宽”,nload 看 “整体流量趋势”,netstat/lsof 查 “端口占用”,快速定位异常;

  3. 问题解决:端口转发靠 DNAT,带宽跑满靠 “iftop+iptables 封禁”,端口占用靠 “lsof+kill”,抓包分析靠 tcpdump;

  4. 避坑关键:规则顺序 “先允许后拒绝”,工具缺失补安装,防火墙二选一不冲突。

掌握这些能力,你就能应对企业服务器的大部分网络问题 —— 从 “被动排查” 变成 “主动管控”,让服务器网络既安全又高效。

posted @ 2025-10-12 18:56  S&L·chuck  阅读(17)  评论(0)    收藏  举报