[转]linux-RHEL7.0 —— 《Linux就该这么学》阅读笔记

原文地址:linux-RHEL7.0 —— 《Linux就该这么学》阅读笔记 - leevi-ding - 博客园 (cnblogs.com)

 

目录

 

linux-RHEL7.0

安装部署

修改root密码

在开机阶段按e,在linux16后追加rd.break,按Ctrl+X来运行修改过的内核程序。

image-20210126171714903

进入紧急救援模式后,以此输入以下命令:

mount -o remount,rw /sysroot chroot /sysroot passwd 【新密码】 【确认密码】 touch /.autorelabel exit reboot

image-20210126172627775

RPM(红帽软件包管理器)

RPM(Red Hat Package Manager)。早期在 Linux 系统中安装程序是一件非常困难、耗费耐心的事情,而且大多数的服务程序仅仅提供源代码,RPM 机制则为解决这些问题而设计的。 RPM有点像 Windows 系统中的控制面板,会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系

操作命令
安装软件的命令格式 rpm -ivh filename.rpm
升级软件的命令格式 rpm -Uvh filename.rpm
卸载软件的命令格式 rpm -e filename.rpm
查询机器所装的全部软件 rpm -qa
查询软件描述信息的命令格式 rpm -qpi filename.rpm
列出软件文件信息的命令格式 rpm -qpl filename.rpm
查询文件属于哪个 RPM 的命令格式 rpm -qf filename

YUM(软件仓库)

Yum(Yellowdog Updater, Modified) 软件仓库可以根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安装到系统。

命令作用
yum repolist all 列出所有仓库
yum list all 列出仓库中所有软件包
yum list installed 列出已安装的软件包
yum info 软件包名称 查看软件包信息
yum install 软件包名称 安装软件包
yum reinstall 软件包名称 重新安装软件包
yum update 软件包名称 升级软件包
yum remove 软件包 移除软件包
yum clean all 清除所有仓库缓存
yum check-update 检查可更新的软件包
yum grouplist 查看系统中已经安装的软件包组
yum groupinstall 软件包组 安装指定的软件包组
yum groupremove 软件包组 移除指定的软件包组
yum groupinfo 软件包组 查询指定的软件包组信息

image-20210304171002239

因为redhat中yum需要注册,所以需要使用iso镜像或者重新安装yum,并替换掉yum源。

# 查看系统中有什么yum源 yum repolist # 创建yum缓存 yum makecache

使用iso镜像注册yum

  1. 将虚拟机的光盘设备指向ISO镜像

    image-20210304171326949

  2. 挂载该设备

    mkdir -p /media/cdromm mount /dev/cdrom /media/cdrom
  3. 使用yum进行安装

    yum install -y screen

yum卸载,并使用CentOS国内镜像

#查看所有已安装的包含"yum"关键字的rpm包 rpm -qa | grep yum # 备份原yum文件 mv /etc/yum.repos.d/rhel7.repo /etc/yum.repos.d/rhel7.repo.backup # 卸载原yum源 rpm -qa|grep yum|xargs rpm -e --nodeps #打开阿里yum源地址,按 Ctrl +F 搜索rmp包名 https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/ #下载这8个rpm包 ,或者在windows主机上下载好这些rpm包, 再用"WinSCP"这个软件的sftp协议传输到redhat系统中,如果没有在上面网址找 wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-langpacks-0.4.2-7.el7.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-rhn-plugin-2.0.1-10.el7.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-utils-1.1.31-54.el7_8.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/yum-updateonboot-1.1.31-54.el7_8.noarch.rpm wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/python-urlgrabber-3.10-10.el7.noarch.rpm # 下载rmp-4.11.3版本的rmp包 wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/rpm-4.11.3-45.el7.x86_64.rpm # 安装该目录下所有的rpm包 rpm -ivh --force * # 如果报错,将rmp升级安装 rpm -Uvh rpm-4.11.3-45.el7.x86_64.rpm #下载对应版本的 CentOS-Base.repo 到 /etc/yum.repos.d/ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #替换CentOS-Base.repo里面的内容,"$releasever"替换为"7" sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo #编辑yum.conf这个文件, vim /etc/yum.conf 将"plugins=1"改为"plugins=0" ,表示禁用所有插件 #清理yum缓存 yum clean all #生成缓存 yum makecache yum repolist ,关键字为"vim" yum search vim 查看yum源仓库中所有的软件, 对结果进行过滤关键字为"vim" yum list | grep vim #使用yum源安装"vim"这个软件 yum -y install vim
  • epel源时干什么的

    epel源---增加和扩展yum仓库

    里面包含了许多基本源里没有的软件。

# 安装epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum makecache # 可以看到epel源

如果有命令不支持:

可以使用yum provides xxx 来查找该命令在哪个包并安装。

Systemd初始化进程

Linux开机过程:从 BIOS 开始,然后进入 Boot Loader,再加载系统内核,然后内核进行初始化,最后启动初始化进程(已由systemd来替换System V init)。systemd 初始化进程服务采用了并发启动机制,开机速度得到了不小的提升。systemctl用来调用systemd进程来管理程序的。

systemctl 命令( RHEL 7 系统)作用
systemctl start foo.service 启动服务
systemctl restart foo.service 重启服务
systemctl stop foo.service 停止服务
systemctl reload foo.service 重新加载配置文件(不终止服务)
systemctl status foo.service 查看服务状态
systemctl 命令( RHEL 7 系统)作用
systemctl enable foo.service 开机自动启动
systemctl disable foo.service 开机不自动启动
systemctl is-enabled foo.service 查看特定服务是否为 开机自动启动
systemctl list-unit-files --type=service 查看各个级别下服务 的启动与禁用情况
systemctl is-active foo.service 是否foo正在运行
systemctl mask foo.service 注销 unit,注销后你就无法启动这个 unit 了。
systemctl unmask foo.service 取消注销
  • systemctl兼容service,会执行/etc/init.d中的service命令。

image-20210304154010632

  • systemctl命令管理systemd的资源Unit,systemd的资源单元放在了 /usr/lib/systemd/system

    image-20210304154350941

  • systemd的资源单元有四种:mount,service,target和wants

    • mount

      image-20210304161914064

      相当于执行了挂载

      mount -t hugetlbfs /dev/hugepages hugetlbfs
    • service

      image-20210304162012748

      Description:描述

      After:在xxx服务之后才启动

      EnviromentFile:配置文件

      ExecStartPre:执行前需要执行的命令

      ExecStart:systemctl start xxx 执行的命令

      ExecReload:systemctl restart xxx 执行的命令

      ExecStop:systemctl stop xxx 执行的命令

      WangtedBy: 多用户模式下需要的

      mysqld.service

      vim /usr/lib/systemd/system/mysqld.service # 内容如下 [Unit] Description=mysql After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/opt/mysql/support-files/mysql.server start ExecReload=/opt/mysql/support-files/mysql.server restart ExecStop=/opt/mysql/support-files/mysql.server stop [Install] WantedBy=multi-user.target
    • target

      .target定义了一些基础的组件,供.service文件调用

    • wants

      wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行

  • systemctl status sshd

    image-20210304162953916

    • 第一行是描述
    • 第二行表示是否开机自启,enabled表示开机自启。
    • 第三行 中的 Active 描述服务当前的状态,active (running) 表示服务正在运行中。如果是 inactive (dead) 则表示服务当前没有运行。后面则是服务的启动时间。

总结

简述 RPM 与 Yum 软件仓库的作用。

答:RPM 是为了简化安装的复杂度, 而 Yum 软件仓库是为了解决软件包之间的依赖关系 。

linux命令

帮助命令

man

查看命令的帮助文档。【使用方法】:man 命令

在文档中可以使用以下命令:

按键用途
空格键 向下翻一页
PaGe down 向下翻一页
PaGe up 向上翻一页
home 直接前往首页
end 直接前往尾页
/ 从上至下搜索某个关键词,如“/linux”
? 从下至上搜索某个关键词,如“?linux”
n 定位到下一个搜索到的关键词
N 定位到上一个搜索到的关键词
q 退出帮助文档

man文档的结构:

结构名称代表意义
NAME 命令的名称
SYNOPSIS 参数的大致使用方法
DESCRIPTION 介绍说明
EXAMPLES 演示(附带简单说明)
OVERVIEW 概述
DEFAULTS 默认的功能
OPTIONS 具体的可用选项(带介绍)
ENVIRONMENT 环境变量
FILES 用到的文件
SEE ALSO 相关的资料
HISTORY 维护历史与联系方式

系统工作命令

echo

echo 命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。

# echo Linuxprobe.Com Linuxprobe.Com # echo $SHELL /bin/bash

date

date 命令用于显示及设置系统的时间或日期,格式为“date [选项] [+指定的格式]”。

参数可选值:

参数作用
%t 跳格[Tab 键]
%H 小时( 00~23)
%I 小时( 00~12)
%M 分钟( 00~59)
%S 秒( 00~59)
%j 今年中的第几天
# date Mon Aug 24 16:11:23 CST 2017 # date "+%Y-%m-%d %H:%M:%S" 2017-08-24 16:29:12 设置当前时间: # date -s "20210127 13:13:13" 一年中的第几天: # date "+%j" 027

reboot

重启系统,默认只能使用 root 管理员来重启

poweroff

关机,,默认只能使用 root 管理员来重启

wget

wget 命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”

参数作用
-b 后台下载模式
-P 下载到指定目录
-t 最大尝试次数
-c 断点续传
-p 下载页面内所有资源,包括图片、视频等
-r 递归下载
-O 重命名,outputfile

ps

ps 命令用于查看系统中的进程状态,格式为“ps [参数]”

参数作用
-a 显示所有进程(包括其他用户的进程)
-u 用户以及其他详细信息
-x 显示没有控制终端的进程

使用 ps -aux获得的数据内容如下:

image-20210127134133655

image-20210127134133655

对应的列所代表的信息:

USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
进程的所有者 进程ID号 运算器占用率 内存 占用率 虚拟内存使用量(单位是KB) 占用的固 定内存量(单位是 KB) 所在终端 进程状态 被启动的时间 实际使用CPU的时间 命令名称与参数

其中进程的状态总共有五种情况:

  • R(运行): 进程正在运行或在运行队列中等待。
  • S(中断): 进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
  • D(不可中断): 进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
  • Z(僵死): 进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数后将进程释放。
  • T(停止): 进程收到停止信号后停止运行。

top

top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。完全将它看作 Linux 中的“强化版的
Windows 任务管理器”。

image-20210127135511837

前 5 行为系统整体的统计信息 :

  • 第 1 行:系统时间(- 13:55:36)、运行时间(up 6:25)、登录终端数(1 user)、系统负载(三个数值分别为 1 分钟、 5分钟、 15 分钟内的平均值,数值越小意味着负载越低)。

  • 第 2 行:进程总数(403 total)、运行中的进程数(3 running)、睡眠中的进程数(400 sleeping)、停止的进程数(0 stopped)、僵死的进程数(0 zombie)

  • 第 3 行:用户占用资源百分比(0.0 us)、系统内核占用资源百分比(0.7 sy)、改变过优先级的进程资源百分比(0.0 ni)、空闲的资源百分比(99.0 id)等。 所有数值表示百分比。

  • 第 4 行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。

  • 第 5 行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。

pidof

pidof 命令用于查询某个指定服务进程的 PID 值,格式为“pidof [参数] [服务名称]”

# pidof sshd 1225

kill

kill 命令用于终止某个指定 PID 的服务进程,格式为“kill [参数] [进程 PID]”

# kill 1225 重新查询后,没有进程号了 # pidof sshd

killall

killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为: “killall [参数] [进程名称]”

查询http的所有进程id # pidof httpd 删除所有http的进程 # killall httpd

&

如果一个命令影响到后续命令的输入,则可以在执行命令时在末尾添加上一个&符号,这样命令将进入系统后台来执行。

系统检测命令

ifconfig

ifconfig 命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]”。

image-20210127144123430

uname

uname 命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。

image-20210127145949310

查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。

查看当前系统版本的详细信息 # cat /etc/redhat-release

image-20210127150217048

uptime

uptime 用于查看系统的负载信息,格式为 uptime。

显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。平均负载值指的是系统在最近 1 分钟、 5 分钟、 15 分钟内的压力情况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过 1,在生产环境中不要超过 5 。

image-20210127150418562

free

free 用于显示当前系统中内存的使用量信息,格式为“free [-h]”。 -h表示转换为带单位显示。

image-20210127150710857

其中各行表示的项为:

  • mem:表示物理内存统计

  • buff/cache:表示物理内存的缓存统计

  • swap:表示硬盘上交换分区的使用情况

各列表示的项为:

内存总量已用量可用量进程共享的 内存量磁盘缓存的 内存量缓存的 内存量
total used free shared buffers cached

who

who 用于查看当前登入主机的用户终端信息,格式为“who [参数]”。

image-20210127151803269

各列表示:

登录的用户名终端设备登录到系统的时间
root tty1 2021-01-26 01:37

last

last 命令用于查看所有系统的登录记录,格式为“last [参数]”

image-20210127151951378

该信息是以日志文件保存的,可以很容易的进行修改。

history

history 命令用于显示历史执行过的命令,格式为“history [-c]”。

如果使用-c 参数则会清空所有的命令历史记录

image-20210127152233600

执行 history 命令能显示出当前用户在本地计算机中执行过的最近 1000 条命令记录。如果觉得 1000 不够用,还可以自定义/etc/profile 文件中的HISTSIZE变量值。还可以使用“!编码数字”的方式来重复执行某一次的命令

image-20210127152413150

历史命令会保存到~/.bash_history文件中

image-20210127153006241

sosreport

sosreport 命令用于收集系统配置及架构信息并输出诊断文档,格式为 sosreport。

image-20210127154635755

image-20210127154655068

将文件和摘要发送给技术支持人员。

总结

什么是操作系统?

答:计算机硬件是由运算器、控制器、存储器、输入/输出设备等共同组成的,而让各种硬件设备各司其职且又能协同运行的东西就是系统内核

mem区和swap区的使用

答:1)当物理内存快被耗尽时,系统并没有崩溃,而是拿 swap 做临时内存,当两者都耗尽,系统 OutofMemory

​ 2)物理内存达到峰值,系统中一些不常用的进程内存占用被提到 swap 区

​ 3)当 Men 区的资源进行释放时,被挪到 swap 的内存并不会全部回来,随着系统或者程序的唤醒才会慢慢回到 men 区

​ 4)swap 是内存不够时,磁盘虚拟出来的内存,磁盘主要是 I/O 级别的操作,并不是系统内核级别的操作,处理速度跟 mem 区不是一个等级

工作目录切换命令

pwd

pwd 命令用于显示用户当前所处的工作目录,格式为“pwd [选项]”

cd

参数解释
cd - 上一次目录
cd ~ 当前用户的家目录
cd ~username 切换到其他用户的家目录

ls

ls 命令用于显示目录中的文件信息,格式为“ls [选项] [文件] ”

参数解释
ls -a 所有文件,包括隐藏文件
ls -l 查看文件的属性
ls -d [文件夹] 查看文件夹的属性

文本编辑命令

cat

cat 命令用于查看纯文本文件(内容较少的),格式为“cat [选项] [文件]”。 需要序号可以使用-n

more

more 命令用于查看纯文本文件(内容较多的),格式为“more [选项]文件”

展示阅读百分比,使用Space可以向下翻页,Enter用来下一行。

head 命令用于查看纯文本文档的前 N 行,格式为“head [选项] [文件]”

image-20210127163642576

tail

tail 命令用于查看纯文本文档的后 N 行或持续刷新内容,格式为“tail [选项] [文件]”

# 查看文件行数 tail -n [行数] [文件] # 滚动查看文件结尾 tail -[行数]f [文件]

tr

tr 命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”

image-20210127165448492

wc

wc 命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。

参数作用
-l 只显示行数
-w 只显示单词数
-c 只显示字节数

image-20210127165747473

stat

stat 命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。

image-20210127170653265

cut

cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。

参数作用
-d 设置参数
-f 想要显示的列数

