容器技术的基础:Linux iptables、cgroup

一、iptables

Linux平台网络安全 主流工具:iptables

iptables 简述

1、Firewall:防火墙,隔离工具;

2、在Linux的内核中使用netfilter构架实现防火墙功能

3、iptables是Linux系统中为用户提供的netfilter管理工具,用于实现对Linux内核中防火墙的管理

iptable结构介绍

基本结构

①容器:瓶子,罐子,用于存放东西;

②规则(policy):准许或拒绝规则,未来书写的防火墙条件就是各种防火墙规则;

③链(chain):存放规则的容器;有五种链:即 prerouting、input、forward、output、postrouting,不同的链只能拥有固定表的规则。

  • 将数据包中的源 IP 地址替换为其他 IP 地址,从而实现 NAT 转换,将内部 IP 地址转换为公网 IP 地址,从而实现外部网络对本地设备的访问。

在这里插入图片描述

④表(table):把具有相同功能的规则的集合叫做’表’。把不同功能的规则,放置在不同的表中进行管理,共有四种表:(优先级次序(由高而低):
raw --> mangle --> nat --> filter)

  a.filter表(默认表):负责于过滤数据包,控制网络流量,屏蔽或准许端口ip;内核板块:iptables_filter
  b.nat表:实现网络地址转换,如共享上网(内网服务器上外网)、端口映射和ip映射;内核板块:iptables_nat
  c.mangle表(每条链都可以使用,最少使用率):数据包的报头进行修改、标记或重定向;内核板块:iptables_mangle
  d.raw表:raw 表用于在经过连接跟踪、NAT 和路由表处理之前对数据包进行处理,因此 raw 表的优先级最高;内核板块:iptables_rew

  ps:一旦用户在某个链上使用了 raw 表,则处理完 raw 表后将跳过 NAT 表和连接追踪处理,即不再做地址转换和数据包的连接跟踪处理。这可以应用在那些不需要进行 NAT 的情况下,以提高性能
 
  在这里插入图片描述
⑤自定义链:自定义的链可以挂在五条链任意一条链下。

数据经过防火墙的流程

下图标注出了各个链的规则可以存放哪些表中,且标注出了路由前后位置:
在这里插入图片描述

iptables 命令

# 查
iptables -L [chain]                                 # 查看某个链上的规则,默认全部
		 [-t <table>]                               # 查看某个表上的规则,默认:filter
		 [-n]    # 将所有的 IP 地址以数字表示,如果不加这一项,0.0.0.0 地址会使用 anywhere 来代替
		 [-v]                                       # 显示 in,out 两项
		 [--line]                                   # 显示规则的序号
# 删		 
iptables -F [chain]                                 # 删除指定链上的所有规则,默认全部
         -D <chain> [-t <table>] <rule_line>        # 删除指定链的指定表上的某一行规则

# 增
iptables -I <chain> [rulenum] <rule>                #插入:在指定链的指定位置(默认为链首)添加规则
		 [-t <table>]                               # 在指定表上添加规则,默认: filter
		 -A <chain> <rule>                          #追加: 在指定的链上追加一条规则至尾部
#改
iptables -t <table> -P <chain> <rule>


# rule 书写规则
-s <ip>[/mask][, ...]      # 指定一个 IP 或 IP 网段,当数据来源的 IP 地址匹配,则适用于此条规则
-d <ip>[/mask][, ...]      # 指定一个 IP 或 IP 网段,当数据的目的 IP 地址匹配,则适用于此条规则
 [-p <protocol>] # 从(tcp,udp,icmp,esp,ah,sctp,mh,all)中指定一个协议,当数据使用该协议时适用当前规则
 [-sport <source_port>]       # 指定一个端口,当数据的来源端口等于该指定值时,适用于当前规则
 [-dport <destination_ports>] # 指定一个端口,当数据的目的端口等于该指定值时,适用于当前规则
! <match_rule>                # 对一条规则匹配条件取非
-i <device>                   # 指定一个网卡,当数据的来源等于该指定网卡时,适用于当前规则
-o <device>                   # 指定一个网卡,当数据从该网卡输出时,适用于当前规则
-j <ACCEPT/DROP/REJECT/<self-define>>       # 当使用 filter 表时,指定对匹配的报文执行的动作
-m                            # 本身并没有什么意义,但是在该限定符之后可以接更多扩展规则

二、 cgroup

cgroup简述

核心组件:Cgroup文件系统、子系统(Subsystem)、控制组(Control Group)。
功能:对进程组进行资源限制(CPU配额、内存限制、磁盘I/O限制等)、优先级管理、统计等操作。通过cgroup,可以控制进程组的CPU、内存、磁盘I/O等资源的使用情况,并提供详细的统计数据。
cgroup文件系统:用于存储Cgroup的配置信息和状态数据。,cgroup使用路径(类似于文件路径)来唯一标识每个cgroup。路径由多个层级组成,表示cgroup的父子关系。子cgroup可以继承父cgroup的资源限制,并可以进一步添加自己的限制。
cgroup子系统:cgroup 由多个cgroup子系统组成,常见的cgroup子系统包括:

  • cpu:用于限制和管理CPU资源的分配和使用。
    memory:用于限制和管理内存资源的分配和使用。
    blkio:用于限制和管理块设备I/O资源的访问。
    net_cls:用于将网络流量分类和标记。
    freezer:用于暂停和恢复cgroup中的进程。
    devices:用于控制设备访问权限。

