Rocky Linux 10 系统权限与网络管理实战:用户、ACL、sudo、SELinux、NetworkManager 与 firewalld

在 Rocky Linux 10 上做系统管理,最常见的两类问题往往是:

1
2
Permission denied
Network is unreachable

看起来只是“权限不够”和“网络不通”,但真正决定结果的组件远不止一个。

文件访问可能同时受到以下机制约束:

1
2
3
4
5
6
7
8
Linux 用户身份
-> 用户组
-> 文件 Owner/Group/Other 权限
-> POSIX ACL
-> SELinux
-> 文件系统挂载参数
-> Linux Capabilities
-> systemd 服务沙箱

网络请求则要依次经过:

1
2
3
4
5
6
7
8
9
物理链路
-> 网卡与 NetworkManager
-> IP 地址
-> 邻居解析
-> 路由
-> DNS
-> firewalld/nftables
-> SELinux
-> 应用监听地址和端口

如果没有清晰的排查顺序,管理员很容易陷入以下“玄学修复”:

  • 直接执行 chmod -R 777
  • 永久关闭 SELinux;
  • 停止 firewalld;
  • 反复重启 NetworkManager;
  • 手工修改 /etc/resolv.conf
  • 在唯一 SSH 会话里直接更换 IP、网关和防火墙;
  • 同时混用 nmcliip、旧版 network-scripts 和手工配置文件;
  • 服务连不上时先怀疑代码,最后才发现程序只监听了 127.0.0.1

本文基于 Rocky Linux 10,系统讲解本地权限和网络管理,并给出适合生产环境的操作、验证、回滚和故障排查方法。

一、Rocky Linux 10 的权限与网络模型

1.1 权限不是只有 chmod

flowchart TD
    P[进程发起访问] --> U[进程 UID/GID]
    U --> DAC[DAC 权限<br/>Owner/Group/Other]
    DAC --> ACL[POSIX ACL]
    ACL --> MAC[SELinux 强制访问控制]
    MAC --> MOUNT[挂载参数与文件属性]
    MOUNT --> CAP[Capabilities / systemd 沙箱]
    CAP --> RESULT{是否允许访问}

其中:

  • DAC:传统自主访问控制;
  • ACL:为多个用户和组分别授权;
  • SELinux:强制访问控制;
  • Capabilities:将 root 权限拆成更细的能力;
  • systemd 沙箱:限制服务可见目录、可写路径和系统能力。

因此 chmod 777 只改变 DAC,不能绕过 SELinux、只读挂载、noexec、Immutable 属性或 systemd 沙箱。

1.2 Rocky Linux 10 网络由 NetworkManager 管理

Rocky Linux 10 默认使用 NetworkManager,持久化连接配置默认位于:

1
/etc/NetworkManager/system-connections/

推荐工具:

工具 作用
nmcli NetworkManager 命令行管理
nmtui 文本界面管理
nmstatectl 声明式网络配置
ip 查看或临时修改内核网络状态
firewall-cmd 管理 firewalld
ss 查看 Socket 和监听端口
ethtool 查看网卡链路、驱动和 Offload
tcpdump 抓包
diggetent DNS 排查

ip addr addip route add 默认只修改当前内核状态,NetworkManager 重新激活连接后,临时配置可能消失。

二、安装管理工具

1
2
3
4
5
6
dnf install -y \
acl attr sudo libcap \
policycoreutils policycoreutils-python-utils setools-console \
audit NetworkManager NetworkManager-tui nmstate \
iproute iputils bind-utils traceroute tcpdump \
ethtool nmap-ncat lsof firewalld

启动:

1
2
3
systemctl enable --now NetworkManager
systemctl enable --now firewalld
systemctl enable --now auditd

检查:

1
2
3
nmcli general status
firewall-cmd --state
getenforce

三、用户和组管理

3.1 用户数据库

文件 内容
/etc/passwd 用户名、UID、主组、Home、Shell
/etc/shadow 密码哈希和有效期
/etc/group 组和成员
/etc/gshadow 组安全信息
/etc/login.defs 创建用户时的默认策略
/etc/skel 新用户 Home 模板

查看:

1
2
3
4
getent passwd
getent passwd mario
id mario
groups mario

优先使用 getent,因为它也能查询 SSSD、LDAP、FreeIPA 或 Active Directory 等 NSS 数据源。

3.2 创建普通用户

1
2
3
4
5
6
7
useradd \
--create-home \
--shell /bin/bash \
--comment "Mario Operations" \
mario

passwd mario

指定 UID:

1
2
3
4
5
useradd \
--uid 2001 \
--create-home \
--shell /bin/bash \
developer01

企业环境应统一规划 UID/GID,避免 NFS、共享存储和容器挂载时出现“用户名相同但 UID 不同”。

3.3 创建服务账户

1
2
3
4
5
6
useradd \
--system \
--home-dir /var/lib/myapp \
--create-home \
--shell /usr/sbin/nologin \
myapp