image-20210127173821871

diff

diff 命令用于比较多个文本文件的差异,格式为“diff [参数] 文件 文件”。

参数作用
-y 以并列的方式显示文件的异同之处
-w 忽略全部的空格字符
-W<宽度> -W<宽度>或--width<宽度>  在使用-y参数时,指定栏宽

image-20210127184208422

image-20210127184238800

文件目录管理命令

touch

touch 命令用于创建空白文件或设置文件的时间,格式为“touch [选项] [文件]”。

参数作用
-a 仅修改“读取时间”( atime)
-m 仅修改“修改时间”( mtime)
-d 同时修改 atime 与 mtime
# 新建一个文件 touch 2021.log # 修改文件的读取时间和修改时间 touch -d "2020-12-01 07:16" 2021.log

mkdir

mkdir 命令用于创建空白的目录,格式为“mkdir [选项] 目录” 。使用-p用来递归创建目录

cp

cp 命令用于复制文件或目录,格式为“cp [选项] 源文件 目标文件”。

  • 如果目标文件是目录,则会把源文件复制到该目录中;
  • 如果目标文件也是普通文件,则会询问是否要覆盖它;
  • 如果目标文件不存在,则执行正常的复制操作。
参数作用
-p 保留原始文件的属性
-d 若对象为“链接文件”,则保留该“链接文件”的属性
-r 递归持续复制(用于目录)
-i 若目标文件存在则询问是否覆盖
-a 相当于-pdr( p、 d、 r 为上述参数)

dd

dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

  • if=文件名:输入文件名,默认为标准输入。即指定源文件。
  • of=文件名:输出文件名,默认为标准输出。即指定目的文件。
  • ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  • cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
  • skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
  • count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  • conv=<关键字>,关键字可以有以下11种:
    • conversion:用指定的参数转换文件。
    • ascii:转换ebcdic为ascii
    • ebcdic:转换ascii为ebcdic
    • ibm:转换ascii为alternate ebcdic
    • block:把每一行转换为长度为cbs,不足部分用空格填充
    • unblock:使每一行的长度都为cbs,不足部分用空格填充
    • lcase:把大写字符转换为小写字符
    • ucase:把小写字符转换为大写字符
    • swap:交换输入的每对字节
    • noerror:出错时不停止
    • notrunc:不截短输出文件
    • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
  • --help:显示帮助信息
  • --version:显示版本信息

将testfile文件中的所有英文字母转换为大写,然后转成为testfile_1文件,在命令提示符中使用如下命令:

dd if=testfile_2 of=testfile_1 conv=ucase

mv

mv 命令用于剪切文件或将文件重命名, 格式为“mv [选项] 源文件 [目标路径|目标文件名]”。

rm

rm 命令用于删除文件或目录,格式为“rm [选项] 文件”

dd

dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式为“dd [参数]” .

# 将testfile_2文件所有字符转换为大写并输出到testfile_1 dd if=testfile_2 of=testfile_1 conv=ucase
  • if=文件名:输入文件名,默认为标准输入。即指定源文件。
  • of=文件名:输出文件名,默认为标准输出。即指定目的文件。
  • conv=<关键字>,关键字可以有以下11种:
    • conversion:用指定的参数转换文件。
    • ascii:转换ebcdic为ascii
    • ebcdic:转换ascii为ebcdic
    • ibm:转换ascii为alternate ebcdic
    • block:把每一行转换为长度为cbs,不足部分用空格填充
    • unblock:使每一行的长度都为cbs,不足部分用空格填充
    • lcase:把大写字符转换为小写字符
    • ucase:把小写字符转换为大写字符
    • swap:交换输入的每对字节
    • noerror:出错时不停止
    • notrunc:不截短输出文件
    • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

file

file 命令用于查看文件的类型,格式为“file 文件名”。

image-20210128113107991

  • ASCII text:字符文本

  • character special:字符特殊文件

  • block special:块特殊文件

块设备(也称为块特殊文件)通常与普通文件非常相似:它们是一个字节数组,在给定位置读取的值是最后写入的值.来自块设备的数据可以缓存在内存中并从缓存中读回;写入可以缓冲.块设备通常是可搜索的(即,文件内部存在应用程序可以改变的位置的概念).名称“块设备”来自以下事实:相应的硬件通常一次读取和写入整个块(例如,硬盘上的扇区).

字符设备(也称为字符特殊文件)的行为类似于管道,串行端口等.写入或读取它们是一种即时操作.驱动程序对数据的作用是它自己的业务.将字节写入字符设备可能会导致它显示在屏幕上,在串行端口上输出,转换为声音,…从设备读取字节可能导致串口等待输入,可能会返回随机byte(/ dev / urandom),…名称“字符设备”来自每个字符单独处理的事实.

打包压缩命令

tar

tar 命令用于对文件进行打包压缩或解压,格式为“tar [选项] [文件]”。

参数作用
-c 创建压缩文件
-x 解开压缩文件
-t 查看压缩包内有哪些文件
-z 用 Gzip 压缩或解压
-j 用 bzip2 压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-p 保留原始的权限与属性
-P 使用绝对路径来压缩
-C 指定解压到的目录
# 压缩/etc目录到etc.tar.gz文件 tar -zcf etc.tar.gz /etc # 解压文件 tar -zxf etc.tar.gz

grep

用于在文本中执行关键词搜索, 并显示匹配的结果, 格式为“grep [选项] [文件]”。

参数作用
-b 将可执行文件( binary)当作文本文件( text)来搜索
-c 仅显示找到的行数
-i 忽略大小写
-n 显示行号
-v 反向选择—仅列出没有“关键词”的行
# 搜索/etc/passwd文件中的nologin grep nologin /etc/passwd # 搜索/etc/passwd文件中 没有nologin的行 grep -v nologin /etc/passwd cat /etc/passwd | grep -v nologin

find

find 命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”

参数作用
-name 匹配名称
-perm 匹配权限( mode 为完全匹配, -mode 为包含即可)
-user 匹配所有者
-group 匹配所有组
-mtime -n +n 匹配修改内容的时间( -n 指 n 天以内, +n 指 n 天以前)
-atime -n +n 匹配访问文件的时间( -n 指 n 天以内, +n 指 n 天以前)
-ctime -n +n 匹配修改文件权限的时间( -n 指 n 天以内, +n 指 n 天以前)
-nouser 匹配无所有者的文件
-nogroup 匹配无所有组的文件
-newer f1 !f2 匹配比文件 f1 新但比 f2 旧的文件
--type b/d/c/p/l/f 匹配文件类型(后面的字幕参数依次表示块设备、目录、字符设备、管道、 链接文件、文本文件)
-size 匹配文件的大小( +50KB 为查找超过 50KB 的文件,而-50KB 为查找小于 50KB 的文件)
-prune 忽略某个目录
-exec …… {}; 后面可跟用于进一步处理搜索结果的命令(下文会有演示)
# 在目录 / 查找名为2021.log的文件,且大小小于50KB find / -name 2021.log -size -50k # 使用exec来对查找后的结果进行操作,其中{}是find的结果,\是结束符,\后如果没有;则表示换行 find / -name 2021.log -size -50 -exec cp {} /usr/local/temp/findresult \;

管道符、重定向与环境变量

输入输出重定向

输入重定向是将文件内容作为标准输入。

<< xxx 直到有xxx输入时会停止。

image-20210128160708024

输出重定向使用的较多,

  • 标准输入重定向( STDIN,文件描述符为 0):默认从键盘输入,也可从其他文件或命令中输入。

  • 标准输出重定向( STDOUT,文件描述符为 1):默认输出到屏幕,即非错误输出

  • 错误输出重定向( STDERR,文件描述符为 2):默认输出到屏幕。

输出重定向命令作用
命令 > 文件 标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件 错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件 2>&1 或 命令 &>> 文件 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
# 运行jar包,并将错误输出和标准输出共同写到xxx.log文件中 java -jar xxx.jar >> xxx.log 2>&1

管道命令符

把前一个命令原本要输出到屏幕的数据当作是后一个命令的标准输入 ,其执行格式为“命令 A | 命令 B”

|相当于在命令B后 以输入重定向的输入命令A的结果。

# 获取123.txt的 cat 123.txt | grep abcd grep abcd << 输入cat 123.txt得到的标准输出

命令行通配符

  • *用于匹配任意数个任意字符
  • ?用于匹配任意一个任意字符
  • 使用[0-9]来匹配 0~9 之间的单个数字,也可以用[135]这样的方式仅匹配这三个指定数字中的一个

image-20210128162737380

常用转义符

  • 反斜杠( \):使反斜杠后面的一个变量变为单纯的字符串。
echo \$ $
  • 单引号(''):转义其中所有的变量为单纯的字符串。
echo '$PROD' $PROD
  • 双引号( ""):保留其中的变量属性,不进行转义处理。
PROD=5 echo "$PROD" 5
  • 反引号( ``):把其中的命令执行后返回结果。
echo `ls -l`

命令别名

可以给命令添加别名

# 添加别名 alias la='ls -al' # 取消别名 unalias la

image-20210128172047276

环境变量

Linux系统中的环境变量是用来定义系统运行环境的一些参数,使用env可以查看所有的环境变量。

变量名称作用
HOME 用户的主目录(即家目录)
SHELL 用户在使用的 Shell 解释器名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
MAIL 邮件保存路径
LANG 系统语言、语系名称
RANDOM 生成一个随机数字
PS1 Bash 解释器的提示符
PATH 定义解释器搜索用户执行命令的路径
EDITOR 用户默认的文本编辑器

默认创建的变量不具有全局性,不能被其他用户使用。需要使用export将其提升为全局变量。

export prod

Vim和Shell命令脚本

Vim

vim包含三种模式,是一个默认安装在linux系统中的文本编辑器。

  • 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
  • 输入模式:正常的文本录入。
  • 末行模式:保存或退出文档,以及设置编辑环境

image-20210128184656177

切换到输入模式

命令作用
a 光标前面
i 光标后面
o 光标下一行
A 行的末尾
I 行的开头
O 光标上一行

命令模式下的常用命令:

命令作用
dd 删除(剪切)光标所在整行
5dd 删除(剪切)从光标处开始的 5 行
yy 复制光标所在整行
5yy 复制从光标处开始的 5 行
n 显示搜索命令定位到的下一个字符串
N 显示搜索命令定位到的上一个字符串
u 撤销上一步的操作
p 将之前删除( dd)或复制( yy)过的数据粘贴到光标后面

末行模式中可用的命令:

命令作用
:w 保存
:q 退出
:q! 强制退出(放弃对文档的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:set nonu 不显示行号
:命令 执行该命令
:整数 跳转到该行
😒/one/two 将当前光标所在行的第一个 one 替换成 two
😒/one/two/g 将当前光标所在行的所有 one 替换成 two
:%s/one/two/g 将全文中的所有 one 替换成 two
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
:noh 取消高亮
配置主机名字
# 修改主机名,以下两种都可 vim /etc/hostname hostnamectl set-hostname dingli.com # 查看主机名 hostname dingli.com
配置网卡信息

在 RHEL 7 中,网卡配置文件的前缀则以 ifcfg 开始,加上网卡名称共同组成了网卡配置文件的名字,例如 ifcfg-eno16777736。

简单的网卡配置示例:

# 以太网网络类型:Ethernet,Static TYPE=Ethernet # 启动协议,none 引导时不使用协议,static 静态分配地址, bootp使用BOOTP协议,DCHP使用区域为内自动分配IP的服务 BOOTPROTO=static # 网卡名称 NAME=eno16777736 # 是否启动 ONBOOT=yes # ip地址 IPADDR=10.6.2.128 # 子网掩码 NETMASK=255.255.255.0 # 网关 GATEWAY=10.6.2.1 # DNS1 DNS1=114.114.114.114
  • DNS:114.114.114.114是国内三大运营商的DNS服务,8.8.8.8是谷歌DNS服务

  • 网关和子网掩码要和vmware中的配置一致。

    image-20210129103402864

一块网卡添加多个ip

TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno16777736 DNS1=114.114.114.114 IPADDR0=10.6.2.158 PREFIX0=24 GATEWAY0=10.6.2.1 IPADDR1=10.6.2.159 PREFIX1=24 IPADDR2=10.6.2.160 PREFIX2=24 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=no NAME="System eno16777736" UUID=13756690-ac77-b776-4fc1-f5535cee6f16

使用数字后缀来表示多个ip,也可以使用mntui进行修改

image-20210311114755953

配置Yum软件仓库
# 添加yum配置文件 cd /etc/yum.repos.d/ vim rhel7.repo [rhel7] name=rhel7 baseurl=file:///media/cdrom enabled=1 gpgcheck=0 # 创建配置的挂载目录 mkdir -p /media/cdrom # 添加挂载点 mount /dev/cdrom /media/cdrom mount: /dev/sr0 is write-protected, mounting read-only # 修改fstab文件 vim /etc/fstab # 添加内容 /dev/cdrom /media/cdrom iso9660 defaults 0 0 # 测试yum yum install httpd -y

使用mount /dev/cdrom /media/cdrom挂载时出现问题:

mount: no medium found on /dev/sr0

需要添加cd硬件

image-20210129111546772

编写Shell脚本

基础知识

查看当前SHELL默认解释器

echo $SHELL /bin/bash

shell脚本第一行需要指定解释器:

#!/bin/bash

脚本如果没有执行权限,可以指定权限,也可以使用bash直接执行:

bash example.sh # 添加权限 chmod u+x example.sh

接收用户的参数

在shell脚本中可以使用$+数字与符号来获取参数

命令解释
<span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline-block; position: relative; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; width: 7.384em; height: 0px; font-size: 16.8px;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; position: absolute; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; clip: rect(1.253em, 1007.26em, 2.622em, -999.997em); top: -2.199em; left: 0em;"><span class="mrow" id="MathJax-Span-2" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="mo" id="MathJax-Span-3" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; font-family: MathJax_Main;">∗|"∗|所有的参数,以"<span class="MathJax_Preview" style="padding: 0px; margin: 0px; color: inherit;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline-block; position: relative; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; width: 1.729em; height: 0px; font-size: 16.8px;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; position: absolute; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; clip: rect(1.372em, 1001.67em, 2.384em, -999.997em); top: -2.199em; left: 0em;"><span class="mrow" id="MathJax-Span-30" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="mn" id="MathJax-Span-31" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; font-family: MathJax_Main;">2...2...n" 的形式输出所有参数  
<span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline-block; position: relative; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; width: 9.348em; height: 0px; font-size: 16.8px;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; position: absolute; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; clip: rect(1.253em, 1009.23em, 2.622em, -999.997em); top: -2.199em; left: 0em;"><span class="mrow" id="MathJax-Span-36" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="texatom" id="MathJax-Span-37" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="mrow" id="MathJax-Span-38" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="mo" id="MathJax-Span-39" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; font-family: MathJax_Main;">@|"@|所有的参数列表,以"1" "<span class="MathJax_Preview" style="padding: 0px; margin: 0px; color: inherit;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline-block; position: relative; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; width: 3.574em; height: 0px; font-size: 16.8px;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; position: absolute; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; clip: rect(1.313em, 1003.46em, 2.384em, -999.997em); top: -2.199em; left: 0em;"><span class="mrow" id="MathJax-Span-72" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="mn" id="MathJax-Span-73" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; font-family: MathJax_Main;">2""2"…"n" 的形式输出所有参数  
<span class="MathJax_Preview" style="padding: 0px; margin: 0px; color: inherit;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline-block; position: relative; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; width: 56.372em; height: 0px; font-size: 16.8px;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; position: absolute; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; clip: rect(1.253em, 1056.37em, 2.622em, -999.997em); top: -2.199em; left: 0em;"><span class="mrow" id="MathJax-Span-78" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="mo" id="MathJax-Span-79" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; font-family: MathJax_Main;">?|0ping10.6.2.2?|上一条命令执行的结果状态,0表示执行成功,其他表示执行失败,成功表示命令执行后没有错误,例如ping10.6.2.2不通,但是该命令执行成功,但是?是1。成功和失败是以结果判断  
$0 shell脚本名称
<span class="MathJax_Preview" style="padding: 0px; margin: 0px; color: inherit;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline-block; position: relative; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; width: 0.777em; height: 0px; font-size: 16.8px;"><span style="padding: 0px; margin: 0px; transition: none 0s ease 0s; position: absolute; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; clip: rect(1.372em, 1000.54em, 2.384em, -999.997em); top: -2.199em; left: 0em;"><span class="mrow" id="MathJax-Span-270" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box;"><span class="mn" id="MathJax-Span-271" style="padding: 0px; margin: 0px; transition: none 0s ease 0s; display: inline; position: static; border: 0px; vertical-align: 0px; line-height: normal; box-sizing: content-box; font-family: MathJax_Main;">1 n 第n个参数
$# 所有参数的个数
$$ shell本身的PID
$! shell最后运行的后台进程的PID
wc -l "$*" wc -l "$@" # 执行脚本example.sh bash example.sh 123 234 345

其中$*是所有的"123 234 345",$@是"123" "234" "345"列表

image-20210129162419719

判断用户的参数

格式:[ 条件表达式 ],左右各有一个空格

  • 文件测试所用的参数

    运算符作用
    -d 测试文件是否为目录类型
    -e 测试文件是否存在
    -f 判断是否为一般文件
    -r 测试当前用户是否有权限读取
    -w 测试当前用户是否有权限写入
    -x 测试当前用户是否有权限执行
    [ -d /usr/local/temp/example.sh ] echo $?

    输出不是0,表示/usr/local/temp/example.sh不是一个目录

  • 与、或、非

    使用与和或来表示是否继续运行后面的命令

    运算符作用
    && 如果测试条件为0,那么会继续执行
    || 如果测试条件不为0,那么会继续执行
    ! 将测试条件的结果取反

    image-20210129174034717

    image-20210129174047962

  • 数字比较符

    运算符作用
    -eq 是否等于
    -ne 是否不等于
    -gt 是否大于
    -lt 是否小于
    -le 是否等于或小于
    -ge 是否大于或等于

    用于测试命令中进行数字比较:

    image-20210129174242740

  • 字符比较符

    运算符作用
    = 比较字符串内容是否相同
    != 比较字符串内容是否不同
    -z 判断字符串内容是否为空

    在测试命令中,环境变量如果不存在会报错

    image-20210129175751412

流程控制语句

if

if 判断条件 then 执行语句 elif 判断条件 then 执行语句 [ else 否则执行语句 ] fi

示例:

#!/bin/bash read -p "Enter your score(0-100): " GRADE if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then echo "$GRADE is Excellent" elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then echo "$GRADE is Pass" else echo "$GRADE is Fail" fi

for

for 变量 in 数组 do ... done

示例:

#!/bin/bash read -p "Enter The Users Password : " PASSWD for UNAME in `cat users.txt` do id $UNAME &> /dev/null if [ $? -eq 0 ] then echo "Already exists" else useradd $UNAME &> /dev/null echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null if [ $? -eq 0 ] then echo "$UNAME , Create success" else echo "$UNAME , Create failure" fi fi done

while

while 条件判断 do ... done
#!/bin/bash PRICE=$(expr $RANDOM % 1000) TIMES=0 echo "商品实际价格为 0-999 之间,猜猜看是多少? " while true do read -p "请输入您猜测的价格数目: " INT let TIMES++ if [ $INT -eq $PRICE ] ; then echo "恭喜您答对了,实际价格是 $PRICE" echo "您总共猜测了 $TIMES 次" exit 0 elif [ $INT -gt $PRICE ] ; then echo "太高了! " else echo "太低了! " fi done

case

case 变量 in 情况1) ... 情况2) ... *) ... # 默认执行 esac

