开发者
网络与防火墙 —— 别再关掉防火墙了
网络与防火墙 —— 别再关掉防火墙了
原创
发表于05/27
200

一、NetworkManager:不是累赘,是现代化接口

很多老运维习惯 systemctl stop NetworkManager 并启用 network 服务,然后在 /etc/sysconfig/network-scripts/ifcfg-* 里手工改配置。但在 openEuler(以及 RHEL 8+ 系列)中,NetworkManager 是官方推荐的网络管理工具network 服务已被标记为废弃,未来版本可能移除。

NetworkManager 的三大优势:

  • 统一管理:物理网卡、Bond、Bridge、VLAN、WiFi、VPN 全用一个工具。
  • 动态适应:网卡插拔、网络环境变化(如笔记本切换网络)自动响应。
  • 配置原子化:通过 nmcli 或 GUI 修改配置后自动生效,避免手工编辑的错误。

常用命令(nmcli 是命令行前端):

操作命令
查看所有连接nmcli connection show
查看设备状态nmcli device status
为 eth0 配置静态 IPnmcli con mod eth0 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8
激活连接nmcli con up eth0
重载所有配置nmcli con reload

注意:openEuler 默认安装后,网卡连接名通常为 System eth0 或按设备名生成。修改配置前建议先 nmcli con show 确认准确名称。

二、Bonding 实战:双网卡聚合提可靠性与带宽

生产环境经常需要将两块物理网卡绑定为一个逻辑接口,实现主备或负载均衡。通过 NetworkManager 可以轻松完成:

场景:两块网卡 ens33ens34,做主备模式(mode 1),逻辑接口名为 bond0,IP 为 10.0.0.10/24

# 1. 创建 bond 连接(模式 1 = active-backup)
nmcli con add type bond ifname bond0 bond.options "mode=1,miimon=100"
# miimon=100 表示每 100ms 检测一次链路状态

# 2. 配置 IP(可选 DHCP)
nmcli con mod bond0 ipv4.method manual ipv4.addresses 10.0.0.10/24 ipv4.gateway 10.0.0.1

# 3. 将两个物理网卡添加到 bond
nmcli con add type ethernet ifname ens33 master bond0
nmcli con add type ethernet ifname ens34 master bond0

# 4. 启动
nmcli con up bond0

验证:cat /proc/net/bonding/bond0 可查看详细状态。测试主备:拔掉 ens33 的网线,流量应无缝切换到 ens34。

常用 Bonding 模式

  • mode=0 (balance-rr):轮询,需交换机支持。
  • mode=1 (active-backup):主备,无需交换机配置,最常用。
  • mode=4 (802.3ad):动态链路聚合,需交换机 LACP 支持。

三、防火墙:firewalld 与 nftables 的内核进化

3.1 为什么不要再 systemctl stop firewalld

传统思维里,很多运维觉得防火墙麻烦,直接关掉。但在 openEuler 上,firewalld 后端已经默认切换为 nftables(代替老的 iptables 内核模块)。nftables 带来了:

  • 更快的规则匹配:使用哈希表等数据结构。
  • 原子规则替换:避免了 iptables 中多条规则分步提交导致的中间状态漏洞。
  • 统一工具链nft 命令同时处理 IPv4/IPv6/ARP/Bridge。

如果你彻底关闭 firewalld,相当于放弃了系统自带的访问控制。正确的做法是:保留 firewalld,并放行必要的端口

3.2 firewalld 基础用法(与 CentOS 7 基本相同)

# 查看当前默认区域
firewall-cmd --get-default-zone

# 放行 SSH(持久化)
firewall-cmd --add-service=ssh --permanent

# 放行 TCP 8080 端口
firewall-cmd --add-port=8080/tcp --permanent

# 重新加载使生效
firewall-cmd --reload

# 查看已放行规则
firewall-cmd --list-all

区域(zone)逻辑:不同网卡可以绑定不同区域,例如内网卡放 trusted,外网卡放 public,实现精细控制。

3.3 深入 nftables 直接操作(绕过 firewalld)

对于复杂规则(如限速、NAT、日志记录),firewalld 的抽象可能不够灵活,此时可以直接用 nft 命令。以下是一个限制 SSH 连接频率的示例:

# 先创建一个表
nft add table inet filter
# 添加链(hook input)
nft add chain inet filter input { type filter hook input priority 0\; policy accept\; }
# 限制 SSH:源 IP 每分钟最多 4 个新连接
nft add rule inet filter input tcp dport 22 ct state new limit rate 4/minute accept
# 记录被拒绝的 SSH 连接
nft add rule inet filter input tcp dport 22 drop log prefix "SSH DROP: "

保存规则:nft list ruleset > /etc/nftables/static-rules.nft,并通过 systemd 服务或 firewalld 的 direct 功能持久化(此处不展开)。

建议:95% 的生产场景,使用 firewalld 就足够了。只在性能要求极高或需要特殊匹配时直接使用 nftables。

四、常见网络排障实战

4.1 现象:SSH 连接慢(等待几十秒才出现密码提示)

原因通常是 DNS 反向解析超时。解决方案:

# 修改 /etc/ssh/sshd_config
UseDNS no
# 重启 sshd
systemctl restart sshd

4.2 现象:重启后网卡名变更(如 eth0 变成 ens192)

NetworkManager 默认使用 predictable naming(基于固件/硬件槽位)。可以通过创建 .link 文件固定 MAC 与名称:

cat > /etc/systemd/network/10-persistent-net.link << EOF
[Match]
MACAddress=00:11:22:33:44:55
[Link]
Name=eth0
EOF
systemctl restart systemd-networkd

4.3 现象:ping 不通外网,但内网正常

排查步骤:

  1. ip route show 确认默认网关存在。
  2. cat /etc/resolv.conf 检查 DNS(注意 NetworkManager 可能动态覆盖它)。
  3. traceroute 8.8.8.8 看哪一跳丢失。
  4. 检查防火墙是否阻断了 DNS 端口(UDP 53)或 ICMP:
    firewall-cmd --add-protocol=icmp --permanent
    firewall-cmd --reload

五、运维锦囊:生产环境防火墙策略模板

不要临时用 firewall-cmd 不加 --permanent,否则重启后规则消失。以下是一个安全基线:

# 重置所有规则(谨慎)
firewall-cmd --panic-on   # 紧急切断所有流量
firewall-cmd --panic-off

# 生产推荐配置
firewall-cmd --set-default-zone=public
firewall-cmd --remove-service=ssh --permanent   # 后面手动控制 SSH 来源
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.5" service name="ssh" accept' --permanent
# 开放业务端口
firewall-cmd --add-port=80/tcp --add-port=443/tcp --permanent
# 防御性规则:限制 ping 频率(每秒 10 个包)
firewall-cmd --add-rich-rule='rule protocol value="icmp" limit value="10/s" accept' --permanent
# 记录被拒绝的包(便于排查攻击)
firewall-cmd --set-log-denied=all --permanent
firewall-cmd --reload

六、实验指南

  1. Bonding 实验:虚拟机增加两块网卡(都桥接或 NAT),配置 mode 1 bond,然后依次禁用其中一块网卡(nmcli device disconnect ens33),观察 ping 是否中断。
  2. 防火墙规则演练:先放行 22 端口,然后添加 rich rule 限制只有特定 IP 能 SSH,验证其他 IP 被拒绝。
  3. nftables 直接操作:添加一条规则,记录所有来自 80 端口的新连接日志,然后用 curl 访问本机 Web 服务,观察内核日志 dmesg | tail

七、小结与下期预告

本期打破了“关防火墙保平安”的陋习,教会你使用 NetworkManager 和 firewalld 高效管理网络。在现代 Linux 发行版中,这些工具已经非常稳定,关掉它们反而会增加安全风险和维护复杂度。

下期预告:第 4 期《存储管理与文件系统 —— XFS 的进阶与 RAID 实战》。我们将深入 XFS 参数调优、LVM 瘦供给、磁盘故障模拟及数据恢复,让你在面对磁盘写满、坏道等故障时游刃有余。

上期思考答案:执行 dnf upgrade 升级内核后,旧内核不会被删除,只是作为后备启动项保留。要设置默认启动的内核,使用 grubby --set-default /boot/vmlinuz-&lt;新内核版本&gt; 或修改 /etc/default/grub 中的 GRUB_DEFAULT

本期思考:为什么 firewalld 的 rich rule 比直接的端口放行更安全?在什么场景下你应该使用 firewall-cmd --direct 而不是 rich rule?

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