原则:

  • 一个服务使用一个账户;
  • 默认不使用 root;
  • 不需要交互登录时使用 nologin
  • 数据目录、日志目录和配置目录分别授权。

3.4 组管理

1
2
3
4
groupadd app-ops
groupadd linux-admins

usermod -aG app-ops mario

注意,下面命令会覆盖用户现有附加组:

1
usermod -G app-ops mario

日常追加组应使用 -aG

查看:

1
2
id mario
getent group app-ops

删除成员:

1
gpasswd -d mario app-ops

3.5 锁定、解锁和过期

1
2
3
4
usermod -L mario
passwd -S mario

usermod -U mario

密码有效期:

1
2
chage -m 1 -M 90 -W 14 mario
chage -l mario

账户到期:

1
chage -E 2026-12-31 mario

禁用离职账户不能只锁密码,因为用户还可能通过 SSH Key、Kerberos 或其他认证方式进入。可同时处理:

1
2
3
usermod -L mario
usermod -e 1 mario
usermod -s /usr/sbin/nologin mario

并回收 SSH Key、sudo、VPN、Token、云平台和 CI/CD 凭证。

四、文件与目录权限

4.1 rwx 的含义

普通文件:

权限 含义
r 读取内容
w 修改内容
x 执行文件

目录:

权限 含义
r 列出目录项名称
w 创建、删除和重命名目录项
x 进入目录并访问其中对象

目录没有 x 时,即使目标文件可读,也可能无法访问。

查看:

1
2
3
ls -l file.txt
ls -ld /srv/app
stat file.txt

4.2 数字权限

权限 数值
r 4
w 2
x 1

常用权限:

权限 用途
600 私钥、密码文件
640 服务配置,组可读
644 普通公开配置或静态文件
700 私有目录
750 服务目录,组可进入
755 公共可读执行目录
770 组共享目录
2770 带 Setgid 的共享目录
1777 类似 /tmp 的公共临时目录

修改:

1
2
3
chmod 640 /etc/myapp/app.conf
chmod 750 /srv/myapp
chmod u=rw,g=r,o= app.conf

4.3 所有者和组

1
2
chown app:app-ops /srv/myapp/app.conf
chgrp app-ops /srv/myapp/app.conf

递归操作前先预览:

1
find /srv/myapp -maxdepth 2 -printf '%u:%g %m %p\n'

不要在根目录或未知挂载点上随意执行递归 chown

4.4 umask

查看:

1
umask

常见结果:

umask 新文件 新目录
022 644 755
027 640 750
077 600 700
002 664 775

临时设置:

1
umask 027

systemd 服务应使用:

1
2
[Service]
UMask=0027

Shell 的 umask 不会自动成为所有 systemd 服务的 Umask。

五、Setuid、Setgid 和 Sticky Bit

5.1 Setuid

Setuid 可执行文件以文件 Owner 身份运行:

1
chmod u+s executable

查找:

1
find / -xdev -type f -perm -4000 -ls

Setuid root 风险较高,应尽量减少。

5.2 Setgid 共享目录

1
2
3
4
groupadd team-a
mkdir -p /srv/projects/team-a
chown root:team-a /srv/projects/team-a
chmod 2770 /srv/projects/team-a

目录内新文件会继承 team-a 组。

5.3 Sticky Bit

1
chmod 1777 /srv/dropbox

公共目录设置 Sticky Bit 后,普通用户不能随意删除其他用户拥有的文件。

5.4 风险权限审计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
find / -xdev \
\( -perm -4000 -o -perm -2000 \) \
-type f -ls

find / -xdev \
-type f \
-perm -0002 \
-ls

find / -xdev \
-type d \
-perm -0002 \
! -perm -1000 \
-ls

六、POSIX ACL

查看:

1
getfacl /srv/projects/team-a

给用户和组授权:

1
2
setfacl -m u:mario:rwx /srv/projects/team-a
setfacl -m g:qa-team:rx /srv/projects/team-a

删除:

1
setfacl -x u:mario /srv/projects/team-a

清空扩展 ACL:

1
setfacl -b /srv/projects/team-a

6.1 ACL Mask

如果看到:

1
2
user:mario:rwx
mask::r-x

Mario 的有效权限是 r-x,不是 rwx

修正:

1
setfacl -m m:rwx /srv/projects/team-a

6.2 默认 ACL

让新文件和子目录继承:

1
2
3
setfacl -m d:u::rwx,d:g::rwx,d:o::--- /srv/projects/team-a
setfacl -m d:g:team-a:rwx /srv/projects/team-a
setfacl -m d:m:rwx /srv/projects/team-a

6.3 备份和恢复 ACL

1
2
getfacl -R -p /srv/projects > /backup/projects.acl
setfacl --restore=/backup/projects.acl

复制和备份时保留 ACL、XAttr 和 SELinux:

1
2
rsync -aHAX source/ target/
tar --acls --xattrs --selinux -cpf backup.tar /srv/projects

七、sudo 最小权限

将管理员加入 wheel:

1
2
usermod -aG wheel mario
sudo -l -U mario

不要直接用普通编辑器修改 sudoers:

1
2
visudo
visudo -f /etc/sudoers.d/app-ops

示例:

1
2
3
%app-ops ALL=(root) /usr/bin/systemctl status myapp.service
%app-ops ALL=(root) /usr/bin/systemctl restart myapp.service
%app-ops ALL=(root) /usr/bin/journalctl -u myapp.service

权限与校验:

1
2
chmod 0440 /etc/sudoers.d/app-ops
visudo -cf /etc/sudoers

谨慎使用:

1
%app-ops ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp.service

不要使用:

1
mario ALL=(ALL) NOPASSWD: ALL

复杂参数和通配符容易产生越权,推荐使用 root 所有、普通用户不可写的 Wrapper,再由 sudoers 放行 Wrapper。

查看日志:

1
2
journalctl _COMM=sudo
ausearch -m USER_CMD

八、Linux Capabilities

查看:

1
getcap -r / 2>/dev/null

允许普通进程监听低端口:

1
2
setcap cap_net_bind_service=+ep /usr/local/bin/myserver
getcap /usr/local/bin/myserver

移除:

1
setcap -r /usr/local/bin/myserver

常见能力:

Capability 作用
CAP_NET_BIND_SERVICE 监听低端口
CAP_NET_RAW Raw Socket、部分抓包和 ICMP
CAP_NET_ADMIN 修改网络和路由,权限很大
CAP_SYS_TIME 修改系统时间
CAP_DAC_OVERRIDE 绕过部分 DAC

systemd 示例:

1
2
3
4
5
6
[Service]
User=myapp
Group=myapp
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true

不要轻易授予 CAP_SYS_ADMIN,它接近“新的 root”。

九、SELinux 管理

状态:

1
2
getenforce
sestatus

生产环境推荐保持:

1
Enforcing

查看上下文:

1
2
3
ls -lZ /srv/myapp
ps -eZ | grep myapp
id -Z

9.1 持久化文件上下文

让 Nginx 读取 /srv/web

1
2
3
4
5
6
semanage fcontext \
-a \
-t httpd_sys_content_t \
'/srv/web(/.*)?'

restorecon -Rv /srv/web

允许写上传目录:

1
2
3
4
5
6
semanage fcontext \
-a \
-t httpd_sys_rw_content_t \
'/srv/web/uploads(/.*)?'

restorecon -Rv /srv/web/uploads

chcon 适合临时测试,不适合作为长期配置,因为重新标记后可能丢失。

9.2 Boolean

1
2
getsebool -a | grep httpd
setsebool -P httpd_can_network_connect on

不要看到连接失败就打开所有 Boolean,应先理解它扩大了什么权限。

9.3 非标准端口

1
2
3
4
5
6
7
semanage port -l | grep http_port_t

semanage port \
-a \
-t http_port_t \
-p tcp \
8088

端口已有其他类型时使用 -m

9.4 AVC 排查

1
2
ausearch -m AVC,USER_AVC -ts recent
ausearch -m AVC -ts recent | audit2why

正确顺序:

  1. 检查 DAC;
  2. 检查路径和 Context;
  3. 查找标准 SELinux 类型;
  4. 查找已有 Boolean;
  5. 确认应用目录和端口是否合理;
  6. 最后才考虑自定义策略。

不要无脑把 AVC 输入 audit2allow,否则可能把错误配置固化成权限漏洞。

临时诊断:

1
2
3
setenforce 0
# 完成验证后
setenforce 1

不要永久关闭 SELinux。

十、挂载参数与文件属性

查看挂载:

1
findmnt -T /srv/myapp/data/file.db

常见参数:

参数 影响
ro 只读
noexec 禁止直接执行
nosuid 忽略 Setuid/Setgid
nodev 不解释设备文件
noatime 不更新访问时间

查看 Immutable:

1
lsattr /etc/myapp/app.conf

移除:

1
chattr -i /etc/myapp/app.conf

添加:

1
chattr +i /etc/myapp/app.conf

十一、SSH 权限与访问控制

公钥目录:

1
2
3
4
chmod 700 /home/mario/.ssh
chmod 600 /home/mario/.ssh/authorized_keys
chown -R mario:mario /home/mario/.ssh
restorecon -Rv /home/mario/.ssh

检查整条路径:

1
namei -l /home/mario/.ssh/authorized_keys

建立 SSH 组:

1
2
groupadd ssh-users
usermod -aG ssh-users mario

在确认公钥登录可用后,创建 /etc/ssh/sshd_config.d/10-hardening.conf

1
2
3
4
5
6
7
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowGroups ssh-users
MaxAuthTries 3
LoginGraceTime 30

校验:

1
2
sshd -t
sshd -T | grep -E 'permitrootlogin|passwordauthentication|allowgroups'

重新加载:

1
systemctl reload sshd

修改 SSH 时保留旧会话,并用新会话验证成功后再退出。

十二、Permission denied 的标准排查顺序

12.1 进程身份

1
2
3
4
id
id myapp
ps -o user,group,pid,cmd -C myapp
systemctl show myapp -p User -p Group

12.2 路径每一层

1
namei -l /srv/myapp/data/file.db

12.3 DAC 和 ACL

1
2
3
ls -ld /srv /srv/myapp /srv/myapp/data
stat /srv/myapp/data/file.db
getfacl /srv/myapp/data/file.db

12.4 SELinux

1
2
3
ls -ldZ /srv/myapp/data
ps -eZ | grep myapp
ausearch -m AVC -ts recent

12.5 挂载与属性

1
2
findmnt -T /srv/myapp/data/file.db
lsattr /srv/myapp/data/file.db

12.6 systemd 沙箱

1
2
3
4
5
6
7
8
9
systemctl cat myapp
systemctl show myapp \
-p ProtectSystem \
-p ProtectHome \
-p ReadOnlyPaths \
-p ReadWritePaths \
-p DynamicUser

systemd-analyze security myapp.service

十三、NetworkManager 基础

NetworkManager 中:

1
2
Device:实际设备,如 ens160、bond0、br0
Connection:持久化 Profile,如 prod-net、bond-prod

查看:

1
2
3
4
5
6
nmcli device status
nmcli connection show
nmcli connection show --active

nmcli -f DEVICE,TYPE,STATE,CONNECTION device
nmcli -f NAME,UUID,TYPE,DEVICE connection

内核状态:

1
2
3
4
5
6
ip -br link
ip -br address
ip route
ip -6 route
ip rule
ip neigh

Keyfile:

1
ls -l /etc/NetworkManager/system-connections/

手工修改后:

1
2
3
4
5
chown root:root /etc/NetworkManager/system-connections/prod-net.nmconnection
chmod 600 /etc/NetworkManager/system-connections/prod-net.nmconnection

nmcli connection reload
nmcli connection up prod-net

优先使用 nmclinmtuinmstatectl,减少 Keyfile 语法错误。

十四、主机名管理

1
2
3
hostnamectl set-hostname app01.example.com
hostnamectl
getent hosts app01.example.com

设置主机名不会自动创建 DNS 记录,生产环境还需要配置正反向解析。

十五、DHCP 与静态 IP

15.1 DHCP

1
2
3
4
5
6
7
8
9
nmcli connection add \
type ethernet \
con-name dhcp-ens160 \
ifname ens160 \
ipv4.method auto \
ipv6.method auto \
connection.autoconnect yes

nmcli connection up dhcp-ens160

将已有 Profile 改为 DHCP:

1
2
3
4
5
6
nmcli connection modify prod-net \
ipv4.method auto \
ipv4.addresses "" \
ipv4.gateway "" \
ipv4.dns "" \
ipv4.ignore-auto-dns no

15.2 静态 IPv4

假设:

1
2
3
4
接口:ens160
地址:192.168.9.20/24
网关:192.168.9.1
DNS:192.168.9.5、192.168.9.6

创建:

1
2
3
4
5
6
7
8
9
10
11
12
13
nmcli connection add \
type ethernet \
con-name prod-net \
ifname ens160 \
ipv4.method manual \
ipv4.addresses 192.168.9.20/24 \
ipv4.gateway 192.168.9.1 \
ipv4.dns "192.168.9.5 192.168.9.6" \
ipv4.ignore-auto-dns yes \
ipv6.method auto \
connection.autoconnect yes

nmcli connection up prod-net

验证:

1
2
3
4
5
nmcli device show ens160
ip -4 address show dev ens160
ip route
ping -c 3 192.168.9.1
getent ahosts example.com

15.3 多个地址

1
2
3
4
nmcli connection modify prod-net \
+ipv4.addresses 192.168.9.21/24

nmcli connection up prod-net

删除:

1
2
nmcli connection modify prod-net \
-ipv4.addresses 192.168.9.21/24

15.4 远程修改使用 Checkpoint

先修改 Profile,再使用 Checkpoint 安全激活:

1
2
3
4
5
nmcli device checkpoint \
--timeout 90 \
ens160 \
-- \
nmcli connection up prod-net

如果 SSH 仍正常,输入 Yes 确认;如果连接断开而无法确认,NetworkManager 会在超时后尝试回滚。

仍建议保留第二条 SSH 会话,并准备带外控制台。

十六、DNS 管理

查看 DNS:

1
2
nmcli device show | grep -E 'IP4.DNS|IP6.DNS'
cat /etc/resolv.conf

固定 DNS:

