文章目录
一、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
可以为每个子控制组分别设置资源限制和优先级