Linux交换空间管理、网络安全加固实战
Linux 交换空间管理
计算机存储器的层次结构
计算机存储器速度越快,成本较高。 为了获得好的性能/价格比,计算机中各种存储器组成一个层状的塔式结构,取长补短,协调工作。
CPU 寄存器,是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。
CPU 高速缓存,也就是CPU Cache,是一种容量小、速度快的高缓冲存储器,由SRAM组成,直接制作在CPU芯片内,速度几乎与CPU一样快。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。
主存储器(Main memory),简称主存或内存,其作用是存放指令和数据,并能由中央处理器(CPU)直接随机存取。主存储器速度比CPU高速缓存慢,但存储容器却大的多。
主存储器的速度一般用存取时间衡量,即每次与CPU间数据处理耗费的时间,以纳秒(ns)为单位。大多数SDRAM内存芯片的存取时间为5、6、7、8或10ns。
主存储器的带宽计算公式:带宽=频率*位宽/8。
例如:DDR4 内存频率是3600 MHz,在64位系统(双通道位宽为128,以此类推),1B=8bit,
单通道 DDR4-3600:3600MHz * 64bit / 8=28800MB/S
双通道 DDR4-3600:3600MHz * 64bit * 2 / 8=57600MB/S
辅助存储器,速度慢的多,优点是容量大,可持久化存储。
计算机存储器的工作原理
CPU运行程序时,先从寄存器中读取数据。如果在寄存器中可以找到数据,则直接从寄存器中读取。如果在寄存器中找不到数据,则从CPU Cache中读取数据,并将数据缓存在CPU Cache中。
如果在CPU cache中可以找到数据,则直接从CPU Cache中读取。如果在CPU cache中找不到数据,则从主存储器(内存)中读取数据,将数据缓存在主存储器中。
如果在内存中可以找到数据,则直接从内存中读取。如果在内存中找不到数据,则从辅助存储器中读取数据,例如机械磁盘、光盘、U盘等,并将数据缓存在内存中。
物理内存
计算机系统将内存划分为固定大小的块,称为 page,标准 page 大小为 4 KiB。进程并不直接对物理内存寻址,每个进程具有虚拟地址空间virtual address space。当进程请求内存时,MMU 将进程获得的虚拟地址(VA,Virtual Address )映射到物理地址(PA,Physical Address )。
MMU是Memory Management Unit的缩写,即内存管理单元,它是CPU中用来管理虚拟存储器、物理存储器的控制线路,负责将虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
==思考:==为什么CPU不直接访问物理地址?
虚拟内存的容量是物理内存和交换空间的总和,而虚拟地址负责映射到物理内存地址和交换空间地址。
进程使用内存的过程中,希望内存是连续的。如果进程直接访问物理地址,则内核很难保证进程获得的物理地址空间是连续的,因为进程存在着运行和退出,就会出现内存碎片化。进程的虚拟地址在虚拟内存中是连续的,达到了内存连续的目的,而 MMU 会将进程的虚拟地址映射到物理地址。
Swap 空间
Swap,意思是“交换”、“实物交易”。Linux Swap(交换)空间是受Linux内核内存子系统控制的磁盘区域。
功能1:当内存使用量超过定义的限制时,内核寻找已分配给进程但空闲的内存页,将该空闲的内存页写入到交换空间,并向其他进程重新分配RAM页面。
功能2:如果某个程序需要访问磁盘上的页面,则内核会找到另一个空闲的内存页, 将其写入到磁盘,然后从交换区重新调用所需的页面。
功能3:如果某个程序需要访问数据,访问的数据存放在交换空间,则该程序直接从交换空间读取数据,而不需要从磁盘原始位置读取,进而提高速度。
简单地说,Linux Swap 空间就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。
交换空间只是临时的解决办法。虽然交换空间能够作为"虚拟"内存使用,但由于交换区位于磁盘上,它的速度比物理内存慢的多,因此如果需要更快的速度的话,最好的办法仍然是加大物理内存。
查看内存
默认单位是KiB,使用-m选项,以MiB为单位
[root@centos7 ~]# free
total used free shared buff/cache available
Mem: 4026156 330460 3528844 12136 166852 3485576
Swap: 4063228 0 4063228
输出说明:
Mem:
total:物理内存空间大小。
used:使用的内存 (total - free - buffers - cache)。
free:未使用的内存空间大小(真正的空闲,未被任何程序占用)。
shared:多个进程共享的内存空间大小。
cached:从磁盘读取的数据占用的内存空间大小,待以后使用(数据没有被修改)。
buffers:被更改但未写回磁盘的数据占用的内存空间大小。
Swap:
total:交换空间大小。
used:使用的交换空间大小。
free:未使用交换空间大小。
Swap 空间大小
管理员应根据系统的内存工作负载来调整交换空间大小。 应用供应商有时会提供这方面的建议。根据物理内存总量,下表提供了一些指导。
笔记本电脑和台式机的Hibernate功能会在关闭系统电源之前使用交换空间来保存RAM内容。重新打开系统时, 内核将从交换空间恢复RAM内容,无需完全启动。 对于这些系统而言,交换空间需要超过RAM量。
创建交换空间
[root@server ~ 11:34:35]# vgs VG #PV #LV #SN Attr VSize VFree centos 1 3 0 wz--n- <199.00g 40.00g webapp 2 2 1 wz--n- 39.99g 29.99g 在webapp中创建4G的交换空间 [root@server ~ 11:34:38]# lvcreate -n swap -L 4G webapp Logical volume "swap" created. [root@server ~ 11:35:07]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home centos -wi-ao---- <45.12g root centos -wi-ao---- 110.00g swap centos -wi-ao---- <3.88g swap webapp -wi-a----- 4.00g webapp01 webapp owi-aos--- 5.00g webapp01-s1 webapp swi-a-s--- 5.00g webapp01 0.01 格式化swap空间 [root@server ~ 11:35:19]# mkswap /dev/webapp/swap 正在设置交换空间版本 1,大小 = 4194300 KiB 无标签,UUID=0a13afb3-5b82-411d-b366-73922f8edba5 激活 swap 空间 [root@server ~ 11:35:56]# swapon /dev/webapp/swap 查看swap设备列表 [root@server ~ 11:36:46]# swapon -s 文件名 类型 大小 已用 权限 /dev/dm-1 partition 4063228 0 -2 /dev/dm-7 partition 4194300 0 -3 取消 swap 空间激活 [root@server ~ 11:37:01]# swapoff /dev/webapp/swap 持久化激活 swap 空间 [root@server ~ 11:37:13]# vim /etc/fstab UUID=0a13afb3-5b82-411d-b366-73922f8edba5 swap swap pri=4 0 0 激活所有交换设备 [root@server ~ 11:38:46]# swapon -a 取消激活所有交换设备 [root@server ~ 11:38:59]# swapon -s 文件名 类型 大小 已用 权限 /dev/dm-1 partition 4063228 0 -2 /dev/dm-7 partition 4194300 0 -3Linux 网络安全加固
Firewalld 防火墙
Firewalld 介绍
Firewalld 是 Red Hat 公司开发的防火墙软件,默认后端为 nftables。
在 CentOS 7 之前的发行版中,默认使用 iptables 命令来管理防火墙。
在 CentOS 7 之后的发行版中, firewalld 取代 iptables 成为了默认防火墙软件。
用户可以同时使用 iptables 和 firewalld 两个防火墙软件,但容易搞混规则。建议将一个防火墙关闭或默认允许所有流量,只使用另一个防火墙。
Firewalld 防火墙的另外一个特点就是动态加载防火墙规则。
Firewalld 和 iptables 之间的关系
firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
firewalld 和 iptables 一样,他们的作用都是用于维护规则,自身并不具备防火墙的功能,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
Firewalld 区域
firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone),每个 zone 就是一套过滤规则集。
Firewalld 提供的区域
firewalld 防火墙提供了如下zone:
trusted(信任区域):允许所有的传入流量。
public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
internal(内部区域):默认值时与homel区域相同。
work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
block(限制区域):拒绝所有传入流量。
drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
查看zone配置 [root@centos7 ~]# cd /usr/lib/firewalld/ [root@centos7 firewalld]# ls helpers icmptypes ipsets services zones # 查看zone配置 [root@centos7 firewalld]# ls zones/ block.xml drop.xml home.xml public.xml work.xml dmz.xml external.xml internal.xml trusted.xml [root@centos7 firewalld]# cat zones/trusted.xml <?xml version="1.0" encoding="utf-8"?> <zone target="ACCEPT"> <short>Trusted</short> <description>All network connections are accepted.</description> </zone> [root@centos7 firewalld]# cat zones/block.xml <?xml version="1.0" encoding="utf-8"?> <zone target="%%REJECT%%"> <short>Block</short> <description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description> </zone> [root@centos7 firewalld]# cat zones/drop.xml <?xml version="1.0" encoding="utf-8"?> <zone target="DROP"> <short>Drop</short> <description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description> </zone>firewall-cmd 命令行工具
两个基本概念
配置防火墙必须知道两个基本概念:
防火墙的配置有两个状态:
runtime(运行时),命令行执行是的默认状态,该状态下的配置立刻生效。
permanent(永久),通过选项 --permanent 指定,该状态下的配置不会立刻生效,而是写入配置文件,需要通过选项 --reload 重新reload才会生效,重新reload将导致运行时状态下未保存的配置丢失,但会保留当前连接状态。如果使用选项 --complete-reload 重新reload永久配置,将导致当前连接状态也丢失。
建议配置防火墙一次性写两条规则:
第一条使用选项 --permanent永久生效;
第二条不使用选项 --permanent 立刻生效。
配置防火墙的规则必须一个区域内(直接规则除外),如果不使用选项 --zone 明确指明区域,则使用默认区域。默认区域是public。
zone 管理
安装nginx服务,为后续做准备 [root@server ~ 14:18:02]# yum install -y nginx 设置开机自启并立即启动 [root@server ~ 14:18:16]# systemctl enable nginx.service --now Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. [root@server ~ 14:18:44]# curl 10.1.8.10 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Welcome to CentOS</title> <style rel="stylesheet" type="text/css"> html { background-image:url(img/html-background.png); background-color: white; font-family: "DejaVu Sans", "Liberation Sans", sans-serif; font-size: 0.85em; line-height: 1.25em; margin: 0 4% 0 4%; } .... 查看默认zone中的规则 [root@server ~ 14:19:08]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 添加http服务到zone [root@server ~ 14:19:44]# firewall-cmd --add-service=http success [root@server ~ 14:19:52]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 查看特定zone中的规则 [root@server ~ 14:20:47]# firewall-cmd --list-all --zone=home home target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 查看激活的zone清单,也就是分配了interface和source的zone [root@server ~ 14:21:25]# firewall-cmd --get-active-zones public interfaces: ens33 来源于特定source的数据包交给特定zone处理 [root@server ~ 14:22:11]# firewall-cmd --add-source 192.168.1.0/24 --zone internal success 查看激活的zone清单,也就是分配了interface和source的zone [root@server ~ 14:22:21]# firewall-cmd --get-active-zones internal sources: 192.168.1.0/24 public interfaces: ens33 查看zone配置 [root@server ~ 14:23:13]# ls /usr/lib/firewalld/zones block.xml drop.xml home.xml public.xml work.xml dmz.xml external.xml internal.xml trusted.xml查看默认zone [root@server ~ 14:52:50]# firewall-cmd --get-default-zone public 设置默认zone,例如设置为block,该操作同时设置永久态默认zone [root@server ~ 14:53:02]# firewall-cmd --set-default-zone block success 查看默认zone [root@server ~ 14:53:15]# firewall-cmd --get-default-zone block 设置回原来的zone [root@server ~ 14:53:24]# firewall-cmd --set-default-zone public success [root@server ~ 14:53:37]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 查看单条zone规则 [root@server ~ 14:53:57]# firewall-cmd --list-services dhcpv6-client http ssh 查看单条zone规则 [root@server ~ 14:54:14]# firewall-cmd --list-interfaces ens33 查看激活的zone清单,也就是分配了interface和source的zone [root@server ~ 14:54:22]# firewall-cmd --get-active-zones internal sources: 192.168.1.0/24 public interfaces: ens33 变更source到其他zone [root@server ~ 14:54:34]# firewall-cmd --change-source=192.168.1.0/24 --zone=work success [root@server ~ 14:55:16]# firewall-cmd --get-active-zones work sources: 192.168.1.0/24 public interfaces: ens33 查看source是否添加 [root@server ~ 14:55:18]# firewall-cmd --query-source=192.168.1.0/24 --zone=work yes 查看source是否添加 [root@server ~ 14:55:57]# firewall-cmd --query-source=192.168.1.0/24 --zone=home no 删除zone中source [root@server ~ 14:56:11]# firewall-cmd --remove-source=192.168.1.0/24 --zone=work success [root@server ~ 14:56:25]# firewall-cmd --get-active-zones public interfaces: ens33 [root@server ~ 14:56:31]# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> </zone> 添加放行服务到配置文件中 [root@server ~ 14:56:54]# firewall-cmd --add-service=http --permanent success [root@server ~ 14:57:04]# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="http"/> </zone> 删除服务 [root@server ~ 14:57:06]# firewall-cmd --remove-service=http success [root@server ~ 14:57:20]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 重新从配置文件中拉取 [root@server ~ 14:57:39]# firewall-cmd --reload success 查询发现http服务回来了 [root@server ~ 14:57:54]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens33 sources: services: dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: 删除配置文件中http服务 [root@server ~ 14:57:55]# firewall-cmd --remove-service=http --permanent success [root@server ~ 14:58:34]# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> </zone> 同步服务到配置文件中 [root@server ~ 14:58:51]# firewall-cmd --runtime-to-permanent success [root@server ~ 14:59:10]# cat /etc/firewalld/zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="http"/> </zone> 删除服务 [root@server ~ 14:59:14]# firewall-cmd --remove-service=http success 添加放行端口 [root@server ~ 14:59:49]# firewall-cmd --add-port=80/tcp success 删除端口 [root@server ~ 15:00:27]# firewall-cmd --remove-port=80/tcp success