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 route

device 是网卡设备,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_ens160

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

ping 使用 ICMP 协议。此规则只影响源地址为 192.168.88.1 的 ICMP 包;并不是关闭本机所有网络。


三、iptables:表、链、规则

1. 五条内置链:包在什么阶段被检查

链什么时候经过最好这样理解
PREROUTING包刚进入本机、路由决定前先改目的地,例如 DNAT
INPUT目标是本机的包外部访问本机 SSH/HTTP
FORWARD包经过本机、但目标不是本机本机充当路由器
OUTPUT本机自己发出的包本机访问外网、服务端回复
POSTROUTING包即将离开本机出口前改源地址,例如 SNAT

最容易混淆的是:

访问本机服务      -> INPUT
本机作为路由器    -> FORWARD
本机发出的流量    -> OUTPUT

2. 常见表

表作用常见场景
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     # 最后验证 DNS

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

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

4. 富规则:按来源做更精细控制

例如只丢弃来自某个 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 和两端网关。

今日小结

  1. nmcli 管连接配置,NetworkManager 在后台执行,ip link set ens160 down/up 直接切换网卡当前状态。
  2. 端口属于监听它的进程;先用 ss -tulnp 确认服务存在,再谈防火墙放行。
  3. DROP 静默丢弃,REJECT 明确拒绝;iptables 规则从上到下匹配。
  4. 访问本机服务看 INPUT,转发别人的流量看 FORWARD,本机发出流量看 OUTPUT;SNAT 在 POSTROUTING,DNAT 在 PREROUTING。
  5. server1 做网关时需要开启 net.ipv4.ip_forward=1,再用 MASQUERADE/SNAT 让内网主机出网。
  6. Rocky Linux 9 的日常防火墙配置优先使用 firewall-cmd;牢记运行时规则和 --permanent 规则是两套配置。

标签: none

添加新评论