在 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、网关和防火墙;
同时混用 nmcli、ip、旧版 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
抓包
dig、getent
DNS 排查
ip addr add、ip 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 marioid mariogroups 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.txtls -ld /srv/appstat file.txt
4.2 数字权限
常用权限:
权限
用途
600
私钥、密码文件
640
服务配置,组可读
644
普通公开配置或静态文件
700
私有目录
750
服务目录,组可进入
755
公共可读执行目录
770
组共享目录
2770
带 Setgid 的共享目录
1777
类似 /tmp 的公共临时目录
修改:
1 2 3 chmod 640 /etc/myapp/app.confchmod 750 /srv/myappchmod u=rw,g=r,o= app.conf
4.3 所有者和组 1 2 chown app:app-ops /srv/myapp/app.confchgrp app-ops /srv/myapp/app.conf
递归操作前先预览:
1 find /srv/myapp -maxdepth 2 -printf '%u:%g %m %p\n'
不要在根目录或未知挂载点上随意执行递归 chown。
4.4 umask 查看:
常见结果:
umask
新文件
新目录
022
644
755
027
640
750
077
600
700
002
664
775
临时设置:
systemd 服务应使用:
Shell 的 umask 不会自动成为所有 systemd 服务的 Umask。
五、Setuid、Setgid 和 Sticky Bit 5.1 Setuid Setuid 可执行文件以文件 Owner 身份运行:
查找:
1 find / -xdev -type f -perm -4000 -ls
Setuid root 风险较高,应尽量减少。
5.2 Setgid 共享目录 1 2 3 4 groupadd team-amkdir -p /srv/projects/team-achown root:team-a /srv/projects/team-achmod 2770 /srv/projects/team-a
目录内新文件会继承 team-a 组。
5.3 Sticky Bit
公共目录设置 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 mariosudo -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 2 setcap cap_net_bind_service=+ep /usr/local/bin/myservergetcap /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 =myappGroup =myappAmbientCapabilities =CAP_NET_BIND_SERVICECapabilityBoundingSet =CAP_NET_BIND_SERVICENoNewPrivileges =true
不要轻易授予 CAP_SYS_ADMIN,它接近“新的 root”。
九、SELinux 管理 状态:
生产环境推荐保持:
查看上下文:
1 2 3 ls -lZ /srv/myapp ps -eZ | grep myappid -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
正确顺序:
检查 DAC;
检查路径和 Context;
查找标准 SELinux 类型;
查找已有 Boolean;
确认应用目录和端口是否合理;
最后才考虑自定义策略。
不要无脑把 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/.sshchmod 600 /home/mario/.ssh/authorized_keyschown -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'
重新加载:
修改 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/datastat /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.nmconnectionchmod 600 /etc/NetworkManager/system-connections/prod-net.nmconnection nmcli connection reload nmcli connection up prod-net
优先使用 nmcli、nmtui 或 nmstatectl,减少 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 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.routes、ipv4.routing-rules 或 Nmstate。执行前查看:
19.1 rp_filter 1 2 sysctl net.ipv4.conf.all.rp_filter sysctl net.ipv4.conf.ens160.rp_filter
不要遇到多网卡回包问题就全局设为 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 声明式配置 查看:
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
FAILED 或 INCOMPLETE 通常表示 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 中修改网络前:
准备带外管理或控制台;
保留现有 SSH 会话;
打开第二条 SSH 会话;
备份 NetworkManager Profile;
使用 NetworkManager Checkpoint;
先加新地址并验证;
再删除旧地址;
先加新防火墙规则,再删除旧规则;
每一步执行 ip route get、ping 和 curl;
最后清理旧配置。
备份:
1 2 3 4 5 6 7 8 9 10 11 mkdir -p /root/network-backupcp -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
三十一、权限与网络审计 登录历史:
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
远程恢复网络配置前必须准备控制台。
三十三、生产检查清单 用户与组
文件权限
sudo、Capabilities 与 SELinux
网络
firewalld
三十四、总结 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 -> 应用监听
推荐遵守以下原则:
不要用 chmod 777 代替权限设计;
普通服务不要以 root 运行;
使用 sudo 和 Capabilities 做最小权限;
共享目录使用 Setgid 和默认 ACL;
SELinux 保持 Enforcing;
Rocky Linux 10 网络配置使用 NetworkManager Keyfile;
ip 适合观察和临时测试,持久化使用 nmcli、nmtui 或 nmstatectl;
多网卡必须明确默认路由、Metric 和回程路径;
firewalld 的 Zone 必须与实际接口对应;
远程网络变更必须准备 Checkpoint、第二会话或带外控制台;
排障时按层检查,不靠关闭安全组件碰运气;
权限和网络配置都必须可审计、可备份、可回滚。
Linux 最危险的命令往往不是多复杂,而是管理员在不知道根因时输入的:
或者:
1 systemctl stop firewalld
系统管理的目标不是让问题暂时消失,而是知道哪一层拒绝了请求,并只修改真正需要修改的那一层。
参考资料