示例

read -p "请输入一个字符,并按 Enter 键确认: " KEY case "$KEY" in [a-z]|[A-Z]) echo "您输入的是 字母。 " ;; [0-9]) echo "您输入的是 数字。 " ;; *) echo "您输入的是 空格、功能键或其他控制字符。 " esac

计划任务服务程序

at

一次性任务,指定该任务执行的时间

# 所有未执行的一次性任务 at -l # 删除一次性任务 atrm 序号 # 创建一次性任务 echo "echo 123 > /data/log" | at 11:30

crond

定时任务,可以用来指定时间,多次运行。

# 创建定时任务 crontab -e # 查看定时任务 crontab -l # 删除定时任务 crontab -r # 编辑他人的任务 crontab -u # 任务创建命令,其中前五个时间如果不要,需要使用*占位,多个日期使用逗号间隔,1-3表示1到3连续的时间,命令需要使用绝对路径,使用whereis来查询命令的绝对路径。可以使用#用来添加注释。其中分字段不能为空或*,日期和星期不能同时存在,否则会发生冲突。 分 时 日 月 星期 命令 # 1到6月的每1,3,5号的13点删除/tmp下的所有文件。 0 13 1,3,5 1-6 * /usr/bin/rm -rf /tmp/*

总结

linux命令执行步骤?

答:第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行 。

第 2 步: Linux 系统检查用户输入的命令是否为“别名命令”。

第 3 步: Bash 解释器判断用户输入的是内部命令还是外部命令。

第 4 步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作 PATH。

/dev/null是什么?

/dev/null 是一个被称作 Linux 黑洞的文件,将stdout和stderr&> 重定向到/dev/null,可以保持命令行的干净 。

用户身份和文件权限

用户身份和能力

管理员 UID 为 0:系统的管理员用户。root用户之所以是管理员,是因为他的UID为0

系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。

普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户

useradd

创建新的用户,格式为“useradd [选项] 用户名”