1
2
3
4
5
6
nmcli connection modify prod-net \
ipv4.ignore-auto-dns yes \
ipv4.dns "192.168.9.5 192.168.9.6" \
ipv4.dns-search "example.com corp.example.com"

nmcli connection up prod-net

不要长期直接编辑 /etc/resolv.conf,NetworkManager 可能重新生成。

多连接 DNS 优先级:

1
2
nmcli connection modify prod-net ipv4.dns-priority 10
nmcli connection modify backup-net ipv4.dns-priority 100

数值越小,优先级越高。

排查:

1
2
3
4
ping -c 3 1.1.1.1
ping -c 3 192.168.9.5
dig @192.168.9.5 example.com
getent hosts example.com

dig 直接测试 DNS,getent 会经过 NSS 完整解析链。

十七、IPv6

查看:

1
2
ip -6 address
ip -6 route

自动:

1
nmcli connection modify prod-net ipv6.method auto

静态:

1
2
3
4
5
nmcli connection modify prod-net \
ipv6.method manual \
ipv6.addresses 2001:db8:9::20/64 \
ipv6.gateway 2001:db8:9::1 \
ipv6.dns "2001:4860:4860::8888"

仅禁用某 Profile:

1
nmcli connection modify prod-net ipv6.method disabled

不要因一次 IPv6 超时就全局关闭协议栈,应先检查 AAAA、路由和防火墙。

十八、默认网关和路由 Metric

查看:

1
2
ip route
nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP4.ROUTE device show

设置优先级:

1
2
nmcli connection modify prod-net ipv4.route-metric 100
nmcli connection modify backup-net ipv4.route-metric 500

数值越小优先。

不允许存储网、心跳网提供默认路由:

1
2
3
nmcli connection modify storage-net \
ipv4.never-default yes \
ipv6.never-default yes

多条同 Metric 默认路由容易造成出入口不对称和连接随机中断。

十九、静态路由和策略路由

临时静态路由:

1
2
3
4
5
ip route add \
10.20.0.0/16 \
via 192.168.9.254 \
dev ens160 \
metric 100

持久化:

1
2
3
4
nmcli connection modify prod-net \
+ipv4.routes "10.20.0.0/16 192.168.9.254 100"

nmcli connection up prod-net

验证真实选择:

1
ip route get 10.20.1.10

策略路由临时示例:

1
2
3
4
5
6
7
8
9
10
ip route add \
table 200 \
default via 192.168.20.1 dev ens192

ip rule add \
priority 100 \
from 192.168.20.10/32 \
table 200

ip route get 8.8.8.8 from 192.168.20.10

持久化复杂策略路由建议使用 NetworkManager ipv4.routesipv4.routing-rules 或 Nmstate。执行前查看:

1
man nm-settings-nmcli

19.1 rp_filter

1
2
sysctl net.ipv4.conf.all.rp_filter
sysctl net.ipv4.conf.ens160.rp_filter
含义
0 关闭
1 严格
2 宽松

不要遇到多网卡回包问题就全局设为 0。先修正路由和 Policy Rule,确实需要非对称路由时再评估宽松模式 2。

二十、VLAN

1
2
3
4
5
6
7
8
9
10
11
12
nmcli connection add \
type vlan \
con-name vlan100 \
ifname ens160.100 \
dev ens160 \
id 100 \
ipv4.method manual \
ipv4.addresses 192.168.100.20/24 \
ipv4.gateway 192.168.100.1 \
ipv4.dns "192.168.100.5"

nmcli connection up vlan100

检查:

1
ip -d link show ens160.100

交换机 Trunk 必须允许 VLAN 100 Tagged 流量。

二十一、Bond

常见模式:

模式 用途
active-backup 主备,交换机配置简单
802.3ad LACP,需要交换机配合
balance-xor 哈希分流,需要配合交换机

Active-Backup:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
nmcli connection add \
type bond \
con-name bond0 \
ifname bond0 \
bond.options "mode=active-backup,miimon=100" \
ipv4.method manual \
ipv4.addresses 192.168.9.20/24 \
ipv4.gateway 192.168.9.1 \
ipv4.dns "192.168.9.5 192.168.9.6"

nmcli connection add \
type ethernet \
port-type bond \
con-name bond0-port1 \
ifname ens160 \
controller bond0

nmcli connection add \
type ethernet \
port-type bond \
con-name bond0-port2 \
ifname ens192 \
controller bond0

nmcli connection up bond0

查看:

1
cat /proc/net/bonding/bond0

LACP:

1
2
3
4
5
nmcli connection add \
type bond \
con-name bond0 \
ifname bond0 \
bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4"

Linux 配置 802.3ad 后,交换机必须配置相应 LAG/LACP。

二十二、Bridge

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nmcli connection add \
type bridge \
con-name br0 \
ifname br0 \
ipv4.method manual \
ipv4.addresses 192.168.9.20/24 \
ipv4.gateway 192.168.9.1 \
ipv4.dns "192.168.9.5 192.168.9.6"

