深入解析Linux网络、安全与容器技术
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=truepodman 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)。 -
定期更新镜像和运行时工具。
-
相关文章:
深入解析Linux网络、安全与容器技术
1. Netfilter:Linux内核的包处理框架 Netfilter 是Linux内核中用于控制网络数据包的核心机制,负责处理数据包的过滤、修改和转发。其核心功能包括: 包过滤(Packet Filtering):根据规则允许或拒绝数据包通过…...
JDK 24:Java 24 中的新功能
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计…...
java中的枚举类型和c,c++的有区别吗?c,c++的枚举,结构体,联合体,三种数据有什么区别和联系
Java 枚举类型与 C、C 枚举类型的区别 1. 类型安全 Java:Java 的枚举类型是类型安全的。枚举常量是枚举类型的实例,编译器会严格检查传递的参数是否为该枚举类型的有效常量。例如: java Apply enum Color { RED, GREEN, BLUE } // 编译器会检…...
ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程
ventoy启动服务器版iso镜像,注意看server名称,跟之前desktop版ubuntu不一样。没有gui界面。好,进入命令行界面。语言彻底没汉化了,选英文吧,别的更看不懂。 跟桌面版ubuntu类似,选择是否精简系统࿰…...
什么叫税务黑名单?详解税务黑名单的来源。
一、什么叫税务黑名单? 1、税务黑名单是指由税务部门根据相关法律法规和税收管理策,对违反税收法规、逃避纳税义务或其他严重违法违规行为的个人或企业进行记录和公示的名单。 2、被列入税务黑名单意味着该个人或企业在税务方面存在严重的不诚信行为&a…...
计算机二级:基础操作题
一 sinfoinput() info_listsinfo.split(,) print("姓名,年龄") for strname in info_list:snamestrname[:-2]sagestrname[-2:]print("{},{}".format(sname,sage))二 import random as r r.seed(1) sinput("请输入三个整数n,m,…...
python机器学习——新手入门学习笔记
一,概论 1.什么是机器学习 定义: 机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测。 其实就是通过问题和数据,发现规律,并进行预测,与人脑相似。目的就是从历史数据当中获得规律&#x…...
LabVIEW 与 PLC 通讯的常见方式
在工业自动化和数据采集系统中,PLC(可编程逻辑控制器) 广泛用于控制和监测各种设备,而 LabVIEW 作为强大的图形化编程工具,常用于上位机数据处理和可视化。为了实现 LabVIEW 与 PLC 的高效通讯,常见的方法包…...
深度学习 Deep Learning 第9章 卷积网络 CNN
深度学习 Deep Learning 第9章 卷积网络 章节概述 本章深入探讨了卷积网络的原理、变体及其在深度学习中的应用。卷积网络通过卷积操作实现了参数共享和稀疏连接,显著提高了模型的效率和性能。本章首先介绍了卷积操作的基本形式及其在不同数据维度上的应用&#x…...
Tekton系列之实践篇-从触发到完成的完整执行过程
以下介绍的是基于 Gitee 仓库 的 Tekton 工作流程 操作流程 定义task 克隆代码的task # task-clone.yaml apiVersion: tekton.dev/v1beta1 kind: Task metadata:name: git-clone spec:workspaces:- name: source # 工作目录params:- name: repo-url # 你的 Gitee 仓库地址…...
【简单学习】Prompt Engineering 提示词工程
一、Prompt 1、Prompt 是什么? Prompt 是一种人为构造的输入序列,用于引导 GPT 模型根据先前输入的内容生成相关的输出。简单来说,就是你向模型提供的 “提示词”。 在 ChatGpt 中,我们可以通过设计不同的 prompt,让…...
neo4j删除所有数据
neo4j删除所有数据 一次性删除 MATCH (n) DETACH DELETE n ;分批次删除 先删除关系 MATCH ()-[r]->()WITH r LIMIT 100000DELETE rRETURN count(r)在删除节点 MATCH (n)WITH n LIMIT 100000DELETE nRETURN count(n)验证 查询节点总数 MATCH (n) RETURN count(n) AS node…...
零基础入门网络爬虫第5天:Scrapy框架
4周 Srapy爬虫框架 不是一个简单的函数功能库,而是一个爬虫框架 安装:pip install scrapy 检测:scrapy -h Scrapy爬虫框架结构 爬虫框架 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合爬虫框架是一个半成品,能够帮助…...
ARCGIS PRO DSK 栅格数据(Raster)
ArcGIS Pro 中与栅格相关的功能可以在两个单独程序集中的两个命名空间中找到。 1、ArcGIS.Core.dll 中的 ArcGIS.Core.Data.Raster 命名空间提供了栅格类和成员,用于处理栅格数据集、内存栅格、像素块和光标。 2、ArcGIS.Desktop.Mapping.dll 中的 ArcGIS.Desktop.M…...
C#设计模式快速回顾
知识点来源:人间自有韬哥在,豆包 目录 一、七大原则1. 单一职责原则 (Single Responsibility Principle)2. 开放封闭原则 (Open-Closed Principle)3. 里氏替换原则 (Liskov Substitution Principle)4. 接口隔离原则 (Interface Segregation Principle)5…...
分页查询互动问题(用户端)
文章目录 概要整体架构流程技术细节小结 概要 需求分析以及接口设计 技术细节 1.Controller层 GetMapping("/page")ApiOperation("分页查询问题")public PageDTO<QuestionVO> queryQuestionPage(QuestionPageQuery query){return questionService…...
【全队项目】智能学术海报生成系统PosterGenius(项目介绍)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏:🏀大模型实战训练营_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…...
P5356 [Ynoi Easy Round 2017] 由乃打扑克 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: add ( l , r , x ) \operatorname{add}(l,r,x) add(l,r,x):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...
【线程安全问题的原因和方法】【java形式】【图片详解】
在本章节中采用实例图片的方式,以一个学习者的姿态进行描述问题解决问题,更加清晰明了,以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释: 将上述代码进行修改【从并行转化成穿行的方式】不会出…...
MySQL-----视图与索引
目录 视图 1.视图 2.操作 11.索引 1.定义 2.优缺点: 3.分类 4.索引的设计原则 5.索引的使用 作业 视图 1.视图 ❓如果需要在原表中隐藏部分字段时,怎么办? 视图 📖视图: 是一个没有存储任何数据的表,可以对其CRUD视图…...
【差分隐私相关概念】约束下的列联表边缘分布计算方法
列联表及其边缘分布的详细解释 一、列联表的定义 列联表(Contingency Table) 是一种用于表示 多个分类变量联合分布 的表格。其核心是通过多维数组记录不同属性组合的频次。以下是关键点: 分类属性: 设有 k k k 个分类属性 A …...
解决IDEA中maven找不到依赖项的问题
直接去官网找到对应的依赖项jar包,并且下载到本地,然后安装到本地厂库中。 Maven官网:https://mvnrepository.com/ 一、使用mvn install:install-file命令 Maven提供了install:install-file插件,用于手动将jar包安装到本地仓库…...
pyside6的QGraphicsView体系,当鼠标位于不同的物体,显示不同的右键菜单
代码: # 设置样本图片的QGraphicsView模型 from PySide6.QtCore import Qt, QRectF, QObject from PySide6.QtGui import QPainter, QPen, QColor, QAction, QMouseEvent from PySide6.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QGra…...
Python自动化测试 之 DrissionPage 的下载、安装、基本使用详解
Python自动化测试 之 DrissionPage 使用详解 🏡前言:一、☀️DrissionPage的基本概述二、 🗺️环境安装2.1 ✅️️运行环境2.2 ✅️️一键安装 三、🗺️快速入门3.1 页面类🛰️ChromiumPage🛫 SessionPage&…...
Java替换jar包中class文件
在更新java应用版本的运维工作中,由于一些原因,开发没办法给到完整的jar包,这个时候,就可以只将修改后的某个Java类的class文件替换掉原来iar包中的class文件,重新启动服务即可: 1、将jar包和将要替换的cl…...
unix网络编程
unix网络编程 AI出来以后,软件不可能找到工作的,就算找到了也在走下坡路。再过几年,机器人发展起来,连流水线都找不到。人为什么整体不值钱,每个部位却很值钱。你说我初中辍学就去开直播结局会不会比现在好。 更新in…...
常考计算机操作系统面试习题(一下)
目录 操作系统基本类型 操作系统的功能 操作系统的主要任务 进程与线程 进程状态转变 内存管理 文件系统与文件管理 虚拟存储器 设备管理 磁盘调度 死锁 信号量机制 文件打开与管理 进程与线程的互斥与同步 进程同步 进程调度 文件分配磁盘块的方法 程序执行…...
2025_0321_生活记录
刚刚写完待会儿早上要汇报的文档,看了一眼时间,现在已经是凌晨2点多了。一直说要早睡,但是一直都没做到。。。算了,不苛求自己了。 昨天是春分,春分秋分,昼夜平分。不知不觉就到春天了,但房间里…...
三层网络 (服务器1 和 服务器2 在不同网段)
服务器1 和 服务器2 在不同网段,并且通过三层交换机实现通信 1. 网络拓扑 假设网络拓扑如下: 服务器1: mac0:IP 地址 192.168.1.10/24,网关 192.168.1.1 mac1:IP 地址 10.0.1.10/24,网关 10.0…...
AI Tokenization
AI Tokenization 人工智能分词初步了解 类似现在这个,一格子 一格子,拼接出来的,一行或者一句,像不像,我们人类思考的时候组装出来的话,并用嘴说出来了呢。...
