1. Netfilter:Linux内核的包处理框架
Netfilter 是Linux内核中用于控制网络数据包的核心机制,负责处理数据包的过滤、修改和转发。其核心功能包括:
-
包过滤(Packet Filtering):根据规则允许或拒绝数据包通过,构成防火墙的基础功能。
-
网络地址转换(NAT):修改数据包的源或目标地址,常用于家庭路由器的端口转发或企业级网关。
-
数据包修改(Packet Mangling):如调整TTL值、QoS标记等。
-
连接跟踪(Connection Tracking):维护网络连接状态,支持状态防火墙。
技术细节:
-
钩子点(Hook Points):Netfilter在内核协议栈的5个关键位置插入钩子(如
NF_IP_PRE_ROUTING
、NF_IP_LOCAL_IN
),允许自定义处理逻辑。 -
内核模块支持:通过
iptables
、nftables
等工具与用户空间交互。
示例:
当数据包进入系统时,Netfilter依次经过以下处理链:
-
PREROUTING:处理路由前的NAT(如目标地址转换)。
-
INPUT:处理发往本机的数据包。
-
FORWARD:处理需要转发的数据包。
-
OUTPUT:处理本机产生的出站数据包。
-
POSTROUTING:处理路由后的NAT(如源地址转换)。
比喻:Netfilter像一个智能快递分拣系统,根据规则决定包裹(数据包)是派送(放行)、退回(拒绝)还是改址(NAT)。
2. nftables vs. iptables:新一代防火墙工具
iptables:
-
传统工具:分为
iptables
(IPv4)、ip6tables
(IPv6)、arptables
(ARP)等,语法分散。 -
性能瓶颈:规则逐条匹配,大规模规则时效率低。
-
维护复杂:不同协议需不同工具管理。
nftables:
-
统一架构:支持IPv4、IPv6、ARP、桥接等所有协议,语法统一。
-
高性能:使用哈希表存储规则,支持规则集(set)和映射(map),提升匹配速度。
-
动态更新:无需重启服务,规则即时生效。
-
简洁语法:规则结构更清晰,支持注释。
规则对比:
允许SSH访问的规则
iptables:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
nftables:
nft add rule inet filter input tcp dport 22 accept
迁移工具:
RHEL提供iptables-translate
工具,可将iptables规则转换为nftables语法。
3. Firewalld:动态防火墙管理
Firewalld 简化了防火墙配置,核心特性包括:
-
动态更新:修改规则无需重启服务,避免网络中断。
-
区域(Zones):将网络接口分配到不同信任级别(如
public
、home
、internal
)。 -
服务(Services):预定义规则组(如
http
、ssh
),支持快速启用常见服务。 -
富规则(Rich Rules):复杂条件的高级配置(如源IP限制)。
常用命令:
# 查看当前区域
firewall-cmd --get-default-zone# 允许HTTP服务并永久生效
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload# 开放自定义端口
firewall-cmd --zone=public --add-port=8080/tcp
配置文件位置:
-
/etc/firewalld/zones/
:存储区域配置。 -
/usr/lib/firewalld/services/
:预定义服务模板。
4. SELinux端口标记:强化网络安全
SELinux通过强制访问控制(MAC)限制资源访问,端口标记的作用是:
-
绑定端口与服务:仅允许特定服务监听指定端口。
-
防止端口滥用:即使进程以root运行,也无法监听未授权的端口。
操作示例:
# 查看HTTP服务允许的端口
semanage port -l | grep http_port_t
# 输出:http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000# 添加端口8080到HTTP服务
semanage port -a -t http_port_t -p tcp 8080
原理:
SELinux为每个端口分配安全上下文(如http_port_t
),服务进程需具有匹配的上下文才能绑定端口。例如,Nginx进程若未标记为httpd_t
类型,即使以root身份运行,也无法监听80端口。
RHEL容器核心技术
1. 支持容器的核心技术
-
Namespaces:隔离进程、网络、挂载点等资源。
-
PID Namespace:容器内进程独立于主机PID空间。
-
Network Namespace:容器拥有独立网络栈(IP、端口等)。
-
-
Control Groups (cgroups):限制资源使用(CPU、内存、磁盘IO)。
-
SELinux:防止容器逃逸和横向攻击。
-
容器工具链:
-
Podman:无守护进程的容器运行时。
-
Buildah:构建符合OCI标准的容器镜像。
-
Skopeo:镜像复制、签名验证。
-
CRI-O:Kubernetes容器运行时接口实现。
-
2. 虚拟化 vs. 容器化
特性 | 虚拟化 | 容器化 |
---|---|---|
隔离级别 | 硬件级(Hypervisor) | 进程级(Namespaces/cgroups) |
启动速度 | 慢(分钟级) | 快(秒级) |
资源开销 | 高(独立OS内核) | 低(共享内核) |
适用场景 | 完整OS环境、异构OS运行 | 微服务、CI/CD、云原生应用 |
架构对比:
-
虚拟机:物理机 → Hypervisor → 多个Guest OS → 应用。
-
容器:物理机 → Host OS → 容器引擎 → 应用。
3. Rootless容器 vs. Rootful容器
特性 | Rootful容器 | Rootless容器 |
---|---|---|
运行用户 | root用户 | 普通用户 |
安全性 | 较高风险(容器逃逸影响主机) | 更低风险(用户命名空间隔离) |
端口绑定 | 可绑定低端口(如80) | 仅能绑定高端口(>1024) |
依赖 | 无需额外配置 | 需用户命名空间支持 |
Rootless容器优势:
-
无需特权:普通用户可直接运行容器。
-
隔离增强:用户命名空间映射容器内root到主机普通用户。
启用Rootless:
# 检查用户命名空间支持
sysctl kernel.unprivileged_userns_clone
# 输出应为1
4. 容器镜像与注册表
-
容器镜像:
-
定义:包含应用代码、运行时、库的只读模板。
-
分层结构:每层基于前一层修改,提升复用性。
-
构建示例:
dockerfile
FROM alpine:latest RUN apk add nginx COPY index.html /var/www/html CMD ["nginx", "-g", "daemon off;"]
-
-
容器注册表:
-
作用:存储、分发镜像(如Docker Hub、Quay.io)。
-
操作命令:
podman pull registry.redhat.io/rhel8/nginx-120 podman push my-image:latest quay.io/myuser/my-image
-
容器管理实战指南
1. RHEL容器工具
-
Podman:
支持Rootless、兼容Docker CLI,命令示例:podman run -d --name web -p 8080:80 nginx podman exec web nginx -t
-
Buildah:
构建镜像,支持精细控制:buildah from alpine:latest buildah run alpine-working-container apk add nginx buildah commit alpine-working-container my-nginx
-
Skopeo:
镜像复制与检查:skopeo copy docker://nginx quay.io/my-repo/nginx skopeo inspect docker://nginx
2. 配置容器注册表
编辑/etc/containers/registries.conf
:
# 允许HTTP访问的自定义注册表
[[registry]]
location = "registry.example.com"
insecure = true # 禁用HTTPS验证# 阻止特定注册表
[[registry]]
location = "malicious.registry"
blocked = true
优先级:
注册表按配置顺序匹配,首个匹配项生效。
3. [[registry]]配置详解
-
location:注册表地址(如
docker.io
)。 -
prefix:镜像名前缀匹配(如
myproject/
)。 -
insecure:布尔值,是否跳过TLS验证。
-
blocked:布尔值,是否阻止访问该注册表。
示例:
仅允许访问内部注册表:
[[registry]]
prefix = ""
location = "docker.io"
blocked = true[[registry]]
location = "internal.registry.corp"
insecure = true
4. 容器文件(Containerfile)
核心指令:
-
FROM:指定基础镜像。
-
RUN:执行命令(如安装软件)。
-
COPY/ADD:复制文件到镜像。
-
CMD/ENTRYPOINT:定义容器启动命令。
-
EXPOSE:声明监听端口。
构建示例:
dockerfile
FROM ubi8/ubi-minimal
RUN microdnf install -y nginx && microdnf clean all
COPY nginx.conf /etc/nginx/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
构建命令:
podman build -t my-nginx .
5. 容器状态及转换
-
Created:已创建但未启动(
podman create
)。 -
Running:正在运行。
-
Paused:暂停(
podman pause
),进程挂起。 -
Exited:已停止,保留配置数据。
-
Removed:已删除,资源释放。
状态管理命令:
podman start my-container
podman stop my-container
podman restart my-container
podman rm my-container
6. 容器环境变量
-
作用:动态配置应用参数(如数据库地址、调试模式)。
-
传递方式:
-
命令行:
-e
选项直接指定:podman run -e "DB_HOST=db.example.com" my-app
-
文件:通过
--env-file
加载多个变量:# env.list DB_HOST=db.example.com DEBUG=true
podman run --env-file=env.list my-app
-
查看环境变量:
podman exec my-container env
7. 创建Systemd用户服务文件
步骤:
-
生成服务文件:
podman generate systemd --name my-container > ~/.config/systemd/user/my-container.service
-
启用并启动服务:
systemctl --user enable --now my-container.service
-
管理服务:
systemctl --user status my-container journalctl --user-unit my-container.service
注意事项:
-
用户服务需启用
linger
以确保用户注销后仍运行:loginctl enable-linger $(whoami)
8. podman generate systemd
选项解析
-
--new
:生成创建新容器的命令(而非依赖现有容器)。
应用场景:确保每次启动都是新实例,避免容器状态残留。podman generate systemd --new --name my-container
-
--files
:直接生成服务文件到当前目录,而非输出到终端。podman generate systemd --files --name my-container # 生成文件 container-my-container.service
9. 配置容器开机自启动
Root用户(系统级服务):
-
生成服务文件到系统目录:
podman generate systemd --new --files --name my-container mv container-my-container.service /etc/systemd/system/
-
启用服务:
systemctl enable container-my-container.service systemctl start container-my-container.service
Rootless用户(用户级服务):
-
确保用户已启用
linger
:sudo loginctl enable-linger $USER
-
将服务文件放置于
~/.config/systemd/user/
并启用。
10. Root用户管理容器的注意事项
-
服务文件权限:确保位于
/etc/systemd/system/
,权限为644
。 -
SELinux策略:若容器需访问非标准资源,可能需调整策略:
setsebool -P container_manage_cgroup true
-
日志管理:使用
journalctl
查看日志:journalctl -u container-my-container.service
-
安全建议:
-
优先使用Rootless容器。
-
限制容器权限(如
--cap-drop=all
)。 -
定期更新镜像和运行时工具。
-