nmcli connection add \
type ethernet \
port-type bridge \
con-name br0-port1 \
ifname ens160 \
controller br0

nmcli connection up br0

检查:

1
2
3
ip -d link show br0
bridge link
bridge fdb show br br0

地址应配置在 br0,不要继续保留在 ens160 上。

二十三、MTU

1
2
3
4
nmcli connection modify prod-net \
802-3-ethernet.mtu 9000

nmcli connection up prod-net

Jumbo Frame 必须端到端一致。

测试 1500 MTU:

1
ping -M do -s 1472 -c 3 192.168.9.1

测试 9000 MTU:

1
ping -M do -s 8972 -c 3 192.168.9.30

MTU 不一致时常见现象是小包正常、大包卡住,SSH 可用但 HTTPS 或数据库异常。

二十四、Nmstate 声明式配置

查看:

1
nmstatectl show

static-ip.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
---
interfaces:
- name: ens160
type: ethernet
state: up
ipv4:
enabled: true
dhcp: false
address:
- ip: 192.168.9.20
prefix-length: 24
ipv6:
enabled: true
autoconf: true
dhcp: true

routes:
config:
- destination: 0.0.0.0/0
next-hop-interface: ens160
next-hop-address: 192.168.9.1

dns-resolver:
config:
server:
- 192.168.9.5
- 192.168.9.6
search:
- example.com

应用:

1
nmstatectl apply static-ip.yml

Nmstate 适合复杂路由、Bond、Bridge、VLAN 和自动化批量配置。

二十五、firewalld Zone

查看:

1
2
3
firewall-cmd --get-zones
firewall-cmd --get-default-zone
firewall-cmd --get-active-zones

常见 Zone:

Zone 用途
public 不可信网络
external NAT 网关外侧
internal 内网
dmz 对外服务区
trusted 默认全部接受,谨慎使用
drop 丢弃入站

25.1 Runtime 与 Permanent

Runtime:

1
firewall-cmd --zone=public --add-service=http

Permanent:

1
2
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload

安全流程:先加 Runtime 测试,通过后再写 Permanent。

25.2 服务和端口

1
2
3
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload

优先使用 Service,语义更清楚。

25.3 接口绑定 Zone

1
2
nmcli connection modify storage-net connection.zone internal
nmcli connection up storage-net

查看:

1
firewall-cmd --get-active-zones

25.4 仅允许内网 SSH

先添加允许规则:

1
2
3
4
5
6
firewall-cmd \
--permanent \
--zone=public \
--add-rich-rule='rule family="ipv4" source address="192.168.9.0/24" service name="ssh" accept'

firewall-cmd --reload

新开 SSH 会话验证,再删除全网开放:

1
2
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --reload

25.5 Rich Rule 优先级

1
2
3
4
firewall-cmd \
--permanent \
--zone=public \
--add-rich-rule='rule priority="-100" family="ipv4" source address="203.0.113.10/32" drop'

数值越小越先执行。冲突规则中先匹配者生效。

二十六、路由转发和 NAT

开启 IPv4 转发:

1
2
3
4
5
cat > /etc/sysctl.d/90-router.conf <<'SYSCTL'
net.ipv4.ip_forward = 1
SYSCTL

sysctl --system

Masquerade:

1
2
firewall-cmd --permanent --zone=external --add-masquerade
firewall-cmd --reload

端口转发:

1
2
3
4
5
6
firewall-cmd \
--permanent \
--zone=external \
--add-forward-port=port=8443:proto=tcp:toport=443:toaddr=192.168.9.30

firewall-cmd --reload

不要同时让 firewalld、手工 nft、iptables 脚本和第三方安全软件互相修改同一套规则。

二十七、应用监听与端口

1
2
3
ss -lntup
ss -lntp 'sport = :8080'
lsof -nP -iTCP:8080 -sTCP:LISTEN

监听地址:

1
2
3
4
127.0.0.1:8080:仅本机
192.168.9.20:8080:仅指定地址
0.0.0.0:8080:全部 IPv4 地址
[::]:8080:IPv6,是否同时接收 IPv4 取决于系统和应用

服务 Active 不等于远程可访问,还需要路由、防火墙、SELinux和监听地址同时正确。

二十八、网络故障排查顺序

flowchart TD
    L1[1. 链路与网卡] --> L2[2. IP 地址]
    L2 --> L3[3. 邻居与网关]
    L3 --> L4[4. 路由与策略路由]
    L4 --> L5[5. DNS]
    L5 --> L6[6. firewalld / SELinux]
    L6 --> L7[7. 应用监听与协议]

28.1 链路

1
2
3
4
5
ip -br link
nmcli device status
ethtool ens160
ip -s link show ens160
ethtool -S ens160

关注 Link、Speed、Duplex、Errors、Drops、CRC。

28.2 IP

1
2
ip -br address
nmcli device show ens160

