Linux 网络管理、防火墙与 NAT 实战
Linux第八天
网络管理实操与防火墙
这一节的排错顺序很重要:
服务是否启动并监听端口
↓
本机网络/IP/路由是否正常
↓
防火墙是否允许这类流量
↓
若要跨网段或发布内网服务,再检查转发与 NAT不要一遇到访问失败就关闭防火墙。先定位是哪一层拦住了,才知道该改服务、网络还是规则。
本笔记不整理 ifconfig 配 IP、MTU、SELinux 和 iptables 的“规则保存与恢复”。一、网络管理实操:NetworkManager、nmcli 与 ip
1. 三个名字的关系
nmcli -> NetworkManager -> 网卡设备(如 ens160)- NetworkManager:后台服务,负责管理网络连接和配置文件。
- nmcli:在命令行里控制 NetworkManager 的工具。
- ens160:真正的网卡设备名;虚拟机不一定都叫这个名字,先查看实际名称。
先查看网卡设备与连接:
nmcli device status
nmcli connection show
ip addr
ip routedevice 是网卡设备,connection 是一份连接配置。一个网卡可以关联不同的配置文件,例如一个静态 IP 配置、一个 DHCP 配置。
2. 使用 nmcli 配置静态 IPv4
先确认连接名,下面假设连接名和网卡名都为 ens160:
nmcli connection modify ens160 \
ipv4.addresses 192.168.88.140/24 \
ipv4.gateway 192.168.88.2 \
ipv4.dns "114.114.114.114,114.114.115.115" \
ipv4.method manual含义:
ipv4.addresses:IP/前缀长度,/24相当于255.255.255.0。ipv4.gateway:默认网关,访问其他网段时交给它。ipv4.dns:域名解析服务器。ipv4.method manual:使用手动静态配置。
修改后让连接重新生效:
nmcli connection down ens160
nmcli connection up ens160
ip addr show ens160
ip route
ping -c 4 网关IP
ping -c 4 114.114.114.114
ping -c 4 www.baidu.com这三次测试分别大致验证:本地到网关、能否出网、DNS 是否正常。
远程 SSH 修改网卡有断连风险。最好在 VMware 控制台操作,或至少准备另一个登录窗口和回滚方案。
3. DHCP 配置和临时创建连接
创建一份 DHCP 自动获取地址的连接配置:
nmcli connection add type ethernet ifname ens160 con-name dhcp_ens160 ipv4.method auto
nmcli connection up dhcp_ens160不再需要时删除的是“连接配置”,不是物理网卡:
nmcli connection delete dhcp_ens1604. ip link set ens160 down:直接关闭网卡
ip link show ens160
ip link set ens160 down # 立即禁用这块网卡
ip link set ens160 up # 立即重新启用它直接改变网卡当前的链路状态,效果立刻出现,但不是在修改 NetworkManager 的长期连接配置。
down后,这张网卡上的 SSH、ping、网站访问都会中断。up只表示网卡重新启用;是否恢复 IP/路由,还取决于对应连接是否由 NetworkManager 激活。- 遇到远程机器网络异常时,优先在虚拟机控制台做这类操作。
5. 端口和进程:确认服务到底有没有在工作
网络请求到了服务器后,内核还要根据端口号交给对应进程。先检查监听状态:
ss -tlnp # TCP 监听端口,并显示进程
ss -tulnp # TCP + UDP 监听端口,并显示进程
ss -lntp | grep ':80'常见输出思路:
LISTEN 0 511 *:80 *:* users:(("nginx",pid=1234,fd=6))LISTEN:正在等待连接。*:80:本机所有 IPv4 地址的 80 端口都在监听。nginx、pid=1234:真正接收请求的进程和 PID。
这也解释了“端口 + 进程”关系:端口并不属于某个命令,而是由一个正在运行的进程绑定。防火墙只负责决定包能不能到达端口;进程不存在时,即使端口放行也无法提供服务。
6. 用 Python 快速验证网络服务
python3 -m http.server 8000它会启动一个简单的 HTTP 服务。另一个主机可测试:
curl http://服务器IP:8000若只希望它绑定到某个地址:
python3 -m http.server -b 192.168.18.142 8000绑定具体 IP 后,发往其他本机 IP 的请求不会被它接收;绑定 0.0.0.0 则表示接受本机所有 IPv4 地址的请求。
二、防火墙的基本概念
Linux 防火墙本质上是在内核网络栈中按规则检查数据包:满足条件就执行对应动作。
可以把一条规则读成一句话:
来自谁 -> 去哪里 -> 什么协议/端口 -> 放行、拒绝还是丢弃两套常见管理方式:
iptables 直接管理 netfilter 规则,适合理解底层规则和 NAT
firewall-cmd 管理 firewalld,适合 Rocky Linux 9 的日常配置DROP 和 REJECT 的区别
| 动作 | 对方看到的现象 | 适用理解 |
|---|---|---|
DROP | 没有回应,通常一直等待直到超时 | 像“静默丢弃” |
REJECT | 立即收到拒绝回应 | 像“明确说不允许” |
例如屏蔽某台主机对本机的 ping:
iptables -A INPUT -s 192.168.88.1 -p icmp -j DROPping 使用 ICMP 协议。此规则只影响源地址为 192.168.88.1 的 ICMP 包;并不是关闭本机所有网络。
三、iptables:表、链、规则
1. 五条内置链:包在什么阶段被检查
| 链 | 什么时候经过 | 最好这样理解 |
|---|---|---|
| PREROUTING | 包刚进入本机、路由决定前 | 先改目的地,例如 DNAT |
| INPUT | 目标是本机的包 | 外部访问本机 SSH/HTTP |
| FORWARD | 包经过本机、但目标不是本机 | 本机充当路由器 |
| OUTPUT | 本机自己发出的包 | 本机访问外网、服务端回复 |
| POSTROUTING | 包即将离开本机 | 出口前改源地址,例如 SNAT |
最容易混淆的是:
访问本机服务 -> INPUT
本机作为路由器 -> FORWARD
本机发出的流量 -> OUTPUT2. 常见表
| 表 | 作用 | 常见场景 |
|---|---|---|
filter | 过滤、放行、拒绝 | 默认表,INPUT/FORWARD/OUTPUT |
nat | 地址/端口转换 | SNAT、DNAT、MASQUERADE |
mangle | 修改包的特殊字段 | 较少在初学阶段使用 |
raw | 更底层的连接跟踪控制 | 较少在初学阶段使用 |
不写 -t 表名 时,iptables 默认操作 filter 表。
3. 规则的通用结构
iptables -A 链 [匹配条件] -j 动作常用部分:
-A INPUT 追加规则到 INPUT 链末尾
-I INPUT 1 插入到 INPUT 链第 1 条
-D INPUT 1 按序号删除
-s 192.168.88.10 匹配源 IP
-d 192.168.88.140 匹配目标 IP
-p tcp 匹配协议
--dport 80 匹配目标端口
--sport 12345 匹配源端口
-j ACCEPT/DROP/REJECT 指定动作规则从上到下依次匹配,遇到匹配且执行终结动作的规则,通常就不会继续往下看。因此“更具体的规则”通常应该放在“更宽泛的规则”前面。
4. 查看、添加、删除和修改规则
iptables -vnL --line-numbers # 查看默认 filter 表的所有链
iptables -vnL INPUT --line-numbers # 只看 INPUT 链
iptables -t nat -vnL --line-numbers # 看 nat 表
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -D INPUT 1 # 删除 INPUT 第 1 条规则
iptables -D INPUT -p tcp --dport 80 -j DROP # 按完整规则删除
iptables -R INPUT 1 -p tcp --dport 8080 -j ACCEPT
iptables -F # 清空当前表的规则,实验机慎用-n:不反向解析 IP/端口,显示更快、结果更直观。-v:显示命中包数、字节数、网卡等详情。--line-numbers:显示规则序号,方便删除和替换。
千万不要在 SSH 远程连接里随手加“拒绝 22 端口”的规则。连接会立刻中断;若要练习,使用虚拟机控制台并先准备删除命令。
5. 两个基础实验
屏蔽本机的 SSH:
iptables -A INPUT -p tcp --dport 22 -j REJECT
# 在 VMware 控制台恢复:
iptables -D INPUT -p tcp --dport 22 -j REJECT只允许指定来源访问 80 端口:
iptables -I INPUT 1 -s 192.168.88.100 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP第一条必须在前面,才能让 192.168.88.100 先被放行;其余访问 80 的 TCP 包会命中第二条并被丢弃。
6. 连接状态:理解 NEW 与 ESTABLISHED
iptables 可通过状态模块识别连接处于什么阶段:
NEW 新建连接
ESTABLISHED 已建立连接
RELATED 与已有连接有关联
INVALID 无法识别/无效例:允许新建 SSH 连接:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT实际规则常配合允许已建立连接的返回流量;课堂阶段先理解:状态匹配不是只看端口,而是在看“这是不是一段已经认识的通信”。
7. 自定义链:把相关规则收纳起来
当 Web 规则很多时,可以创建专门的链,而不是把所有规则堆在 INPUT:
iptables -t filter -N WEB_CHAIN
iptables -t filter -A INPUT -s 192.168.18.1 -j WEB_CHAIN
iptables -t filter -A WEB_CHAIN -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m multiport --dports 80,443 -j DROP这段规则的意思是:来自 192.168.18.1 的 Web 流量先跳去 WEB_CHAIN,其中 80/443 被放行;其他来源访问 80/443 则被丢弃。
四、NAT:让一台服务器充当网关
1. 开启内核转发
一台机器要转发别人的包,首先要开启 IPv4 转发:
sysctl -w net.ipv4.ip_forward=1
sysctl net.ipv4.ip_forward第一条立即生效,但重启后会恢复默认。课堂实验可以先用它;长期配置通常写入 /etc/sysctl.d/ 的配置文件。
2. SNAT / MASQUERADE:让内网机器能上网
实验拓扑:
server1:一张可上网网卡 ens160;一张内网网卡 192.168.199.1/24
server2:192.168.199.129/24,网关指向 192.168.199.1在 server1 上:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.199.0/24 -o ens160 -j MASQUERADE含义拆开看:
POSTROUTING:包将要从 server1 出口发出时。-s 192.168.199.0/24:只处理来自内网的包。-o ens160:只处理经可上网网卡离开的包。MASQUERADE:把源地址动态伪装成 server1 出口网卡的地址。
出口 IP 固定时也可使用 SNAT:
iptables -t nat -A POSTROUTING -s 192.168.199.0/24 -o ens160 \
-j SNAT --to-source 192.168.18.129一般来说:出口 IP 经常变化时使用 MASQUERADE 更方便;固定公网 IP 时 SNAT --to-source 更明确。
在 server2 上依次测试:
ping -c 4 192.168.199.1 # 先验证内网网关
ping -c 4 114.114.114.114 # 再验证 NAT/出网
ping -c 4 www.baidu.com # 最后验证 DNS3. DNAT:把外部访问转给内网服务
假设 server2 上的 Web 服务监听 192.168.199.129:80,希望外部访问 server1 的 192.168.18.129:8080 时能转过去:
iptables -t nat -A PREROUTING -d 192.168.18.129 -p tcp --dport 8080 \
-j DNAT --to-destination 192.168.199.129:80为什么用 PREROUTING:它在路由选择之前修改目的地址。若等到路由完成后,server1 会以为“8080 是发给我自己的”,而 server1 又未必有程序监听 8080。
访问方式:
浏览器或 curl 访问:http://192.168.18.129:8080
实际被转发到: http://192.168.199.129:80映射内网 SSH 的思路一样:
iptables -t nat -A PREROUTING -d 192.168.18.129 -p tcp --dport 3322 \
-j DNAT --to-destination 192.168.199.129:22
ssh root@192.168.18.129 -p 3322五、firewalld:Rocky Linux 9 的日常首选
firewalld 是管理内核 netfilter 的服务,firewall-cmd 是控制它的命令行工具。
firewall-cmd -> firewalld -> netfilter1. zone:按网络信任程度分区
常见 zone:
| zone | 大意 |
|---|---|
public | 默认普通网络,只开放明确允许的服务 |
drop | 直接丢弃,无回应 |
block | 拒绝,并给出回应 |
home / work | 更信任的家庭/办公网络 |
dmz | 对外服务但与内网隔离的区域 |
trusted | 信任所有连接 |
流量通常按“源地址 -> 网卡所属 zone -> 默认 zone”的顺序归类。
2. 最常用的查看命令
systemctl status firewalld
firewall-cmd --get-default-zone
firewall-cmd --get-active-zones
firewall-cmd --get-zones
firewall-cmd --get-services
firewall-cmd --zone=public --list-all先做“查看”,确认网卡在哪个 zone、当前已放行哪些服务,再做修改。
3. 放行服务或端口:临时与永久
# 仅当前运行时生效,重启 firewalld 后消失
firewall-cmd --zone=public --add-service=http
firewall-cmd --zone=public --add-port=8000/tcp
# 写入永久配置
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --reload--add-service=http 是按预定义服务名放行;--add-port=8000/tcp 是按具体端口和协议放行。
运行时配置和永久配置是两套:加了 --permanent 后,需要 --reload 才会立即加载到当前运行状态。
删除规则同理:
firewall-cmd --zone=public --remove-service=http
firewall-cmd --zone=public --remove-port=8000/tcp --permanent
firewall-cmd --reload4. 富规则:按来源做更精细控制
例如只丢弃来自某个 IP 对 80 端口的访问:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.18.1" port port="80" protocol="tcp" drop'
firewall-cmd --reload富规则更接近“来源 + 协议 + 端口 + 动作”的一句完整防火墙规则,适合需要精细限制的情形。
六、访问失败时的排错清单
以“浏览器打不开服务器 80 端口”为例:
# 1. 服务是否运行
systemctl status nginx
# 2. 是否有进程在监听 80
ss -lntp | grep ':80'
# 3. 本机访问是否成功
curl -I http://127.0.0.1
# 4. IP 和路由是否正常
ip addr
ip route
# 5. firewalld 是否放行
firewall-cmd --zone=public --list-all
# 6. 若实验使用 iptables,检查命中情况
iptables -vnL INPUT --line-numbers判断思路:
- 本机
curl 127.0.0.1失败:优先查服务本身和端口监听。 - 本机成功、其他机器失败:查 IP、路由和防火墙。
- 跨网段/NAT 场景失败:再查 IP 转发、FORWARD、SNAT/DNAT 和两端网关。
今日小结
nmcli管连接配置,NetworkManager在后台执行,ip link set ens160 down/up直接切换网卡当前状态。- 端口属于监听它的进程;先用
ss -tulnp确认服务存在,再谈防火墙放行。 DROP静默丢弃,REJECT明确拒绝;iptables 规则从上到下匹配。- 访问本机服务看 INPUT,转发别人的流量看 FORWARD,本机发出流量看 OUTPUT;SNAT 在 POSTROUTING,DNAT 在 PREROUTING。
- server1 做网关时需要开启
net.ipv4.ip_forward=1,再用 MASQUERADE/SNAT 让内网主机出网。 - Rocky Linux 9 的日常防火墙配置优先使用
firewall-cmd;牢记运行时规则和--permanent规则是两套配置。