参数作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为 YYYY-MM-DD.
-u 指定该用户的默认 UID
-g 指定一个初始的用户基本组(必须已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户的默认 Shell 解释器
# 使用nologin作为shell解释器,说明该用户不能登录系统 useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe id linuxprobe

groupadd

# 添加用户组 groupadd ronny # 查看当前用户的所属组 groups

usermod

usermod 命令用于修改用户的属性,格式为“usermod [选项] 用户名”。 用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用 usermod 命令修改已经创建的用户信息

在/etc/passwd中可以用户的设置为:

# 对应位 用户名,组ID,用户ID,家目录,shell解释器 linuxprobe:x:8888:8888::/home/linux:/sbin/nologin
参数作用
-c 填写用户账户的备注信息
-d -m 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为 YYYY-MM-DD
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的 UID

passwd

参数作用
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
--stdin 允许通过标准输入修改用户密码, 如echo "NewPassWord" | passwd --stdin Username
-d 使该用户可用空密码登录系统
-e 强制用户在下次登录时修改密码
-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称
# 修改用户密码 passwd xxx

userdel

userdel 命令用于删除用户,格式为“userdel [选项] 用户名”。

参数作用
-f 强制删除用户
-r 同时删除用户及用户家目录

文件权限与归属

Linux 系统使用了不同的字符来加以区分,常见的字符如下:

  • -:普通文件。
  • d:目录文件。
  • l:链接文件。
  • b:块设备文件。
  • c:字符设备文件。
  • p:管道文件

ll可以查看文件的权限:

image-20210207163435446

其中第一位表示文件类型,3位表示所有者权限,3位表示文件所属组权限,3位表示其他用户权限,权限可以使用3位添加之和表示,例如上图可以表示为:rw-r--r--可以表示为644。

接着的第一个root表示文件所属用户,第二个root表示文件所属用户组。

4表示文件大小,Feb 7 11:49表示文件最后一次修改时间,log表示文件名。

image-20210207163355233

  • r:可读。如果是文件,表示文件可读,如果是目录,表示可以看到目录中的内容。

    # 如果没有r权限 # 文件无法被读 cat a # 目录无法知道里面的文件 ls 123
  • w:可修改。如果是文件,表示可修改,如果是目录,表示该目录中的内容是可修改的。

    # 如果没有w权限 # 文件无法被修改,但和删除没有关系 echo "" > a # 目录无法新增或删除目录中的文件,但是文件的内容是否能够修改和文件本身的w权限有关 rm -f 123
  • x:可执行。如果是文件,表示该文件是可执行的,如果是目录,表示该目录可以被当作命令参数进行操作。

    # 如果没有x权限 # 文件无法执行 /bin/bash a # 目录无法执行 ll 123

💛:文件最小的删除权限是什么?

文件所处目录具有w和x权限(所有的父级目录需要有x权限)。

文件的特殊权限

SUID(user)

SUID 是一种对二进制程序进行设置的特殊权限, 可以让二进制程序的执行者临时拥有属主的权限

  1. 只有可执行二进制程序才能设置SGID权限
  2. 命令执行者要对该程序拥有执行(x)权限
  3. 命令执行者在执行程序的时候,组身份升级为该可执行程序文件的属组
  4. SGID权限只在该程序执行过程中有效,也就是组身份只在程序执行过程中发生改变,命令结束用户组身份恢复.

可以通过以下命令将可执行可执行文件的执行者临时拥有拥有者的权限

chmod u+s xxx

例如:/bin/passwd命令就是

image-20210224175705635

如果当前用户没有x执行权限,那么就会是S

当普通用户执行/bin/passwd命令时,会操作/etc/shadow文件,但是该文件的权限是000,只有root用户有权限操作,那么当普通用户执行/bin/passwd,由于有s权限,那么就表示当前用户会在执行过程中临时拥有文件拥有者root的权限。

SGID(group)

SGID和SUID类似,不过是执行者临时拥有文件所属组的权限,而不是所属人的权限。

chmod g+s xxx

权限代码:-rwxrws---,如果用户组没有x权限,那么为S

同时SGID还可以用在目录上,这样的目录的子文件会继承源目录的所属组。

image-20210225092645231

在temp目录创建text.txt,可以看到文件所属组是root

image-20210225092549518

SBIT(sticky bit)

用于保护,阻止其他用户删除本文件(如果是目录的话,只有root和用户本人可以新建删除文件)。

chmod o+t xxx

权限代码:-rwxrwxrwt,如果其他用户没有x权限,那么为T

chmod

修改文件的权限,正常的文件权限是-rwxrwxrwx,分别对应user,group,other的权限

可以使用二进制算法计算权限对应的数字,例如rwx=7,rw-=6,--w=1

chmod 761 text.txt # 那么该文件权限为: # -rwxrw---x

也可以使用u,g,o来分别表示user,group,other的权限:

chmod g+x text.txt # 那么该文件权限为: # -rwxrwx--x

chown

修改文件的所有者和所属组

命令:chown [参数] 所有者:所属组 文件或目录名称

参数解释
-R 递归执行
# 将/temp目录及其所有子文件修改为用户root,所属组root chown -R root:root /temp

文件的隐藏属性

chattr

chattr 命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”

参数作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而 不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容( Append Only)
S 文件内容在变更后立即同步到硬盘( sync)
s 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间( atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用 dump 命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并( tail-merging)
X 可以直接访问压缩文件中的内容
# 给a文件添加a属性 chattr +a a # 给a文件删除a属性 chattr -a a

lsattr

lsattr 命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”

# 查看a文件的属性 lsattr xxx

文件访问控制列表(ACL,file access control list)

基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。

setfacl

参数解释
R 对目录进行操作
m 对文件进行操作
b 如果需要删除文件的ACL
# 给/root目录添加linuxprobeACL # u:linuxprobe:rwx 分别表示 用户:用户名:权限 setfacl -Rm u:linuxprobe:rwx /root

image-20210225155310067

可以看到没有ACL的文件以.结尾,有ACL的文件以+结尾。

getfacl

getfacl 命令用于显示文件上设置的 ACL 信息,格式为“getfacl 文件名称” 。

# 查看/root文件的ACL getfacl /root

su和sudo服务

su

su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户。

# 切换到linuxprobe用户,使用“-”会将环境变量信息也切换到新用户对应的环境变量。 su - linuxprobe

sudo

sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式为“sudo [参数] 命令名称”

参数作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或 UID 值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语

使用root用户执行命令visudo,可以修改sudo配置文件

visudo # 在99行左右添加,允许linuxprobe执行所有的命令 # 用户名 允许使用的主机=(以谁的身份执行) 允许的命令 linuxprobe ALL=(ALL) ALL # linuxprobe设置cat命令可用 linuxprobe ALL=(ALL) /usr/bin/cat # 设置不要密码 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff

在执行时使用

su - linuxprobe sudo cat /root

习题

  1. 使用访问控制列表( ACL)来限制 linuxprobe 用户组,使得该组中的所有成员不得在/tmp目录中写入内容。
    答: 想要设置用户组的 ACL,则需要把 u 改成 g,即 setfacl -Rm g:linuxprobe:r-x /tmp。

  2. 查看系统日志

    tail -40f /var/log/messages

存储结构和磁盘划分

在 Linux 系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件, Linux 系统中的一切文件都是从“根( /)”目录开始的,并按照文件系统层次化标准( FHS) 采用树形结构来存放文件, 以及定义了常见目录的用途。

目录名称应放置文件的内容
/boot 开机所需文件—内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户家目录
/bin 存放单用户模式下还可以操作的命令
/lib 开机时用到的函数库,以及/bin 与/sbin 下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方的软件
/root 系统管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等
/usr/local 用户自行安装的软件
/usr/sbin Linux 系统开机时不会使用到的软件/命令/脚本
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

物理设备的命名规则

系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等。

硬件设备文件名称
IDE 设备 /dev/hd[a-d]
SCSI/SATA/U 盘 /dev/sd[a-p]
软驱 /dev/fd[0-1]
打印机 /dev/lp[0-15]
光驱 /dev/cdrom
鼠标 /dev/mouse
磁带机 /dev/st0 或/dev/ht0

image-20210301142543869

“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件”

硬盘分区原理:

硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。 第一个扇区保存着主引导记录与分区表信息。第一个扇区由 主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节所组成。其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。如果需要大于4个分区,那么就会将一个分区作为扩展分区,扩展分区可以创建多个逻辑分区,这样就可以由多个分区了。

注意:逻辑分区从5开始。

image-20210301145218681

可以看出/dev/sdb8的意思就是,序号为2的硬盘的第四个逻辑分区。

文件系统与数据资料

文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。 Linux系统支持数十种的文件系统,而最常见的文件系统如下

  • Ext3: 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。
  • ext4: Ext3 的改进版本,作为 RHEL 6 系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外, Ext4 文件系统能够批量分配 block 块,从而极大地提高了读写效率。
  • xfs: 是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB。

存储原理:

image-20210301180058530

日常在硬盘需要保存的数据实在太多了, 因此 Linux 系统中有一个名为 super block 的“硬
盘地图”。 Linux 并不是把文件内容直接写入到这个“硬盘地图”里面,而是在里面记录着整
个文件系统的信息。因为如果把所有的文件内容都写入到这里面,它的体积将变得非常大,
而且文件内容的查询与写入速度也会变得很慢。 Linux 只是把每个文件的权限与属性记录在
inode 中,而且每个文件占用一个独立的 inode 表格,该表格的大小默认为 128 字节,里面记
录着如下信息:

  • 该文件的访问权限( read、 write、 execute);
  • 该文件的所有者与所属组( owner、 group);
  • 该文件的大小( size);
  • 该文件的创建或内容修改时间( ctime);
  • 该文件的最后一次访问时间( atime);
  • 该文件的修改时间( mtime);
  • 文件的特殊权限( SUID、 SGID、 SBIT);
  • 该文件的真实数据地址( point)。

而文件的实际内容则保存在 block 块中(大小可以是 1KB、 2KB 或 4KB),一个 inode 的默认大小仅为 128B( Ext3),记录一个 block 则消耗 4B。当文件的 inode 被写满后, Linux 系统会自动分配出一个 block 块,专门用于像 inode 那样记录其他 block 块的信息,这样把各个block 块的内容串到一起,就能够让用户读到完整的文件内容了

挂载硬件设备

当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。

mount

mount 命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。

参数作用
-a 挂载所有在/etc/fstab 中定义的文件系统
-t 指定文件系统的类

要把设备/dev/sdb2 挂载到/backup 目录,只需要在 mount 命令中填写设备与挂载目录参数就行,系统会自动去判断要挂载文件的类型.

mount /dev/sdb2 /backup

按照上面的方法执行 mount 命令后就能立即使用文件系统了, 但系统在重启后挂载就会失效, 也就是说我们需要每次开机后都手动挂载一下。 这肯定不是我们想要的效果,如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 自检 优先级”(各字段的意义见表 6-4)写入到/etc/fstab 文件中。

设备文件一般为设备的路径+设备名称,也可以写唯一识别码( UUID, Universally Unique Identifier)
挂载目录 指定要挂载到的目录,需在挂载前创建好
格式类型 指定文件系统的格式,比如 Ext3、 Ext4、 XFS、 SWAP、 iso9660(此为光盘设备)等
权限选项 若设置为 defaults,则默认权限为: rw, suid, dev, exec, auto, nouser, async
自检 若为 1 则开机后进行磁盘自检,为 0 则不自检
优先级 若“自检”字段为 1,则可对多块硬盘进行自检优先级设置

image-20210302092634550

如果想将文件系统为 ext4 的硬件设备/dev/sdb2 在开机后自动挂载到/backup 目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab 文件中写入下面的信息

/dev/sdb2 /backup ext4 defaults 0 0

umount

卸载文件系统就意味不再使用硬件的设备资源,因此卸载操作只需要说明想要取消关联的设备文件或挂载目录的其中一项即可。

umount /dev/sdb2

如果当前操作目录就在这个目录,那么会导致出现target is busy,退出这个目录即可

image-20210303134836094

添加硬盘设备

通过虚拟机添加一个新的硬盘

image-20210302100554773

image-20210302100614812

image-20210302100623693

image-20210302100641534

image-20210302100648810

image-20210302100707016

可以看到/dev下有一块新硬盘sdb。

image-20210302100936685

fdisk 分区

fdisk 命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”

参数作用
m 查看全部可用的参数
n 添加新的分区
d 删除某个分区信息
l 列出所有可用的分区类型
t 改变某个分区的类型
p 查看分区信息
w 保存并退出
q 不保存直接退出

使用fdisk进行磁盘管理:

# 管理磁盘分区 fdisk /dev/sdb # 查看所有分区信息 p # 添加新分区 n # 设置该分区为主分区p,扩展分区e p # 设置该分区序号 1 # 设置起始扇区位置 直接按enter,使用默认值2048 # 设置该分区终止扇区位置 +2G # 表示该分区有2G大小,不用计算尾部扇区 # 查看分区信息 p # 保存并退出 w

image-20210302103420866

使用file查看文件属性

file /dev/sdb1 # 如果返回/dev/sdb1: cannot open (No such file or directory),需要输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令 partprobe partprobe file /dev/sdb1 /dev/sdb1: block special

格式化

硬件存储设备没有进行格式化,则 Linux 系统无法得知怎么在其上写入数据。

格式化会将裸盘格式化成文件系统,操作系统才能读取文件。

# 查看所有的格式化类型 mkfs+[Tab]+[Tab] mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.fat mkfs.minix mkfs.msdos mkfs.vfat mkfs.xfs # 需要什么样的格式化就对该硬件进行格式 mkfs.xfs /dev/sdb1

挂载

df -h
# 新建一个挂载点 mkdir /newFS # 挂载 mount /dev/sdb1 /newFS # 查看挂载状态和硬盘使用信息量 df -h

image-20210302110026886

将挂载信息写到/etc/fstab

vim /etc/fstab # 添加挂载信息 /dev/sdb1 /newFS xfs defaults 0 0

du命令

该命令就是用来查看一个或多个文件占用了多大的硬盘空间

简写参数参数解释
-s --summarize display only a total for each argument
-h --human-readable print sizes in human readable format (e.g., 1K 234M 2G)
# 将/etc/下的文件拷贝到/newFS cp -rf /etc/* /newFS/ # 查看所有/newFS/下的文件大小 du -sh /newFS/

image-20210302111504389

添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。 只有当真实的物理内存耗尽后才会调用交换分区的资源 。

在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍。

# 新产生一个分区后,对swap分区进行格式化 mkswap /dev/sdb2 # 删除交互分区 swapoff /dev/sdb2 # 查看交换分区 swapon -s cat /proc/swaps

查看内存使用

free -m

将挂载信息保存到/etc/fstab中

vim /etc/fstab # 添加记录 /dev/sdb2 swap swap defaults 0 0

磁盘容量配额

quota命令进行磁盘容量配额管理, 从而限制用户的硬盘可用容量或所能创建的最大文件个数

  • 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
  • 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
  • 软限制数值必须小于等于硬限制数值

RHEL 7 如果需要支持quota磁盘配额需要在/etc/fstab中进行,在defaults后添加,uquota后重启

UUID=689abdc1-39d6-441e-afeb-dcd04dc9b0d8 /boot xfs defaults,uquota 1 2

此时/boot目录已经支持了quota配额限制

# 添加用户 useradd tom # 给/boot目录添加其他人w权限 chmod -Rf o+w /boot

xfs_quota

xfs_quota 命令是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令,格式为“quota [参数] 配额 文件系统”

# -c 表示用参数形式设置 # -x 专家模式,可以设置更复杂的配置 # 该命令设置了tom用户在/boot目录 大小软限制3M,硬限制6M,设置了数量软限制3个,硬限制6个 xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot

测试:

dd if=/dev/zero of=/boot/tom bs=5M count=1 dd if=/dev/zero of=/boot/tom bs=8M count=1

image-20210302142040869

可以看到在创建8M的文件时被阻止了。

edquota

edquota 命令用于编辑用户的 quota 配额限制,格式为“edquota [参数] [用户] ”。

参数解释
-u 要针对哪个用户进行设置
-g 要针对哪个用户组进行设置

使用root用户修改quota

edquota -u tom # 修改hard 6144 -> 10240

image-20210302143146296

测试:

dd if=/dev/zero of=/boot/tom bs=8M count=1

image-20210302143635935

软硬方式链接

可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效

  • 硬链接:

    可以将它理解为一个“指向原始文件 inode 的指针”,系统不为它分配独立的 inode 和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1;而且只有当该文件的 inode 连接数为 0 时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件 inode 的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行
    链接。

  • 软链接:

    仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与 Windows 系统中的“快捷方式”具有一样的性质。

ln命令

参数作用
-s 创建“符号链接”(如果不带-s 参数,则默认创建硬链接)
-f 强制创建文件或目录的链接
-i 覆盖前先询问
-v 显示创建链接的过程

创建软链接:

# 创建软链接 ln -s /temp/readme.txt /temp/readit.txt # 创建硬链接 ln /temp/readme.txt /temp/readith.txt

image-20210302154212686

可以看出硬链接会是硬盘中的连接数增加,软链接如果删除了原文件,那么该链接无法访问。

使用RAID和LVM磁盘阵列技术

RAID(独立冗余磁盘阵列)

  • RAID0

    RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,类似于扩容

    image-20210302174214869

  • RAID1

    它是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上,类似于主从

    image-20210302174309369

  • RAID5

    RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。 RAID 5 技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。parity 部分存放的就是数据的奇偶校验信息

    image-20210302175142864

  • RAID10

    RAID 10 技术是 RAID 1+RAID 0 技术的一个“组合体”,类似于扩容+主从。

    image-20210302175232315

创建RAID

  1. 添加硬盘

    image-20210302175658045

    添加4块5G的虚拟硬盘

    # 查看linux中设备 ll /dev/ | grep sd

    image-20210302175916948

  2. 创建RAID

    mdadm 命令用于管理 Linux 系统中的软件 RAID 硬盘阵列, 格式为“mdadm [模式] <RAID设备名称> [选项] [成员设备名称]”。

    参数作用
    -a 检测设备名称
    -n 指定设备数量
    -l 指定 RAID 级别
    -C 创建
    -v 显示过程
    -f 模拟设备损坏
    -r 移除设备
    -Q 查看摘要信息
    -D 查看详细信息
    -S 停止 RAID 磁盘阵列
    -x 备份盘的数量
    # 创建一个名为/dev/md0的一个RAID管理 mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sdc /dev/sdd /dev/sde /dev/sdf
  3. 格式化与挂载

    # 使用ext4文件系统处理该磁盘矩阵 mkfs.ext4 /dev/md0 # 挂载 mkdir /RAID mount /dev/md0 /RAID

    image-20210302184311815

    可以看到md0的容量为10G,同时需要把挂载信息写到/etc/fstab中

    echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
  4. 损坏与修复

    # 模拟设备损坏 mdadm /dev/md0 -f /dev/sdc # 查看RAID详情 mdadm -D /dev/md0 # 解除挂载 umount /RAID # 更换磁盘后,重新检测设备名称 mdadm /dev/md0 -a /dev/sdc # 查看RAID详情 mdadm -D /dev/md0 # 重新根据/etc/fstab来进行挂载 mount -a
  5. 删除RAID

    # 接触挂载 umount /dev/md0 # 停止RAID mdadm -S /dev/md0 # 删除挂载持久化/etc/fstab

磁盘阵列+备份盘

RAID10中,如果出现了RAID1中的两块磁盘都出现了问题,那么就会导致数据丢失,因此我们可以在创建RAID时添加备份盘,使用-x指定备份盘的数量。

# 创建名为/dev/md0的磁盘矩阵,同时检测设备名称,其中设备有2个,RAID级别为1,备份盘为1个 mdadm -Cv /dev/md0 -a yes -n 2 -l 1 -x 1 /dev/sdc /dev/sdd /dev/sde

删除磁盘矩阵:

# 接触挂载 umount /dev/md0 # 停止磁盘矩阵 mdadm -S /dev/md0 # 修改/etc/fstab

LVM(逻辑卷管理器)

解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。

image-20210303092942507

比如小明家里想吃馒头但是面粉不够了,于是妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需要把这些面粉(物理卷[PV, Physical Volume])揉成一个大面团(卷组[VG, Volume Group]),然后再把这个大团面分割成一个个小馒头(逻辑卷[LV, Logical Volume]),而且每个小馒头的重量必须是每勺面粉(基本单元[PE, Physical Extent])的倍数。

功能/命令物理卷管理卷组管理逻辑卷管理
扫描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdisplay
删除 pvremove vgremove lvremove
扩展   vgextend lvextend
缩小   vgreduce lvreduce

创建LVM

# 添加物理卷 pvcreate /dev/sde /dev/sdf # 添加卷组,卷组名为storage vgcreate storage /dev/sde /dev/sdf # 添加逻辑卷 # -n表示 逻辑卷名称 -l表示PE个数,PE默认为4M大小,37个PE表示148M,使用-L直接表示逻辑卷大小 lvcreate -n vo -l 37 storage lvcreate -n vo -L 150M storage # 显示逻辑卷 lvdisplay # 格式化 mkfs.ext4 /dev/storage/vo # 挂载 mkdir /linuxprobe mount /dev/storage/vo /linuxprobe # 持久化 echo "/dev/storage/vo /linuxprobe ext4 defaults 0 0" >> /etc/fstab # 查看挂载情况和磁盘使用 df -h

扩容逻辑卷

# 删除挂载 umount /linuxprobe # 扩展 lvextend -L 290M /dev/storage/vo # 检测磁盘完整性 e2fsck -f /dev/storage/vo # 重新设置磁盘容量 resize2fs /dev/storage/vo # 重新挂载 mount -a # 查看挂载情况和磁盘使用 df -h

由于进行了扩展,而磁盘中的文件系统的容量没有变更,所以需要进行重新设置

# 检查磁盘的文件系统是否工作正常 e2fsck -f /dev/storage/vo # 重新设置文件系统中的block长度 resize2fs /dev/storage/vo

缩小逻辑卷

# 删除挂载 umount /linuxprobe # 检查磁盘完整性,重置容量前必须要做 e2fsck -f /dev/storage/vo # 重新设置该磁盘的文件系统的容量 resize2sf /dev/storage/vo 120M # 缩小逻辑卷容量 lvreduce -L 120M /dev/storage/vo # 重新挂载 mount -a # 查看挂载情况和磁盘使用 df -h

逻辑卷快照

LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原

  • 快照卷的容量必须等同于逻辑卷的容量
  • 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除
# 查看卷组信息 vgdisplay # 在逻辑卷挂载目录添加文件 echo "123" > /linuxprobe/readme.txt # 创建逻辑卷快照,-s表示创建/dev/storage/vo逻辑卷的快照,-n表示名称,-L表示容量,和逻辑卷一致 lvcreate -L 120M -n SNAP -s /dev/storage/vo # 在逻辑卷中添加文件 dd if=/dev/zero of=/linuxprobe/files count=1 bs=100M # 去挂载 umount /linuxprobe # 快照还原,还原后SNAP快照会自动删除 lvconvert --merge /dev/storage/SNAP # 重新挂载 mount -a # 查看目录 ll /linuxprobe

删除逻辑卷

# 删除挂载,同时修改/etc/fstab umount /linuxprobe vim /etc/fstab # 删除逻辑卷 lvremove /dev/storage/vo # 删除卷组,只需要名字,不需要路径 gvremove storage # 删除物理卷 pvremove /dev/sde /dev/sdf # 查看信息 pvdisplay vgdisplay lgdisplay

RAID结合LVM

先使用RAID创建两个设备/dev/md0和/dev/md1,再通过LVM对/dev/md0和/dev/md1进行构建物理卷,卷组和逻辑卷。最后通过对逻辑卷进行挂载

iptables和firewalld防火墙

防火墙管理工具

在公网与企业内网之间充当保护屏障的防火墙,虽然有软件或硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。

在 RHEL 7 系统中, firewalld 防火墙取代了 iptables 防火墙。 iptables 与 firewalld 都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已, 或者说, 它们只是一种服务 。

iptables

防火墙策略规则的匹配顺序是从上至下的,因此要把较为严格、优先级较高的策略规则放到前面,以免发生错误。

DROP 的动作是丢包,不响应; REJECT 是拒绝请求,同时向发送方回送拒绝信息。

参数作用
-P 设置默认策略
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址 IP/MASK,加叹号“!”表示除这个 IP 外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如 TCP、 UDP、 ICMP
--dport num 匹配目标端口号
--sport num 匹配来源端口号
# 查看已有的防火墙规则链 iptables -L # 清空防火墙规则链 iptables -F # 设置默认策略为拒绝,只能用DROP,不能用REJECT。默认策略为拒绝,那么就会所有的流量都会拒绝,那么需要配置策略来使需要的流量通过 iptables -P INPUT DROP # 向防火墙的INPUT 规则链中添加一条允许 ICMP 流量进入的策略规则就默认允许了这种 ping 命令检测行为 iptables -I INPUT -p icmp -j ACCEPT # 删除第一条匹配规则 iptables -D INPUT 1 # 设置默认策略为允许 iptables -P INPUT ACCEPT # 设置只允许指定的网段访问22端口,允许的要在上面 iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j REJECT # 查看防火墙策略 iptables -L # 向 INPUT 规则链中添加拒绝所有人访问本机 12345 端口的策略规则 iptables -I INPUT -p tcp --dport 12345 -j REJECT iptables -I INPUT -p udp --dport 12345 -j REJECT # 向 INPUT 规则链中添加拒绝 192.168.10.5 主机访问本机 80 端口(Web 服务)的策略 iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT # 向 INPUT 规则链中添加拒绝所有主机访问本机 1000~1024 端口的策略规则 iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT iptables -A INPUT -p udp --dport 1000:1024 -j REJECT # 让配置的防火墙策略永久生效 service iptables save

firewalld

RHEL 7 系统中集成了多款防火墙管理工具, 其中 firewalld( Dynamic Firewall Manager of Linux systems, Linux 系统的动态防火墙管理器) 服务是默认的防火墙配置管理工具, 它拥有基于 CLI(命令行界面)和基于 GUI(图形用户界面)的两种管理方式。

firewalld 支持动态更新技术并加入了区域( zone)的概念。类似于windows中的专有网络,共有网络。

firewall-cmd(终端管理工具)

参数作用
--get-default-zone 查询默认的区域名称
--set-default-zone=<区域名称> 设置默认的区域,使其永久生效
--get-zones 显示可用的区域
--get-services 显示预先定义的服务
--get-active-zones 显示当前正在使用的区域与网卡名称
--add-source= 将源自此 IP 或子网的流量导向指定的区域
--remove-source= 不再将源自此 IP 或子网的流量导向某个指定区域
--add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
--add-service=<服务名> 设置默认区域允许该服务的流量
--add-port=<端口号/协议> 设置默认区域允许该端口的流量
--remove-service=<服务名> 设置默认区域不再允许该服务的流量
--remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
--reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
--panic-on 开启应急状况模式
--panic-off 关闭应急状况模式

firewalld默认模式是运行时模式,重启就会失效,如果希望配置策略一致存在,需要使用永久(permanent)模式

设置防火墙策略时添加--permanent 参数。但是不能立即生效,需要使用firewall-cmd reload使其生效。

# 查看 firewalld 服务当前所使用的区域 firewall-cmd --get-default-zone # 查询 eno16777736 网卡在 firewalld 服务中的区域 firewall-cmd --get-zone-of-interface=eno16777736 # 把 firewalld 服务中 eno16777736 网卡的默认区域修改为 external,并在系统重启后生效 firewall-cmd --permanent --zone=external --change-interface=eno16777736 # 把 firewalld 服务的当前默认区域设置为 public firewall-cmd --set-default-zone=public # 启动 firewalld 防火墙服务的应急状况模式,阻断一切网络连接 firewall-cmd --panic-on # 关闭 firewalld firewall-cmd --panic-off # 查询 public 区域是否允许请求 SSH 和 HTTPS 协议的流量 firewall-cmd --zone=public --query-service=ssh firewall-cmd --zone=public --query-service=https firewall-cmd --zone=public --list-services # 把 firewalld 服务中请求 HTTPS 协议的流量设置为永久允许 firewall-cmd --zone=public --add-service=https firewall-cmd --permanent --zone=public --add-service=https firewall-cmd --reload # 把 firewalld 服务中请求 HTTP 协议的流量设置为永久拒绝,并立即生效 firewall-cmd --permanent --zone=public --remove-service=http firewall-cmd --reload # 把在 firewalld 服务中访问 8080 和 8081 端口的流量策略设置为允许,但仅限当前生效 firewall-cmd --zone=public --add-port=8080-8081/tcp firewall-cmd --zone=public --list-ports # 把原本访问本机 888 端口的流量转发到 22 端口,要且求当前和长期均有效 firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10 firewall-cmd --reload # firewalld 中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有正对性的策略配置 firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"

SNAT

是一种为了解决 IP 地址匮乏而设计的技术,它可以使得多个内网中的用户通过同一个外网 IP 接入 Internet(互联网)

服务的访问控制列表

TCP Wrappers 是 RHEL 7 系统中默认启用的一款流量监控程序, 它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。

它是一种类似于iptables防火墙的,基于tcp协议的访问控制工具,只能对基于tcp协议的部分服务作访问控制。
iptables在网络层上通过IP过滤,阻挡网络中部分IP的恶意攻击,与网络有关。
tcp_wrapper依赖于libwrap库,会控制支持libwrap库的那部分基于tcp协议的服务,通过读取两个配置文件中配置的规则,判断该服务是否可以访问,因此它只能对本机内部的服务进行控制,跟网络无关。

判断服务是否支持tcp_wrapper

ldd `which sshd` | grep libwrap strings `which sshd` | grep libwrap

配置TCP Wrappers

  • /etc/hosts.allow
  • /etc/hosts.deny

image-20210303164732125

配置方法:

daemon_list:client_list:[:options] # daemon_list 配置单个服务,填写应用程序名(例如:sshd) 配置多个服务,使用逗号隔开(例如:sshd,vsftpd) 配置所有可受控制的服务,使用ALL(大小写均可,通常小写) # client_list:要配置的网段或IP列表 配置单个IP,(例如:192.168.10.1) 配置多个IP:使用逗号隔开(例如:192.168.10.1,192.168.10.2) 配置网段方式一,例如192.168.代表192.168.0.0网段的所有IP 配置网段方式二,使用完整格式的掩码,不可使用前缀格式掩码(例如:192.168.0.0/255.255.255.0) 配置网段方式三,例如192.168.10.*代表192.168.10网段的所有IP 配置主机名,例如,www.utest.com 配置所有主机,使用ALL(大小写均可,通常小写) 配置所有可以解析到的主机,使用KNOWN 配置所有无法解析到的主机,使用UNKNOWN 配置主机名正反解析不匹配的地址,使用PARANOID 配置中排除某个主机或某个网络,使用EXCEPT(例如:sshd:192.168. EXCEPT 192.168.10.) # [:options]:声明处理方式,通常不用处理 在hosts.allow,默认使用allow allow代表接受,在/etc/hosts.allow中可以不写,例如:sshd:192.168.10.1 等同于 sshd:192.168.10.1:allow deny代表拒绝,在/etc/hosts.allow如配置拒绝规则,必须填写 当接受和拒绝规则配置到同一个配置文件中,可以单使用一个配置文件进行管理

举例:

# 在/etc/hosts.deny配置,所有的主机都不能使用ssh。但已经连上的ssh服务可以继续使用 sshd:ALL # 在/etc/hosts.allow配置,只有10.6.2.187可以使用ssh服务 sshd:10.6.2.187

使用ssh服务管理远程主机

配置网络服务

配置网络参数

  • 使用nmtui界面工具

  • 修改/etc/systemctl/

    vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 systemctl restart network

创建网络会话

RHEL 和 CentOS 系统默认使用 NetworkManager 来提供网络服务,这是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。可以使用 nmcli 命令来管理 NetworkManager 服务。

RHEL7 系统支持网络会话功能,允许用户在多个配置文件中快速切换(非常类似于 firewalld 防火墙服务中的区域技术)。

# 创建会话company # autoconnect no 表示 设置该网络会话默认不被自动激活 # ip4 192.168.10.10/24 表示 指定ip为192.168.10.10 # gw4 192.168.10.1 表示 网关为 192.168.10.1 nmcli connection add con-name company ifname eno16777736 autoconnect no type ethernet ip4 192.168.10.10/24 gw4 192.168.10.1 # 创建会话home # add 表示 添加网络会话 # ifname 表示 指定网卡名称 # type 表示 网络会话类型 # con-name 表示 会话名称 nmcli connection add con-name house type ethernet ifname eno16777736

每创建一个会话都会在/etc/sysconfig/network-script下创建一个ifcfg-文件

image-20210305160333232

# 查看所有会话 nmcli c show # 使用home会话 nmcli c up home

切换到了home会话,使用的就是ifcfg-home配置文件。

绑定两块网卡

借助于网卡绑定技术,不仅可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正常提供网络服务。

添加另一块网卡

image-20210305164705071

两块网卡使用同样的模式

设置网卡信息

# 查看新添加的网卡信息 ip addr

image-20210308092631479

可以看到新添加了一个网卡,需要注意的是,这些原本独立的网卡设备此时需要被配置成为一块“从属”网卡,服务于“主”网卡,不应该再有自己的 IP 地址等信息。

# 将两块网卡信息都修改成相同的,处理设备信息为从设备bond0的从设备 vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno16777736 MASTER=bond0 SLAVE=yes vim /etc/sysconfig/network-scripts/ifcfg-eno50332216 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno50332216 MASTER=bond0 SLAVE=yes

添加一个主设备ifcfg-bond0

vim /etc/sysconfig/network-scripts/ifcfg-bond0 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=bond0 IPADDR=10.6.2.128 PREFIX=24 DNS1=114.114.114.114 GATEWAY=10.6.2.1 NM_CONTROLLED=no

查看DNS

cat /etc/resolv.conf

让linux内核支持网卡绑定驱动

下面使用 Vim 文本编辑器创建一个用于网卡绑定的驱动文件,使得绑定后的 bond0 网卡设备能够支持绑定技术( bonding);同时定义网卡以 mode6 模式进行绑定,且出现故障时自动切换的时间为 100 毫秒。

vim /etc/modprobe.d/bond.conf alias bond0 bonding options bond0 miimon=100 mode=6

重启网络服务后网卡绑定操作即可成功。正常情况下只有 bond0 网卡设备才会有 IP 地址等信息

image-20210308092901881

查看信息

cat /proc/net/bonding/bond0

image-20210308095436611

测试网卡切换

image-20210308095845594

可以看出当前激活从网卡变成了eno16777736

image-20210308100007710

远程控制服务

配置sshd服务

sshd 服务的配置信息保存在/etc/ssh/sshd_config 文件中

参数作用
Port 22 默认的 sshd 服务端口
ListenAddress 0.0.0.0 设定 sshd 服务器监听的 IP 地址
Protocol 2 SSH 协议的版本号
HostKey /etc/ssh/ssh_host_key SSH 协议版本为 1 时, DES 私钥存放的位置
HostKey /etc/ssh/ssh_host_rsa_key SSH 协议版本为 2 时, RSA 私钥存放的位置
HostKey /etc/ssh/ssh_host_dsa_key SSH 协议版本为 2 时, DSA 私钥存放的位置
PermitRootLogin yes 设定是否允许 root 管理员直接登录
StrictModes yes 当远程用户的私钥改变时直接拒绝连接
MaxAuthTries 6 最大密码尝试次数
MaxSessions 10 最大终端数
PasswordAuthentication yes 是否允许密码验证
PermitEmptyPasswords no 是否允许空密码登录(很不安全)

安全密钥验证

如果希望通过不需要密码就能连接到服务端ssh服务,那么需要客户端生成密钥对,并将公钥发送给服务端。

# 在客户端生成密钥对 ssh-keygen # 在10.6.2.150中执行,把客户端主机中生成的公钥文件传送至远程主机,两种一样 ssh-copy-id 10.6.2.128 ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.6.2.128 # 对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启 sshd 服务程序 vim /etc/ssh/sshd_config PasswordAuthentication no systemctl restart sshd # 在客户端尝试登录到服务器,此时无须输入密码也可成功登录 ssh 192.168.10.10

其中ssh-copy-id相当于把公钥写到服务器的/root/.ssh/authorized_keys文件中。

如果希望windows客户端工具也可以使用密钥登录,那么需要指定私钥

image-20210308160454732

远程传输命令 scp

scp( secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp[参数] 本地文件 远程帐户@远程 IP 地址:远程目录”。

参数作用
-v 显示详细的连接进度
-P 指定远程主机的 sshd 端口号
-r 用于传送文件夹
-6 使用 IPv6 协议

如果设置了上节密钥设置,那么就不需要在使用scp时需要输入密码了

# 下载 scp 10.6.2.128:/root/readme.txt /root/ # 上传 mv readme.txt readme2.txt scp /root/readme2.txt 10.6.2.128:/root/

可以在10.6.2.128看到上传的文件

image-20210308161241751

不间断会话服务

screen 是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。

使用screen执行命令后,并不会因为ssh服务中断而结束命令。

# 安装 yum install -y screen

管理远程会话

# 创建一个窗口,指定名称 screen -S backup # 退出窗口 exit

然后在screen窗口中执行的命令,尽管关闭了ssh窗口,该命令仍然在后台执行。

# 查看当前已存在的窗口 screen -ls

image-20210309165009598

# 恢复指定的窗口 screen -r ping # 连接上一个未端口的窗口,用于会话共享 screen -x

可以在命令前加上screen,在命令执行完成之后窗口会自动关闭。

# 断开连接该窗口,在窗口内运行,注意如果程序一直占据了窗口,那么无法输入命令 screen -d

会话共享功能

# 在10.6.2.128 上创建窗口 screen -S ping # 在10.6.2.150 上使用ssh访问 ssh 10.6.2.128 # 在10.6.2.128 连接该未断开的窗口,即可共享该会话了。 screen -x

使用Apache服务部署静态网站

安装

# 安装httpd yum install -y httpd # 启动 systemctl start httpd systemctl enable httpd # 访问浏览器 curl http:127.0.0.1

配置

配置文件的名称存放位置
服务目录 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
网站数据目录 /var/www/html
访问日志 /var/log/httpd/access_log
错误日志 /var/log/httpd/error_log

进入/etc/httpd/conf/httpd.conf可以看到想对应的配置信息

参数用途
ServerRoot 服务目录
ServerAdmin 管理员邮箱
User 运行服务的用户
Group 运行服务的用户组
ServerName 网站服务器的域名
DocumentRoot 网站数据目录
Directory 网站数据目录的权限
Listen 监听的 IP 地址与端口号
DirectoryIndex 默认的索引页页面
ErrorLog 错误日志文件
CustomLog 访问日志文件
Timeout 网页超时时间,默认为 300 秒

文件目录使用DocumentRoot设置,

DirectoryIndex表示默认的索引页,默认为index.html,如果没有,那么就会展示apache首页。

cd /var/www/html/ echo "welcome to apache" > index.html # 访问 curl localhost welcome to apache

但是如果修改了目录DocumentRoot为/home/wwwroot/html,再创建文件夹并添加index.html并不能成功,那是因为有SELinux的存在,访问了用户的家目录所以被selinux拒绝了。将其临时关闭,即可访问。

image-20210310144045613

SELinux安全子系统

SELinux( Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制( MAC, Mandatory Access Control)的安全子系统 。HEL 7 系统使用SELinux 技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。

对服务程序的功能进行限制( SELinux 域限制可以确保服务程序做不了出格的事情);

对文件资源的访问限制( SELinux 安全上下文确保文件资源只能被其所属的服务程序进行访问)

SELinux有三种模式:

  • enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
  • permissive:遇到服务越权访问时,只发出警告而不强制拦截。
  • disabled:对于越权的行为不警告也不拦截。
# 查看selinux配置的模式 cat /etc/selinux/config # 查看当前selinux模式 getenforce # 临时启用关闭selinux,0是关闭,1是开启 setenforce 0

查看文件的安全上下文

# -d表示列出该目录而不是其下的文件, -Z列出安全上下文(security context) ls -Zd /var/www/html ls -Zd /home/wwwroot/html

image-20210310151127456

其中SELinux 安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。

对文件资源的限制

semanage命令(需要安装)

semanage 命令用于管理 SELinux 的策略,格式为“semanage [选项] [文件]”。

如果没有该命令,可以使用 yum -y install policycoreutils-python 安装

常用参数:

  • -l 参数用于查询;

  • -a 参数用于添加;

  • -m 参数用于修改;

  • -d 参数用于删除。

# 给/home/wwwroot添加security context semanage fcontext -a -t httpd_sys_content_t /home/wwwroot # 给/home/wwwroot下的所有文件添加security context semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/* # 生效上下文,-R递归执行,-v展示执行过程 restorecon -Rv /home/wwwroot/

没有semanage命令

# 查找semanage在哪个包内 yum provides semanage epel/x86_64/filelists_db | 12 MB 00:00:01 policycoreutils-python-2.5-34.el7.x86_64 : SELinux policy core python utilities Repo : base Matched from: Filename : /usr/sbin/semanage # 安装policycoreutils-python-2.5-34.el7.x86_64 yum install -y policycoreutils-python-2.5-34.el7.x86_64 Error: initscripts conflicts with redhat-release-server-7.0-1.el7.x86_64 You could try using --skip-broken to work around the problem ** Found 2 pre-existing rpmdb problem(s), 'yum check' output follows: python-urlgrabber-3.10-10.el7.noarch is a duplicate with python-urlgrabber-3.10-4.el7.noarch rpm-4.11.3-45.el7.x86_64 is a duplicate with rpm-4.11.1-16.el7.x86_64 # 安装yum-utils yum install yum-utils # 删除重复包 package-cleanup --cleandupes Not removing rpm-4.11.1-16.el7.x86_64 because it is required by 2 installed packages No duplicates to remove Warning: Some duplicates were not removed because they are required by installed packages. You can try --cleandupes with --removenewestdupes, or review them with --dupes and remove manually.

chcon(不需要安装)

# 给/home/wwwroot添加security context chcon -Rt httpd_sys_content_t /home/wwwroot

对程序功能进行限制

限制一个程序的功能,例如一个程序不应该监控键盘等。

# 查看所有程序功能及是否允许 getsebool -a # 设置某程序的限制 setsebool -P httpd_enable_homedirs=on

image-20210311103319559

对程序端口的限制

semanage port -a -t smbd_port_t -p tcp 631

个人主页功能

如果想在系统中为每位用户建立一个独立的网站,通常的方法是基于虚拟网站主机功能来部署多个网站。

# 开启个人主页功能,该目录会指向用户的家目录,即/root/public_htmll或/home/linuxprobe/public_html vim /etc/httpd/conf.d/userdir.conf 设置UserDir # UserDir disabled UserDir public_html # 添加目录,添加用户首页 mkdir /home/linuxprobe/public_html echo "welcome to linuxprobe's website" > /home/linuxprobe/public_html/index.html chmod -Rf 755 /home/linuxprobe # 重启服务 systemctl restart httpd # 由于SElinux的域限制,需要将个人主页功能放开 setsebool -P httpd_enable_homedirs=on #使用其格式为“网址/~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格)访问个人主页 curl localhost/~linuxprobe

image-20210311104440226

添加口令功能

# 创建用户名,密码文件 htpasswd -c /etc/httpd/passwd linuxprobe 输入密码 123456 再次输入 123456 # 编辑个人主页配置文件 vim /etc/httpd/conf.d/userdir.conf # 重启服务 systemctl restart httpd

image-20210311111946305

再次访问个人主页就需要用户名密码了,linuxprobe/123456

image-20210311112126406

虚拟主机功能

Apache 的虚拟主机功能是服务器基于用户请求的不同 IP 地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。即ip和对应的网站关联起来。

设置当前网卡绑定多个IP

TYPE=Ethernet BOOTPROTO=none ONBOOT=yes USERCTL=no DEVICE=eno16777736 DNS1=114.114.114.114 IPADDR0=10.6.2.158 PREFIX0=24 GATEWAY0=10.6.2.1 IPADDR1=10.6.2.159 PREFIX1=24 IPADDR2=10.6.2.160 PREFIX2=24 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=no NAME="System eno16777736" UUID=13756690-ac77-b776-4fc1-f5535cee6f16

使用数字后缀来表示多个ip,也可以使用mntui进行修改

image-20210311114755953

设置ip和网站绑定

# 修改配置文件,添加虚拟主机 vim /etc/httpd/conf/httpd.conf <VirtualHost 10.6.2.158> DocumentRoot /home/wwwroot/html/158 ServerName www.linuxprobe.com <Directory /home/wwwroot/html/158 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.6.2.159> DocumentRoot /home/wwwroot/html/159 ServerName www.linuxprobe.com <Directory /home/wwwroot/html/159 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.6.2.160> DocumentRoot /home/wwwroot/html/160 ServerName www.linuxprobe.com <Directory /home/wwwroot/html/160 > AllowOverride None Require all granted </Directory> </VirtualHost> # 创建目录 mkdir /home/wwwroot/html/158 mkdir /home/wwwroot/html/159 mkdir /home/wwwroot/html/160 # 添加文件 echo "welcome to 10.6.2.158" > /home/wwwroot/html/158/index.html echo "welcome to 10.6.2.159" > /home/wwwroot/html/159/index.html echo "welcome to 10.6.2.160" > /home/wwwroot/html/160/index.html # 重启httpd systemctl restart http # 访问 curl 10.6.2.159

如果不能访问,那是因为SElinux没有对文件域

chcon -Rt httpd_sys_content_t /home/wwwroot

使用域名来访问

通过域名来访问获取不同的网站

# 修改配置文件,添加虚拟主机,ServerName不同,根据ServerName来确定访问哪个,其余和上面通过IP来访问不同网站一样 vim /etc/httpd/conf/httpd.conf <VirtualHost 10.6.2.158> DocumentRoot /home/wwwroot/html/www ServerName www.linuxprobe.com <Directory /home/wwwroot/html/www > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.6.2.158> DocumentRoot /home/wwwroot/html/base ServerName base.linuxprobe.com <Directory /home/wwwroot/html/base > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.6.2.158> DocumentRoot /home/wwwroot/html/tech ServerName tech.linuxprobe.com <Directory /home/wwwroot/html/tech > AllowOverride None Require all granted </Directory> </VirtualHost>

如果域名和ip冲突了,以域名访问的话,那么以ServerName为准,反之以ip访问,那么就以VirtualHost为准

使用端口来访问

通过端口来访问不同的网站

# 修改配置文件,添加虚拟主机,ServerName不同,根据ServerName来确定访问哪个,其余和上面通过IP来访问不同网站一样 vim /etc/httpd/conf/httpd.conf Listen 8086 Listen 8087 Listen 8088 <VirtualHost 10.6.2.158:8086> DocumentRoot /home/wwwroot/html/8086 ServerName www.linuxprobe.com <Directory /home/wwwroot/html/8086 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.6.2.158:8087> DocumentRoot /home/wwwroot/html/8087 ServerName base.linuxprobe.com <Directory /home/wwwroot/html/8087 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.6.2.158:8088> DocumentRoot /home/wwwroot/html/8088 ServerName tech.linuxprobe.com <Directory /home/wwwroot/html/8088 > AllowOverride None Require all granted </Directory> </VirtualHost>

需要通过SElinux 设置httpd可以访问这些端口

semanage port -a -t http_port_t -p tcp 8086 semanage port -a -t http_port_t -p tcp 8087 semanage port -a -t http_port_t -p tcp 8088 # 查看SELinux中服务可用端口 semanage port -l| grep http # 设备安全上下文 semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/html/8086 semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/html/8087 semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/html/8088 semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/html/8086/* semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/html/8087/* semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/html/8088/* restorecon -Rv /home/wwwroot/

Apache的访问控制

Order Allow, Deny 表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求

<VirtualHost 10.6.2.158:8086> DocumentRoot /home/wwwroot/html/8086 ServerName www.linuxprobe.com <Directory /home/wwwroot/html/8086 > # 设置只有10.6.2.158能访问8086 Order allow,deny Allow from 10.6.2.158 </Directory> </VirtualHost> <VirtualHost 10.6.2.158:8087> DocumentRoot /home/wwwroot/html/8087 ServerName base.linuxprobe.com <Directory /home/wwwroot/html/8087 > # 设置只有10.6.2.187能访问8087 Order allow,deny Allow from 10.6.2.187 AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.6.2.158:8088> DocumentRoot /home/wwwroot/html/8088 ServerName tech.linuxprobe.com <Directory /home/wwwroot/html/8088 > AllowOverride None Require all granted </Directory> </VirtualHost>

使用vsftpd服务传输文件

FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、 21号端口,其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端发出的相关 FTP 命令与参数。

vsftpd( very secure ftp daemon,非常安全的 FTP 守护进程)是一款运行在 Linux 操作系统上的 FTP 服务程序

FTP具有两种模式:

  • 主动模式: FTP 服务器主动向客户端发起连接请求。
  • 被动模式: FTP 服务器等待客户端发起连接请求( FTP 的默认工作模式)

安装vsftpd

yum install -y vsftpd systemctl start vsftpd systemctl enable vsftpd

配置

vsftpd的主配置文件是/etc/vsftpd/vsftpd.conf

简化配置文件

mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf cat /etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
参数作用
listen=[YES|NO] 是否以独立运行的方式监听服务
listen_address=IP 地址 设置要监听的 IP 地址
listen_port=21 设置 FTP 服务的监听端口
download_enable= [YES|NO] 是否允许下载文件
userlist_enable=[YES|NO] userlist_deny=[YES|NO] 设置用户列表为“允许”还是“禁止”操作
max_clients=0 最大客户端连接数, 0 为不限制
max_per_ip=0 同一 IP 地址的最大连接数, 0 为不限制
anonymous_enable=[YES|NO] 是否允许匿名用户访问
anon_upload_enable=[YES|NO] 是否允许匿名用户上传文件
anon_umask=022 匿名用户上传文件的 umask 值
anon_root=/var/ftp 匿名用户的 FTP 根目录
anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO] 是否开放匿名用户的其他写入权限(包括重命名、删 除等操作权限)
anon_max_rate=0 匿名用户的最大传输速率(字节/秒), 0 为不限制
local_enable=[YES|NO] 是否允许本地用户登录 FTP
local_umask=022 本地用户上传文件的 umask 值
local_root=/var/ftp 本地用户的 FTP 根目录
chroot_local_user=[YES|NO] 是否将用户权限禁锢在 FTP 目录,以确保安全
local_max_rate=0 本地用户最大传输速率(字节/秒), 0 为不限

vsftpd 作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到 FTP 服务器上。

  • 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到 FTP 服务器。
  • 本地用户模式:是通过 Linux 系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可以畅通无阻地登录 FTP 服务器,从而完全控制整台服务器。
  • 虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为 FTP 服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

如果开启了chroot_local_user=YES,那么该主目录就会变成local_root=/var/ftp,否则会使用登录用户的主目录。

同时需要开启allow_writeable_chroot=YES,让用户具有写权限。

匿名开放模式

在 vsftpd 服务程序的匿名开放认证模式下,其账户统一为 anonymous,密码为空。

在连接到 FTP 服务器后,默认访问的是/var/ftp 目录。

在vsFTPd 3.0.2版本中,匿名用户访问不了ftp,提示 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

参数作用
anonymous_enable=YES 允许匿名访问模式
anon_umask=022 匿名用户上传文件的 umask 值
anon_upload_enable=YES 允许匿名用户上传文件
anon_mkdir_write_enable=YES 允许匿名用户创建目录
anon_other_write_enable=YES 允许匿名用户修改目录名称或删除目录
# 永久开启public的zone的ftp权限 firewall-cmd --permanent --zone=public --add-service=ftp firewall-cmd --reload # 修改工作目录的/var/ftp用户和组 chown -R ftp:ftp /var/ftp # 修改SELinux的域限制 setsebool -P ftpd_full_access=on

本地用户模式

vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES

重启服务后可以使用本地用户登录,即linux系统中所拥有的用户,但是要注意两个文件

  • /etc/vsftpd/ftpuser

    如果该文件有名字的话,那么表示不允许该用户登录

  • /etc/vsftpd/user_list

    如果userlist_deny=NO,那么只允许该列表中的用户登录。

    如果userlist_deny=YES,那么不允许该列表中的用户登录。

虚拟用户模式

使用创建的用户来登录ftp服务器

  1. 创建vuser.list文件作为用户名和密码,奇数行为用户名,偶数行为密码

    vim /etc/vsftpd/vuser.list zhangsan redhat lisi redhat
  2. 使用 db_load 命令用哈希( hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。

    # 创建hash文档 vuser.db db_load -T -t hash -f vuser.list vuser.db file vuser.db # 修改vuser.db的权限 chmod 600 vuser.db # 删除原始明文文档 rm -f vuser.list
  3. 修改指定虚拟用户

    vim /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES guest_enable=YES guest_username=virtual allow_writeable_chroot=YES # 修改文件跟目录为/var/ftproot local_root=/var/ftproot
  4. 创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。

    # 添加用户 virtual,nologin使其不可登录 useradd -d /var/ftproot -s /sbin/nologin virtual # 查看该目录 ls -d /var/ftproot # 修改权限 chmod -Rf 755 /var/ftproot/
  5. 建立用于支持虚拟用户的 PAM 文件 ,用于校验用户名密码

    vim /etc/pam.d/vsftpd.vu auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser
  6. 在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证文件的名称修改为 vsftpd.vu

    vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.vu
  7. 为虚拟用户设置不同的权限,使用匿名方式设置,其中张三

    mkdir /etc/vsftpd/vusers_dir/ cd /etc/vsftpd/vusers_dir/ touch lisi vim zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES

    添加user_config_dir 参数来定义这两个虚拟用户不同权限的配置文件所存放的路径

    vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers_dir

常用配置

参数作用
local_root 如果绑定了ftp的主目录,那么就是用该目录,否则使用用户主目录
chroot_local_user=YES 是否设置本地用户登录后的ftp主目录。
allow_writeable_chroot 允许ftp在目录中修改,需要和chroot_local_user=YES配套使用
userlist_deny 是否使用userlist文件来拒绝访问

简单文件传输协议

简单文件传输协议( Trivial File Transfer Protocol, TFTP)是一种基于 UDP 协议在客户端和服务器之间进行简单文件传输的协议。 (可将其当作 FTP 协议的简化版本)

# 安装tftp服务端和客户端 yum install tftp-server tftp # TFTP 服务是使用 xinetd 服务程序来管理的,需要修改xinetd服务配置,并重启 vim /etc/xinetd.d/tftp # 将其disabled = yes 改为 no # 开机自启 systemctl restart xinetd systemctl enable xinetd # 打开udp协议的69端口 firewall-cmd --permanent --add-port=69/udp firewall-cmd --reload

tftp默认使用的是/var/lib/tftpboot/目录,以下是常用参数

命令作用
? 帮助信息
put 上传文件
get 下载文件
verbose 显示详细的处理信息
status 显示当前的状态信息
binary 使用二进制进行传输
ascii 使用 ASCII 码进行传输
timeout 设置重传的超时时间
quit 退出

image-20210315153746439

下载的文件会放到用户的家目录下。

使用 Samba 或 NFS 实现文件共享

FTP 文件传输服务确实可以让主机之间的文件传输变得简单方便,但是FTP 协议的本质是传输文件,而非共享文件,因此要想通过客户端直接在服务器上修改文件内容还是一件比较麻烦的事情。

Samba

服务端安装

# 安装,主配置文件为/etc/samba/smb.conf yum install -y samba mv /etc/samba/smb.conf /etc/samba/smb.conf.bak # grep -v 表示反选, cat /etc/samba/smb.conf.bak | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf # 查看信息 cat /etc/samba/smb.conf
  1. 创建用于访问共享资源的账户信息。

    pdbedit 命令用于管理 SMB 服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。

    注意:Samba 服务程序的数据库要求账户必须在当前系统中已经存在。

    参数作用
    -a 用户名 建立 Samba 账户
    -x 用户名 删除 Samba 账户
    -L 列出账户列表
    -Lv 列出账户详细信息的列表
    # 检查当前机器是否已有用户 id dingli # 创建samba用户,密码设置为987654321` pdbedit -a -u dingli
  2. 修改samba配置

    vim /etc/samba/smb.conf [global] workgroup = MYGROUP server string = Samba Server Version %v log file = /var/log/samba/log.%m max log size = 50 security = user passdb backend = tdbsam load printers = yes cups options = raw [homes] comment = Home Directories browseable = no writable = yes [printers] comment = All Printers path = /var/spool/samba browseable = no guest ok = no writable = no printable = yes [database] comment = Do not arbitrarily modify the database file path = /home/database public = no writable = yes
  3. 创建目录,修改SELinux的域权限和安全上线文

    mkdir /home/database # 修改目录所属 chown -Rf dingli:dingli /home/database # 修改目录安全上下文 semanage fcontext -a -t samba_share_t /home/database restorecon -Rv /home/database # 查看samba域权限 getsebool -a | grep samba # 设置目录samba与权限 setsebool -P samba_enable_home_dirs on # 查看smb使用端口 emanage port -l | grep smb # 添加端口开放 firewall-cmd --permanent --zone=public --add-port=139/tcp firewall-cmd --permanent --zone=public --add-port=445/tcp firewall-cmd --reload
  4. 重启

    systemctl start smb # 启动会报错 STATUS=daemon 'smbd' finished starting up and ready to serve connectionsfailed to retrieve printer list: NT_STATUS_UNSUCCESSFUL 可以修改smb.conf中的global对应字段为: load printers = no printing = bsd printcap name = /dev/null disable spoolss = yes # 重启即可 systemctl restart smb systemctl enable smb

windows连接

在浏览器直接输入 \\+ip即可连接samba服务。

image-20210317101442987

在输入用户名密码后即可访问。

linux连接

linux连接samba服务需要安装支持文件共享服务的软件包( cifs-utils)

# 安装cifs-utils yum install -y cifs-utils # 添加用户信息 vim auth.smb username=dingli password=987654321` domain=MYGROUP # 修改权限,只让root可以查看 chmod 600 auth.smb # 添加挂载 mkdir /database vim /etc/fstab //10.6.2.158/database /database cifs credentials=/root/auth.smb 0 0 # 查看/databse目录 ll /database

NFS(网络文件系统)

如果需要共享文件的主机都是 Linux系统,非常推荐在客户端部署 NFS 服务来共享文件。

安装

RHEL 7 系统中默认已经安装了 NFS 服务,检查系统是否已经安装NFS

# 查看系统是否使用NFS yum list installed | grep nfs # 安装nfs yum install -y nfs-utils # 开启防火墙nfs服务 firewall-cmd --permanent --zone=public --add-service=nfs firewall-cmd --reload # 创建NFS共享文件夹 mkdir /nfsfile chmod -Rf 777 /nfsfile echo "welcome to nfs" > /nfsfile/readme

配置

NFS 服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容。我们可以按照“共享目录的路径 允许访问的 NFS 客户端(共享权限参数)”的格式,定义要共享的目录与相应的权限。

参数作用
ro 只读
rw 读写
root_squash 当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的匿名用户
no_root_squash 当 NFS 客户端以 root 管理员访问时, 映射为 NFS 服务器的 root 管理员
all_squash 无论 NFS 客户端使用什么账户访问,均映射为 NFS 服务器的匿名用户
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢 失数据
# 配置nfs权限,允许10.6.2.*访问,具有读写、同步写到硬盘 vim /etc/exports /nfsfile 10.6.2.*(rw,sync,root_squash)

启动

由于在使用 NFS 服务进行文件共享之前,需要使用 RPC( Remote Procedure Call,远程过程调用)服务将 NFS 服务器的 IP 地址和端口号等信息发送给客户端。 需要顺带重启并启用 rpcbind 服务程序

systemctl restart rpcbind systemctl enable rpcbind systemctl start nfs-server systemctl enable nfs-server # 打开防火墙端口,如果没开会报:clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host) firewall-cmd --permanent --zone=public --add-service=nfs netstat -luntp | grep rpcbind firewall-cmd --permanent --zone=public --add-port= 111 firewall-cmd --permanent --zone=public --add-port= 678 # 打开防火墙mountd服务,如果没开会报:rpc mount export: RPC: Unable to receive; errno = No route to host firewall-cmd --permanent --zone=public --add-service=mountd # 查看当前nfs服务可被使用的ip,表示nfs服务已经提供好了,可以使用客户端或服务端 showmount -e 10.6.2.158 Export list for 10.6.2.158: /nfsfile 10.6.2.*

客户端连接

客户端也需要安装nfs-utils

yum install -y nfs-utils # 修改挂载 vim /etc/fstab 10.6.2.158:/nfsfile /nfsfile nfs defaults 0 0 mount -a # 创建目录 mkdir /nfsfile

autofs自动挂载服务

上面的方法无论是Samba或是NFS都会在系统开机时就进行挂载,会消耗极多的资源。autofs会在使用挂载时才会自动挂载

yum install -y autofs

在 autofs 服务程序的主配置文件中需要按照“挂载目录 子配置文件”的格式进行填写。 后缀必须以.misc 结束

# 添加挂载父目录和配置文件,/nfsfile表示挂载的父目录,/etc/nfsfile.misc表示子配置文件 vim /etc/auto.master /nfsfile /etc/nfsfile.misc # 配置子配置文件,10.6.2.158表示挂载的目录,10.6.2.158:/nfsfile表示nfs共享文件夹,-rw,soft,intr表示这是一个软件挂载 vim /etc/nfsfile.misc 10.6.2.158 -rw,soft,intr 10.6.2.158:/nfsfile # 启动 systemctl start autofs systemclt enable autofs # 启动完成过后访问/nfsfile,查看发现下面没有文件,但是cd到10.6.2.158可以进入,并且此时df -h可以看到挂载信息 df -h 10.6.2.158:/nfsfile 18G 1.3G 17G 8% /nfsfile/10.6.2.158

同理自动挂载smb服务

# 添加smb服务配置 vim /etc/auto.master /database /etc/database.misc # 添加账号信息 vim /root/auth.smb username=dingli password=987654321` domain=MYGROUP # 添加smb服务 vim /etc/database.misc 10.6.2.158 -fstype=cifs,credentials=/root/auth.smb ://10.6.2.158/database # 重启 systemclt restart autofs

使用bind提供域名解析服务

DNS 域名解析服务

一项用于管理和解析域名与 IP 地址对应关系的技术

服务器类型:

  • 主服务器:在特定区域内具有唯一性,负责维护该区域内的域名与 IP 地址之间的对应关系。
  • 从服务器:从主服务器中获得域名与 IP 地址的对应关系并进行维护,以防主服务器宕机等情况。
  • 缓存服务器:通过向其他域名解析服务器查询获得域名与 IP 地址的对应关系,并将经常查询的域名信息保存到服务器本地,以此来提高重复查询时的效率。

简单来说,主服务器是用于管理域名和 IP 地址对应关系的真正服务器,从服务器帮助主服务器“打下手”,分散部署在各个国家、省市或地区,以便让用户就近查询域名,从而减轻主服务器的负载压力。缓存服务器不太常用,一般部署在企业内网的网关位置,用于加速用户的域名查询请求。

查询方式:

  • 递归查询,是指 DNS 服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果 DNS 服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。
  • 迭代查询则是指, DNS 服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台 DNS 服务器的地址,用户再向这台 DNS 服务器提交请求,这样依次反复,直到返回查询结果。

安装 bind 服务程序

BIND( Berkeley Internet Name Domain,伯克利因特网名称域)服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。

建议大家在生产环境中安装部署 bind 服务程序时加上 chroot(俗称牢笼机制)扩展包,以便有效地限制 bind 服务程序仅能对自身的配置文件进行操作,以确保整个服务器的安全。

yum install -y bind-chroot

设置配置

在 Linux 系统中, bind 服务程序的名称为 named。

  • 主配置文件( /etc/named.conf):用来定义 bind 服务程序的运行。

    可以看到其中包含了区域配置文件

    image-20210318175712020

    将listen-on 和 allow-query 设置为any,这样可以使任意机器使用bind服务

    image-20210318180003042

  • 区域配置文件( /etc/named.rfc1912.zones):用来保存域名和 IP 地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应 IP 地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。

    image-20210319111014233

    image-20210319111041821

  • 数据配置文件目录( /var/named):该目录用来保存域名和 IP 地址真实对应关系的数据配置文件。

named-checkconf 命令和 named-checkzone 命令,分别检查主配置文件与数据配置文件中语法或参数的错误。

正向解析实验

# 备份并修改/etc/named.rfc1912.zones cp -f /etc/named.rfc1912.zones /etc/named.rfc1912.zones.bak cat /etc/named.rfc1912.zones.bak | grep -v '//' | grep -v '^$' > /etc/named.rfc1912.zones # 修改 vim /etc/named.rfc1912.zones zone "linuxprobe.com" IN { type master; file "linuxprobe.com.zone"; allow-update {none;}; }; # 添加数据配置文件 cp -f /var/named/named.localhost /var/named/linuxprobe.com.zone vim linuxprobe.com.zone $TTL 1D @ IN SOA linuxprobe.com. root.linuxprobe.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS linuxprobe.com. # NS表示name server 需要一个主服务器 @ IN A 127.0.0.1 # A(address)记录表示该NS对应的ip ns IN A 10.6.2.158 mail IN A 10.6.2.158 www IN A 10.6.2.158 bbs IN A 10.6.2.158 # 校验 named-checkconf # 启动named systemctl start named systemctl enable named # 配置DNS vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 DNS1 = 10.6.2.158 # 打开DNS的53端口 firewall-cmd --permanent --zone=public --add-port=53/udp firewall-cmd --permanent --zone=public --add-port=53/tcp firewall-cmd --reload # 查看DNS映射 nslookup www.linuxprobe.com dig @10.6.2.158 www.linuxprobe.com

反向解析实验

# 修改/etc/named.rfc1912.zones vim /etc/named.rfc1912.zones zone "2.6.10.in-addr.arpa" IN { # 反向解析范围为10.6.2.*, 注意:需要反写 type master; file "10.6.2.arpa"; }; # 添加数据配置文件 cp -f /var/named/named.loopback /var/named/10.6.2.arpa vim /var/named/10.6.2.arpa $TTL 1D @ IN SOA linuxprobe.com. root.linuxprobe.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS ns.linuxprobe.com. ns IN A 10.6.2.158 158 IN PTR ns.linuxprobe.com. 158 IN PTR www.linuxprobe.com. 158 IN PTR bbs.linuxprobe.com. 159 IN PTR mail.linuxprobe.com. # 启动named systemctl start named # 查看DNS映射 nslookup 10.6.2.158 dig @10.6.2.158 www.linuxprobe.com

部署从服务器

修改配置,设置可被从服务器修改

zone "linuxprobe.com" IN { type master; file "linuxprobe.com.zone"; # 添加可被从服务器修改 allow-update {10.6.2.159;}; }; zone "2.6.10.in-addr.arpa" IN { type master; file "10.6.2.arpa"; allow-update {10.6.2.159;}; };

安装从服务器

# 在10.6.2.159上安装named yum install -y bind # 修改服务器配置 vim /etc/named.conf listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; #allow-query { localhost; }; allow-query { any; }; # 修改从服务器配置,将当前DNS服务器设置为从服务器 vim /etc/named.rfc1912.zones zone "linuxprobe.com" IN { type slave; masters {10.6.2.158;}; file "slaves/linuxprobe.com.zone"; }; zone "2.6.10.in-addr.arpa" IN { type slave; masters {10.6.2.158;}; file "slaves/10.6.2.arpa"; }; # 打开DNS的53端口 firewall-cmd --permanent --zone=public --add-port=53/udp firewall-cmd --permanent --zone=public --add-port=53/tcp firewall-cmd --reload # 启动从服务器,从服务器会从主服务器获取数据,在/var/named/下创建slaves目录和文件 systemctl restart named systemctl enable named

注意:从服务器只有主服务器的DNS映射关系,主服务器如果没有该映射关系,可以通过网关访问别的DNS服务器,但是从服务器如果没有映射关系,就不会通过别的dns服务器获取。所以主服务器可以dig www.baidu.com。但是从服务器获取不到。

加密传输

TSIG 加密机制保证了 DNS 服务器之间传输域名区域信息的安全性

主服务器生成密钥

dnssec-keygen [参数]

参数作用
-a 指定加密算法,包括 RSAMD5( RSA)、 RSASHA1、 DSA、 NSEC3RSASHA1、 NSEC3DSA 等
-b 密钥长度( HMAC-MD5 的密钥长度在 1~512 位之间)
-n 密钥的类型( HOST 表示与主机相关)
# 主服务器创建加密文件 dnssec-keygen -a HMAC-MD5 -b 128 -n HOST master-slave # 可以在当前目录下看到加密文件 ls -al Kmaster-slave.* cat Kmaster-slave.+157+24758.private Private-key-format: v1.3 Algorithm: 157 (HMAC_MD5) Key: BRpnKaXuIB97IiIuyDfDPw== Bits: AAA= Created: 20210322093557 Publish: 20210322093557 Activate: 20210322093557 # 在主服务器中创建密钥验证文件 cd /var/named/chroot/etc/ vim transfer.key key "master-slave" { algorithm hmac-md5; secret "BRpnKaXuIB97IiIuyDfDPw=="; }; chown root:named transfer.key chmod 640 transfer.key ln transfer.key /etc/transfer.key # 主服务器修改配置,添加第一行和最后一行 vim /etc/named.conf include "/etc/transfer.key"; options { //listen-on port 53 { 127.0.0.1; }; listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; //allow-query { localhost; }; allow-query { any; }; allow-transfer { key master-slave; }; # 从服务器 mkdir -p /var/named/chroot/etc cd /var/named/chroot/etc vim transfer.key key "master-slave" { algorithm hmac-md5; secret "BRpnKaXuIB97IiIuyDfDPw=="; }; chown root:named transfer.key chmod 640 transfer.key ln transfer.key /etc/transfer.key # 主服务器修改配置,添加第一行和最后一行 vim /etc/named.conf include "/etc/transfer.key"; server 10.6.2.158 { keys { master-slave; }; }; # 重启,可以看到slaves下有对应的文件生成 systemctl restart named

部署缓存服务器

DNS 缓存服务器一般用于经常访问某些固定站点而且对这些网站的访问速度有较高要求的企业内网中,但实际的应用并不广泛

分离解析技术

修改bind主配置文件

# 配置的 DNS 分离解析功能与 DNS 根服务器配置参数有冲突,所以需要把第 51~54 行的根域信息删除,否则会报出 /etc/named.conf:53: when using 'view' statements, all zones must be in views vim /etc/named.conf #zone "." IN { # type hint; # file "named.ca"; #}; # 修改域名服务配置文件,根据ip段来定义客户端名称,然后定义视图来确定哪个客户端访问哪个域名名称 vim /etc/named.rfc1912.zones acl "china" { 10.6.2.158/32; }; acl "american" { 10.6.2.159/32;}; view "china"{ match-clients { "china"; }; zone "linuxprobe.com" { type master; file "linuxprobe.com.china"; }; }; view "american" { match-clients { "american"; }; zone "linuxprobe.com" { type master; file "linuxprobe.com.american"; }; }; # 创建数据配置文件 cd /var/named vim linuxprobe.com.china $TTL 1D @ IN SOA linuxprobe.com. root.linuxprobe.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS linuxprobe.com. # NS表示name server 需要一个主服务器 @ IN A 127.0.0.1 # A(address)记录表示该NS对应的ip ns IN A 10.6.2.158 mail IN A 10.6.2.158 www IN A 10.6.2.158 bbs IN A 10.6.2.158 vim linuxprobe.com.america $TTL 1D @ IN SOA linuxprobe.com. root.linuxprobe.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS linuxprobe.com. # NS表示name server 需要一个主服务器 @ IN A 127.0.0.1 # A(address)记录表示该NS对应的ip ns IN A 10.6.2.158 mail IN A 10.6.2.159 www IN A 10.6.2.159 bbs IN A 10.6.2.159 # 重启服务 systemctl restart named # 修改当前的ip来进行测试

问题

  1. DNS 服务器之间传输区域数据文件时,使用的是递归查询还是迭代查询?
    答: DNS 服务器之间是迭代查询,用户与 DNS 服务器之间是递归查询。
  2. 当用户与 DNS 服务器之间传输数据配置文件时,是否可以使用 TSIG 加密机制来确保文件内容不被篡改?
    答: 不能, TSIG 加密机制保障的是 DNS 服务器与 DNS 服务器之间迭代查询的安全。

使用 DHCP 动态管理主机地址

动态主机配置协议( DHCP)是一种基于 UDP 协议且仅限于在局域网内部使用的网络协议,主要用于大型的局域网环境或者存在较多移动办公设备的局域网环境中,其主要用途是为局域网内部的设备或网络供应商自动分配 IP 地址等参数

安装

yum install -y dhcp systemctl start dhcpd systemctl enable dhcpd

配置

主配置文件是/etc/dhcp/dhcpd.conf,可以根据 /usr/share/doc/dhcp*/dhcpd.conf.example 来进行查看配置示例

需要使用仅主机模式,常用配置如下:

参数作用
ddns-update-style [类型] 定义 DNS 服务动态更新的类型,类型包括 none(不支 持动态更新)、 interim(互动更新模式)与 ad-hoc(特 殊更新模式)
[allow | ignore] client-updates 允许/忽略客户端更新 DNS 记录
default-lease-time [21600] 默认超时时间
max-lease-time [43200] 最大超时时间
option domain-name-servers [8.8.8.8] 定义 DNS 服务器地址
option domain-name ["domain.org"] 定义 DNS 域名
range 定义用于分配的 IP 地址池
option subnet-mask 定义客户端的子网掩码
option routers 定义客户端的网关地址
broadcase-address[广播地址] 定义客户端的广播地址
ntp-server[IP 地址] 定义客户端的网络时间服务器( NTP)
nis-servers[IP 地址] 定义客户端的 NIS 域服务器的地址
Hardware[网卡物理地址] 指定网卡接口的类型与 MAC 地址
server-name[主机名] 向 DHCP 客户端通知 DHCP 服务器的主机名
fixed-address[IP 地址] 将某个固定的 IP 地址分配给指定主机
time-offset[偏移误差] 指定客户端与格林尼治时间的偏移差
vim /etc/dhcp/dhcpd.conf ddns-update-style none; # 设置 DNS 服务不自动进行动态更新 ignore client-updates; # 忽略客户端更新 DNS 记录 subnet 192.168.10.0 netmask 255.255.255.0 { # 作用域为 192.168.10.0/24 网段 # IP 地址池为 192.168.10.100-200(约 100 个 IP 地址) range 192.168.10.100 192.168.10.200; option subnet-mask 255.255.255.0; # 定义客户端默认的子网掩码 option routers 192.168.10.1; # 定义客户端的网关地址 option domain-name "linuxprobe.com"; # 定义默认的搜索域 option domain-name-servers 192.168.10.1; # 定义客户端的 DNS 地址 default-lease-time 21600; # 定义默认租约时间(单位:秒) max-lease-time 43200; # 定义最大预约时间(单位:秒) }

测试

两台虚拟机使用仅主机模式,并关闭vmware的自带的dhcp服务,dhcp服务端使用ip 192.168.10.1。客户端使用BOOTSTYLE=dhcp设置网络即可

image-20210323144258703

dhcp服务器上设置网卡信息

image-20210323152331083

dhcp客户端设置网卡信息

image-20210323155803569

分配固定的ip

根据MAC地址给电脑分配固定的ip地址

# 在dhcpd.conf添加 vim /etc/dhcp/dhcpd.conf ddns-update-style none; # 设置 DNS 服务不自动进行动态更新 ignore client-updates; # 忽略客户端更新 DNS 记录 subnet 192.168.10.0 netmask 255.255.255.0 { # 作用域为 192.168.10.0/24 网段 # IP 地址池为 192.168.10.100-200(约 100 个 IP 地址) range 192.168.10.100 192.168.10.200; option subnet-mask 255.255.255.0; # 定义客户端默认的子网掩码 option routers 192.168.10.1; # 定义客户端的网关地址 option domain-name "linuxprobe.com"; # 定义默认的搜索域 option domain-name-servers 192.168.10.1; # 定义客户端的 DNS 地址 default-lease-time 21600; # 定义默认租约时间(单位:秒) max-lease-time 43200; # 定义最大预约时间(单位:秒) host linuxprobe { # 主机名,任意写,一般是客户端的主机名 hardware ethernet 00:0c:29:27:c6:12; # MAC地址 fixed-address 192.168.10.88; # 分配的ip } } # 服务器重启dhcp systemctl restart dhcpd # 客户端重启network systemctl restart network

使用 Postifx 与 Dovecot 部署邮件系统

使用基于SMTP 协议的 Postfix 服务程序提供发件服务功能,并使用基于 POP3、IMAP 协议的 Dovecot 服务程序提供收件服务功能

常见邮件协议:

  • 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件,占用服务器的 25/TCP 端口。
  • 邮局协议版本 3(Post Office Protocol 3,POP3):用于将电子邮件存储到本地主机,占用服务器的 110/TCP 端口。
  • Internet 消息访问协议版本 4(Internet Message Access Protocol 4,IMAP4):用于在本地主机上访问邮件,占用服务器的 143/TCP 端口。

image-20210324110340570

邮件投递代理( Mail Delivery Agent, MDA) :其工作职责是把来自于邮件传输代理( Mail Transfer Agent, MTA)的邮件保存到本地的收件箱中 。

MTA 的工作职责是转发处理不同电子邮件服务供应商之间的邮件

为用户收发邮件的服务器名为邮件用户代理( Mail User Agent,MUA)

配置DNS

# 服务器主机名称需要和发信域名一致 vim /etc/hostname mail.linuxprobe.com # 打开防火墙 firewall-cmd --permanent --zone=public --add-port=25/tcp firewall-cmd --permanent --zone=public --add-port=110/tcp firewall-cmd --permanent --zone=public --add-port=143/tcp firewall-cmd --reload # 修改/var/named/linuxprobe.com.zone,添加MX(邮件)记录,10表示优先级 @ IN SOA linuxprobe.com. root.linuxprobe.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS linuxprobe.com. @ IN A 192.168.10.1 ns IN A 192.168.10.1 @ IN MX 10 192.168.10.1 mail IN A 192.168.10.1 www IN A 192.168.10.1 bbs IN A 192.168.10.1

配置 Postfix 服务程序

用于发送邮件

常用postfix配置

参数作用
myhostname 邮局系统的主机名
mydomain 邮局系统的域名
myorigin 从本机发出邮件的域名名称
inet_interfaces 监听的网卡接口
mydestination 可接收邮件的主机名或域名
mynetworks 设置可转发哪些主机的邮件
relay_domains 设置可转发哪些网域的邮件
# 安装postfix yum install -y postfix # 配置postfix主配置文件 vim /etc/postfix/main.cf myhostname = mail.linuxprobe.com mydomain = linuxprobe.com myorigin = $mydomain inet_interfaces = all mydestination = $myhostname , $mydomain # 创建电子邮件系统的登录账户 useradd boss echo '987654321`' | passwd --stdin boss # 启动postfix systemctl restart postfix systemctl enable postfix

配置 Dovecot 服务程序

收件服务程序,为 Linux 系统提供 IMAP 和 POP3 电子邮件服务的开源服务程序

# 安装Dovecot yum install -y dovecot # 修改Dovecot的主配置文件 vim /etc/dovecot/dovecot.conf # 支持的协议 24 protocols = imap pop3 lmtp # 允许明文密码登录 25 disable_plaintext_auth = no # 设置可以使用邮件服务的网段 48 login_trusted_networks = 192.168.10.0/24 # 配置不使用ssl登录 vi /etc/dovecot/conf.d/10-ssl.conf 8 ssl = no # 配置邮件格式与存储路径,放开25行注释 vim /etc/dovecot/conf.d/10-mail.conf 25 mail_location = mbox:~/mail:INBOX=/var/mail/%u # 使用创建postfix时使用的账户创建目录,需要用谁账号登录就需要在该家目录创建目录 su - boss mkdir -p mail/.imap/INBOX systemctl start dovecot systemctl enable dovecot

使用Foxmail连接服务器

image-20210324140303079

写一封邮件

image-20210324141422943

可以在邮件服务器上看到,使用mail命令可以看到当前登录用户的邮件:

image-20210324141450525

设置用户别名信箱

通过设置别名来隐藏邮箱地址

# 配置用户别名,冒号前是用户的别名,冒号后是接受邮件的真是用户 cat /etc/aliases bin: root daemon: root adm: root lp: root # 添加一个别名 vim /etc/aliases xxoo: root # 重启别名服务 newaliases

使用 Squid 部署代理缓存服务

正向代理:让用户使用 Squid 代理服务器上网,还可以基于指定的 IP 地址、域名关键词、网站地址或下载文件后缀等信息,实现类似于访问控制列表的功能。

反向代理:反向代理模式可以大幅提升网站的访问速度,还可以帮助网站服务器减轻负载压力。

总结来说,正向代理模式一般用于企业局域网之中,让企业用户统一地通过 Squid 服务访问互联网资源,这样不仅可以在一定程度上减少公网带宽的开销,而且还能对用户访问的网站内容进行监管限制,一旦内网用户访问的网站内容与禁止规则相匹配,就会自动屏蔽网站。反向代理模式一般是为大中型网站提供缓存服务的,它把网站中的静态资源保存在国内多个节点机房中,当有用户发起静态资源的访问请求时,可以就近为用户分配节点并传输资源,因此在大中型网站中得到了普遍应用。

正向代理和反向代理的区别

image-20210324174555526image-20210324174657980

  1. 网段:正向代理Proxy和Client在一个网段,感知到使用了代理,反向代理Proxy和Server一个网段,且Client不知道使用了代理。
  2. 配置:正向代理需要配置Client的代理服务器为Proxy,反向代理不用。
  3. 功能:正向代理主要用于管理Client的访问控制,反向代理主要用于降低负载,提升访问速度。

添加两块网卡

给虚拟机A添加一个仅主机模式的网卡(192.168.10.180),同时添加一个桥接模式网卡(10.6.2.131)

给虚拟机B添加一个仅主机模式的网卡(192.168.10.183)

注意:如果桥接模式网卡ping不通主机,可能是ip被占用了。

如果仅主机模式ping不通Vmnet1虚拟网卡,可以将其禁用后启用。

这样我们就得到一台可以访问外网也能访问虚拟机B的虚拟机A了。

配置 Squid 服务程序

yum install -y squid # 查看主配置文件 cat /etc/squid/squid.conf acl SSL_ports port 443 acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager http_access allow localnet http_access allow localhost http_access deny all http_port 3128 coredump_dir /var/spool/squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320

常用的 Squid 服务程序配置参数以及作用

参数作用
http_port 3128 监听的端口号
cache_mem 64M 内存缓冲区的大小
cache_dir ufs /var/spool/squid 2000 16 256 硬盘缓冲区的大小
cache_effective_user squid 设置缓存的有效用户
cache_effective_group squid 设置缓存的有效用户组
dns_nameservers [IP 地址] 一般不设置,而是用服务器默认的 DNS 地址
cache_access_log /var/log/squid/access.log 访问日志文件的保存路径
cache_log /var/log/squid/cache.log 缓存日志文件的保存路径
visible_hostname linuxprobe.com 设置 Squid 服务器的名称

默认的/etc/squid/squid.conf的配置如下

image-20210326142015766

其中使用acl 用于定义src,port,method 变量。http_access用户定义是否允许通过。

正向代理

标准正向代理

  1. 将网卡Vmnet1禁用,这样我们的主机就无法通过192.168.10网段来访问虚拟机了。主机仍然可以通过10.6.2.131进行访问,且192.168.10.180和183两台机器是可以相互ping通的。

    image-20210326111036250

  2. 在虚拟机B中启动httpd服务,同时使用虚拟机进行访问

    image-20210326111150909

  3. 打开虚拟机防火墙

    firewall-cmd --permanent --zone=public --add-port=3128/tcp firewall-cmd --reload
  4. 设置浏览器代理

    image-20210326111524132

    使用代理后可正常访问192.168.10.183

ACL控制访问

  • 只允许某些机器使用Squid代理,禁止其他机器使用代理

    vim /etc/squid/squid.conf acl client src 192.168.10.20 # 定义client,src为客户机ip,port是访问网站端口 http_access allow client # http_access用于控制是否允许 http_access deny all # 拒绝所有其他请求
  • 禁止所有客户端访问网址中包含linux关键词的网站

    vim /etc/squid/squid.conf acl deny_keyword url_regex -i taobao # 定义deny_keyword匹配linux acl deny_keyword url_regex -i jd # 定义deny_keyword匹配linux http_access deny deny_keyword # 拒绝访问deny_keyword
  • 禁止所有客户端访问某个特定的网站

    acl deny_url url_regex http://www.linuxcool.com # 定义deny_url http_access deny deny_url # 拒绝访问deny_url
  • 禁止员工在企业网内部下载带有某些后缀的文件

    acl badfile urlpath_regex -i \.rar$ \.avi$ http_access deny badfile

透明正向代理(未成功)

在透明代理模式中,用户无须在浏览器或其他软件中配置代理服务器地址、端口号等信息,而是由 DHCP 服务器将网络配置信息分配给客户端主机。

# 开启 NAT 转发 firewall-cmd --permanent --zone=public --add-masquerade # 开放 DNS 使用的 53 端口,UDP firewall-cmd --zone=public --add-port=53/tcp --permanent firewall-cmd --zone=public --add-port=53/udp --permanent # 开放 squid 使用的 3128 端口 firewall-cmd --zone=public --add-port=3128/tcp --permanent firewall-cmd --zone=public --add-port=3128/udp --permanent # 检查是否允许 NAT 转发 firewall-cmd --query-masquerade # 将通过80端口的流量转到桥接网卡的ip和端口 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=10.6.2.131:toport=3128 --permanent # firewall-cmd --reload iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 –o eno33554968 -j SNAT --to 10.6.2.131

反向代理

通过访问squid 服务器就可以访问指定的服务器。注意:正向代理和反向代理不可同时使用

vim /etc/squid/squid.conf http_port 10.6.2.131:80 accel # 当前的squid使用的ip和端口 cache_peer 192.168.10.183 parent 80 0 originserver # 目标ip和端口

image-20210326173358027

这样我们访问10.6.2.131的网页会反向代理到192.168.10.183上的httpd服务。

使用 iSCSI 服务部署网络存储(未看)

使用 MariaDB 数据库管理系统(未看)

使用 PXE+Kickstart 无人值守安装服务(未看)

使用 LNMP 架构部署动态网站环境(未看)

命令附录:

命令解释
man [命令] 命令的帮助文档
echo xxx 输出xxx
echo $xxx 输出xxx的变量值
date 输出当前系统时间
date -s "yyyymmdd HH:MM:SS" 设置当前系统时间
date "+%Y-%m-%D %H:%M:%S" 根据格式输出当前系统时间
reboot 关机,默认root用户可用
poweroff 关机,默认root用户可用
wget [url] 下载url的东西
ps -aux 输出系统所有进程信息
top 进程管理器
pidof [服务名] 输出服务对应的进程id
kill [pid] 杀死该pid的进程
killall [服务名] 杀死所有该服务的进程
& 添加在命令后,表示后台运行该命令
ifconfig 查看网卡信息,ip地址等
uname 查看系统内核
uname -a 查看系统内核详细信息
cat /etc/redhat-release 查看当前系统版本的详细信息
uptime 查看系统负载
free 查看系统内存空闲
who 当前登录信息
last 所有的登录信息
history 所有的系统操作
sosreport 生成sosreport文件,供技术支持人员查看系统问题
pwd 当前目录位置
cat 查看短文件内容
more 查看长文件内容
head-n 行数 文件名 查看文件开头
tail -n 行数 文件名 查看文件结尾
tr 原字符 现字符 替换字符
wc -[lwc] 文件名 查看文件的行数,单词数,字符数
stat 查看文件的存储信息
cut -[df] 文件名 根据字符分割后查看第几列
diff 比较文件
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

问题解答

bash命令乱码

  • 查看/etc/locale.conf,修改为

    LANG="en_US.UTF-8"
  • 查看当前语言

    echo $LANG
  • 更新配置:source /etc/locale.conf

ifconfig command not found

  • 查找ifconfig

    find / -name ifconfig
  • 安装net-tools

    yum install -y net-tools

新机器没有网络

配置网络

# 以太网网络类型:Ethernet,Static TYPE=Ethernet # 启动协议,none 引导时不使用协议,static 静态分配地址, bootp使用BOOTP协议,DCHP使用区域为内自动分配IP的服务 BOOTPROTO=static # 网卡名称 NAME=eno16777736 # 是否启动 ONBOOT=yes # ip地址 IPADDR=10.6.2.128 # 子网掩码 NETMASK=255.255.255.0 # 网关 GATEWAY=10.6.2.1 # DNS1 DNS1=114.114.114.114

如果是虚拟机需要保证子网掩码和网关和虚拟机一致:

image-20210201111916628

外网访问限制

防火墙

  • 端口配置

  • 服务配置

SELinux

  • 域限制
  • 文件上下文限制

DNS记录类型

  • A记录
  • AAAA记录
  • NS记录
  • CNAME记录
  • PTR记录

虚拟机模式

  • 仅主机模式

    使用VMnet0网卡,仅和主机通信。

  • NAT模式

    类似于SNAT技术,通过使用主机的ip进行访问互联网。

  • 桥接模式

    占用主机局域网ip,要和主机在同一个网段中。

  •  
posted @ 2022-11-01 09:46  dirgo  阅读(33)  评论(0编辑  收藏  举报