检查地址、Prefix、重复 IP,以及 Bridge/Bond 场景是否把地址配错设备。

28.3 邻居与网关

1
2
3
ip neigh
ping -c 3 192.168.9.1
arping -D -I ens160 192.168.9.20

FAILEDINCOMPLETE 通常表示 ARP/NDP 没有成功。

28.4 路由

1
2
3
4
ip route
ip rule
ip route get 8.8.8.8
ip route get 10.20.1.10

28.5 DNS

1
2
3
4
cat /etc/resolv.conf
dig example.com
dig @192.168.9.5 example.com
getent ahosts example.com

28.6 防火墙与 SELinux

1
2
3
4
firewall-cmd --get-active-zones
firewall-cmd --list-all
nft list ruleset
ausearch -m AVC -ts recent

28.7 应用层

1
2
3
4
5
curl -v http://127.0.0.1:8080/
curl -v http://192.168.9.20:8080/
nc -vz 192.168.9.20 8080

tcpdump -ni any host 192.168.9.30 and port 8080

看到 SYN 进入却没有 SYN-ACK,重点检查本机应用、firewalld、SELinux 和回程路由;完全看不到包,则检查上游网络、路由和安全组。

二十九、常见网络问题

29.1 Keyfile 修改不生效

1
2
nmcli connection reload
nmcli connection up prod-net

确认修改的是当前激活 Profile,而不是旧 Profile。

29.2 网卡 unmanaged

1
2
3
4
5
6
7
nmcli device status

grep -Rni unmanaged \
/etc/NetworkManager \
/usr/lib/NetworkManager

nmcli device set ens160 managed yes

如果存在持久化 unmanaged-devices,需修正配置。

29.3 IP 能通、域名不通

1
2
3
ping -c 3 1.1.1.1
dig example.com
getent hosts example.com

重点查 DNS,不要笼统判断为网络断开。

29.4 能 Ping、端口不通

Ping 是 ICMP,业务可能是 TCP/UDP:

1
2
3
4
ss -lntup
firewall-cmd --list-all
nc -vz SERVER_IP PORT
tcpdump -ni any port PORT

29.5 本机成功、远程失败

本机 127.0.0.1 成功而远程失败,先检查应用是否只监听 Loopback。

29.6 多网卡回包走错

1
ip route get CLIENT_IP from SERVER_IP

修正 Metric、never-default 或策略路由。

29.7 小包正常、大包失败

1
2
tracepath DESTINATION
ping -M do -s 1472 DESTINATION

检查 MTU、VPN、VXLAN 和 ICMP Fragmentation Needed。

29.8 firewalld 规则加错 Zone

1
2
firewall-cmd --get-active-zones
firewall-cmd --zone=实际Zone --list-all

规则在 public,接口却属于 internal 时,不会按预期生效。

三十、远程网络变更安全流程

在 SSH 中修改网络前:

  1. 准备带外管理或控制台;
  2. 保留现有 SSH 会话;
  3. 打开第二条 SSH 会话;
  4. 备份 NetworkManager Profile;
  5. 使用 NetworkManager Checkpoint;
  6. 先加新地址并验证;
  7. 再删除旧地址;
  8. 先加新防火墙规则,再删除旧规则;
  9. 每一步执行 ip route getpingcurl
  10. 最后清理旧配置。

备份:

1
2
3
4
5
6
7
8
9
10
11
mkdir -p /root/network-backup

cp -a \
/etc/NetworkManager/system-connections \
"/root/network-backup/system-connections-$(date +%F-%H%M%S)"

nmcli connection show > /root/network-backup/connections.txt
ip address > /root/network-backup/ip-address.txt
ip route show table all > /root/network-backup/ip-route.txt
ip rule > /root/network-backup/ip-rule.txt
firewall-cmd --list-all-zones > /root/network-backup/firewalld.txt

不要把 systemctl restart NetworkManager 当成日常应用配置命令。优先使用:

1
2
nmcli connection up PROFILE
nmcli device reapply DEVICE

三十一、权限与网络审计

登录历史:

1
2
3
4
who
w
last
lastlog

Audit 规则:

1
2
3
4
5
6
7
8
9
10
11
12
cat > /etc/audit/rules.d/50-privilege-network.rules <<'EOF_AUDIT'
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_changes
-w /etc/passwd -p wa -k identity_changes
-w /etc/shadow -p wa -k identity_changes
-w /etc/group -p wa -k identity_changes
-w /etc/gshadow -p wa -k identity_changes
-w /etc/NetworkManager/system-connections/ -p wa -k network_changes
-w /etc/firewalld/ -p wa -k firewall_changes
EOF_AUDIT

augenrules --load

查询:

1
2
3
4
ausearch -k sudoers_changes
ausearch -k identity_changes
ausearch -k network_changes
ausearch -k firewall_changes

权限基线:

1
2
3
4
find / -xdev \( -nouser -o -nogroup \) -ls
find / -xdev -type f -perm /6000 -ls
find / -xdev -type f -perm -0002 -ls
getcap -r / 2>/dev/null