cgroup实验:

/sys/fs/cgroup 目录下列了各个subsystem资源管理器:
在这里插入图片描述

(一). 挂载与创建CGROUP树

1. 安装Cgroup工具包
在Debian/Ubuntu系统上,可以使用以下命令安装Cgroup工具包(部分系统也会内置):

sudo apt-get install cgroup-tools

在RHEL/CentOS系统上,可以使用以下命令安装:

sudo yum install libcgroup-tools

2. 挂载Cgroup文件系统
创建一个挂载点并挂载Cgroup文件系统:

sudo mkdir /sys/fs/cgroup

sudo mount -t cgroup -o none,name=cgroup /sys/fs/cgroup
sudo mount -t cgroup -o none,name=demo demo ./demo/

cgroup.procs :当前cgroup中的所有进程ID

tasks :当前cgroup中的所有线程ID

3. 建立子Cgroup
通过往里面创建文件夹的方式,建立子cgroup
在这里插入图片描述

4. 添加进程进入Cgroup
往子cgroup中添加进程

查询到当前shell的pid是4150:
在这里插入图片描述

把这个pid加进去cgroup.procs 内:
在这里插入图片描述

检查是否添加成功,父进程的子进程,也会自动加入到这个cgroup,在刚刚的shell里面运行一个top:
在这里插入图片描述

再看cgroup.procs里面内容,如下图:
在这里插入图片描述

5. 检查Cgroup状态
cat /proc/{pid}/cgroup 这里{pid}是查询的进程的pid号。

路径是相对于挂载点的相对路径,默认是挂载于/sys/fs/cgroup下

在这里插入图片描述

root@mst6g:/sys/fs/cgroup/cpu,cpuacct# systemd-cgls

在这里插入图片描述

systemctl status moss.service 也会显示cgroup的状态。

另外也可以通过cgcreate 命令 进行新的控制组创建与设置

6. 创建控制组
使用cgcreate命令创建一个新的控制组:
在/sys/fs/cgroup目录下创建一个名为my_group的控制组,并关联CPU和内存子系统:

sudo cgcreate -g cpu,memory:my_group

在这里插入图片描述

7. 添加进程到控制组
使用cgclassify命令将进程添加到控制组中:

sudo cgclassify -g cpu,memory:my_group PID

其中,PID是要添加的进程ID。

8. 从控制组中移动进程
使用cgclassify命令将进程从一个控制组移动到另一个控制组:

sudo cgclassify -g cpu,memory:another_group PID

9. 删除控制组
使用cgdelete命令删除一个控制组:

sudo cgdelete cpu,memory:my_group

(二)、日常内存CPU限制用法

1. 限制CPU使用率
创建一个控制组,并设置CPU使用进行限制

sudo cgcreate -g cpu:cpu_limit

echo 10000 > /sys/fs/cgroup/cpu/cpu_limit/cpu.cfs_quota_us

echo 200000 > /sys/fs/cgroup/cpu/cpu_limit/cpu.cfs_period_us

(上述表示当前组可占用cpu 10000微秒内核时间,然后让出时间并等待200000微秒,等内核时间过后再占用,以达到限制CPU使用的目地)

将进程添加到控制组中:

sudo cgclassify -g cpu:cpu_limit PID

下面是一个尝试限制的例子:

未对CPU限制前:CPU占用高点在20 ~ 45%之间波动

对CPU限制后:CPU占用高点在10~23%之间波动,且明显感觉滑动/点击操作时,出现应用卡顿情况

2. 限制内存使用量
创建一个控制组,并设置内存使用量限制为300MB:

sudo cgcreate -g memory:mem_limit

echo $((300 1024 1024)) > /sys/fs/cgroup/memory/mem_limit/memory.limit_in_bytes

将进程添加到控制组中:

sudo cgclassify -g memory:mem_limit PID

(三)、其它使用

1. 限制磁盘I/O速率
创建一个控制组,并设置磁盘I/O限制为10MB/s:

sudo cgcreate -g blkio:io_limit

echo "8:0 $(10 1024 1024)" > /sys/fs/cgroup/blkio/io_limit/blkio.throttle.read_bps_device

将进程添加到控制组中:

sudo cgclassify -g blkio:io_limit PID

2. 限制网络带宽
创建一个控制组,并设置网络带宽限制为1Mbps:

sudo cgcreate -g net_cls:net_limit

echo 0x10000 > /sys/fs/cgroup/net_cls/net_limit/net_cls.classid

使用tc命令配置网络限制:

sudo tc qdisc add dev eth0 root handle 1: htb

sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit

sudo tc filter add dev eth0 parent 1: protocol ip prio 1 handle 1: cgroup

将进程添加到控制组中:

sudo cgclassify -g net_cls:net_limit PID

(四)、 Cgroup的嵌套使用

Cgroup支持嵌套使用,即在一个控制组内创建子控制组。例如,可以创建一个名为parent_group的控制组,并在其中创建两个子控制组child_group1和child_group2:

sudo cgcreate -g cpu,memory:parent_group

sudo cgcreate -g cpu,memory:parent_group/child_group1

sudo cgcreate -g cpu,memory:parent_group/child_group2

可以为每个子控制组分别设置资源限制和优先级

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值