三十二、备份与恢复

ACL:

1
2
mkdir -p /backup/system-baseline
getfacl -R -p /srv > /backup/system-baseline/srv.acl

系统配置:

1
2
3
4
5
6
tar \
--acls \
--xattrs \
--selinux \
-czf "/backup/system-baseline/etc-$(date +%F-%H%M%S).tar.gz" \
/etc

网络配置:

1
2
3
4
5
6
7
tar \
--xattrs \
--acls \
-czf "/backup/system-baseline/network-$(date +%F-%H%M%S).tar.gz" \
/etc/NetworkManager \
/etc/firewalld \
/etc/sysctl.d

恢复后:

1
2
3
restorecon -Rv /etc/NetworkManager /etc/firewalld
nmcli connection reload
firewall-cmd --reload

远程恢复网络配置前必须准备控制台。

三十三、生产检查清单

用户与组

  • 普通用户不共享账号;
  • 服务使用独立系统账户;
  • 不需要交互登录的账户使用 nologin
  • 离职账户已回收密码、SSH Key、sudo 和外部凭证;
  • UID/GID 有统一规划;
  • 管理员使用 sudo,不共享 root 密码。

文件权限

  • 配置文件不使用 777
  • 私钥、Token、密码文件使用 600640
  • 共享目录使用 Setgid 和默认 ACL;
  • ACL Mask 已验证;
  • Setuid、Setgid 和 World-Writable 文件定期审计;
  • 备份保留 ACL、XAttr 和 SELinux Context;
  • 挂载参数符合目录用途。

sudo、Capabilities 与 SELinux

  • sudoers 使用 /etc/sudoers.d
  • 所有规则通过 visudo -c
  • NOPASSWD 仅用于严格限定命令;
  • 没有随意授予 CAP_SYS_ADMIN
  • SELinux 保持 Enforcing;
  • 自定义目录使用 semanage fcontext
  • 非标准端口配置了正确 SELinux 类型;
  • AVC 按根因处理,没有无脑使用 audit2allow

网络

  • 使用 NetworkManager 管理持久化配置;
  • Keyfile 权限为 root 且普通用户不可写;
  • 地址、Prefix、网关和 DNS 已验证;
  • 多网卡 Route Metric 清晰;
  • 非出口网络设置 never-default
  • 静态路由和策略路由已验证回程;
  • VLAN 与交换机 Trunk 一致;
  • Bond 模式与交换机配置一致;
  • Bridge 的地址配置在 Bridge;
  • MTU 端到端一致;
  • 远程变更有 Checkpoint 或带外管理。

firewalld

  • firewalld 保持运行;
  • 接口位于正确 Zone;
  • 优先使用 Service;
  • SSH 只允许可信来源;
  • Runtime 测试通过后再写 Permanent;
  • 没有混用多套防火墙管理脚本;
  • 端口开放后仍检查应用监听和 SELinux。

三十四、总结

Rocky Linux 10 的权限管理可以归纳为:

1
2
3
4
5
6
7
进程身份
-> DAC
-> ACL
-> SELinux
-> 挂载与属性
-> Capability
-> systemd 沙箱

网络管理可以归纳为:

1
2
3
4
5
6
7
8
9
链路
-> NetworkManager
-> IP
-> 邻居
-> 路由
-> DNS
-> firewalld
-> SELinux
-> 应用监听

推荐遵守以下原则:

  1. 不要用 chmod 777 代替权限设计;
  2. 普通服务不要以 root 运行;
  3. 使用 sudo 和 Capabilities 做最小权限;
  4. 共享目录使用 Setgid 和默认 ACL;
  5. SELinux 保持 Enforcing;
  6. Rocky Linux 10 网络配置使用 NetworkManager Keyfile;
  7. ip 适合观察和临时测试,持久化使用 nmclinmtuinmstatectl
  8. 多网卡必须明确默认路由、Metric 和回程路径;
  9. firewalld 的 Zone 必须与实际接口对应;
  10. 远程网络变更必须准备 Checkpoint、第二会话或带外控制台;
  11. 排障时按层检查,不靠关闭安全组件碰运气;
  12. 权限和网络配置都必须可审计、可备份、可回滚。

Linux 最危险的命令往往不是多复杂,而是管理员在不知道根因时输入的:

1
chmod -R 777 /

或者:

1
systemctl stop firewalld

系统管理的目标不是让问题暂时消失,而是知道哪一层拒绝了请求,并只修改真正需要修改的那一层。

参考资料


Rocky Linux 10 系统权限与网络管理实战:用户、ACL、sudo、SELinux、NetworkManager 与 firewalld
https://allendericdalexander.github.io/2026/07/31/devops/linux/rocky/rocky-linux-10-system-permission-network-management/
作者
AtLuoFu
发布于
2026年7月31日
许可协议