linux-RHEL7.0 —— 《Linux就该这么学》阅读笔记
- linux-RHEL7.0
- 安装部署
- linux命令
- 管道符、重定向与环境变量
- 用户身份和文件权限
- 存储结构和磁盘划分
- 使用RAID和LVM磁盘阵列技术
- iptables和firewalld防火墙
- 使用ssh服务管理远程主机
- 使用Apache服务部署静态网站
- 使用vsftpd服务传输文件
- 使用 Samba 或 NFS 实现文件共享
- 使用bind提供域名解析服务
- 使用 DHCP 动态管理主机地址
- 使用 Postifx 与 Dovecot 部署邮件系统
- 使用 Squid 部署代理缓存服务
- 使用 iSCSI 服务部署网络存储(未看)
- 使用 MariaDB 数据库管理系统(未看)
- 使用 PXE+Kickstart 无人值守安装服务(未看)
- 使用 LNMP 架构部署动态网站环境(未看)
- 命令附录:
- 问题解答
linux-RHEL7.0
安装部署
修改root密码
在开机阶段按e,在linux16后追加rd.break
,按Ctrl+X来运行修改过的内核程序。
进入紧急救援模式后,以此输入以下命令:
mount -o remount,rw /sysroot
chroot /sysroot
passwd
【新密码】
【确认密码】
touch /.autorelabel
exit
reboot
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 软件包组 | 查询指定的软件包组信息 |
因为redhat中yum需要注册,所以需要使用iso镜像或者重新安装yum
,并替换掉yum源。
# 查看系统中有什么yum源
yum repolist
# 创建yum缓存
yum makecache
使用iso镜像注册yum
将虚拟机的光盘设备指向ISO镜像
挂载该设备
mkdir -p /media/cdromm
mount /dev/cdrom /media/cdrom
使用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命令。
systemctl命令管理systemd的资源Unit,systemd的资源单元放在了
/usr/lib/systemd/system
下systemd的资源单元有四种:mount,service,target和wants
mount
相当于执行了挂载
mount -t hugetlbfs /dev/hugepages hugetlbfs
service
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
- 第一行是描述
- 第二行表示是否开机自启,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获得的数据内容如下:
对应的列所代表的信息:
USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
---|---|---|---|---|---|---|---|---|---|---|
进程的所有者 | 进程ID号 | 运算器占用率 | 内存 占用率 | 虚拟内存使用量(单位是KB) | 占用的固 定内存量(单位是 KB) | 所在终端 | 进程状态 | 被启动的时间 | 实际使用CPU的时间 | 命令名称与参数 |
其中进程的状态总共有五种情况:
- R(运行): 进程正在运行或在运行队列中等待。
- S(中断): 进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
- D(不可中断): 进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
- Z(僵死): 进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数后将进程释放。
- T(停止): 进程收到停止信号后停止运行。
top
top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。完全将它看作 Linux 中的“强化版的
Windows 任务管理器”。
前 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 [网络设备] [参数]”。
uname
uname 命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。
查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。
查看当前系统版本的详细信息
# cat /etc/redhat-release
uptime
uptime 用于查看系统的负载信息,格式为 uptime。
显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。平均负载值指的是系统在最近 1 分钟、 5 分钟、 15 分钟内
的压力情况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过 1,在生产环境中不要超过 5
。
free
free 用于显示当前系统中内存的使用量信息,格式为“free [-h]”。 -h表示转换为带单位显示。
其中各行表示的项为:
mem:表示物理内存统计
buff/cache:表示物理内存的缓存统计
swap:表示硬盘上交换分区的使用情况
各列表示的项为:
内存总量 | 已用量 | 可用量 | 进程共享的 内存量 | 磁盘缓存的 内存量 | 缓存的 内存量 |
---|---|---|---|---|---|
total | used | free | shared | buffers | cached |
who
who 用于查看当前登入主机的用户终端信息,格式为“who [参数]”。
各列表示:
登录的用户名 | 终端设备 | 登录到系统的时间 |
---|---|---|
root | tty1 | 2021-01-26 01:37 |
last
last 命令用于查看所有系统的登录记录,格式为“last [参数]”
该信息是以日志文件保存的,可以很容易的进行修改。
history
history 命令用于显示历史执行过的命令,格式为“history [-c]”。
如果
使用-c
参数则会清空所有的命令历史记录
。
执行 history 命令能显示出当前用户在本地计算机中执行过的最近 1000 条命令记录。如果觉得 1000 不够用,还可以自定义/etc/profile
文件中的HISTSIZE
变量值。还可以使用“!编码数字”
的方式来重复执行某一次的命令
历史命令会保存到~/.bash_history
文件中
sosreport
sosreport 命令用于收集系统配置及架构信息并输出诊断文档,格式为 sosreport。
将文件和摘要发送给技术支持人员。
总结
什么是操作系统?
答:计算机硬件是由运算器、控制器、存储器、输入/输出设备等共同组成的,而让各种硬件设备各司其职且又能协同运行的东西就是系统内核
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
head 命令用于查看纯文本文档的前 N 行,格式为“head [选项] [文件]”
tail
tail 命令用于查看纯文本文档的后 N 行或持续刷新内容,格式为“tail [选项] [文件]”
# 查看文件行数
tail -n [行数] [文件]
# 滚动查看文件结尾
tail -[行数]f [文件]
tr
tr 命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”
wc
wc 命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。
参数 | 作用 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
stat
stat 命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。
cut
cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。
参数 | 作用 |
---|---|
-d | 设置参数 |
-f | 想要显示的列数 |
diff
diff 命令用于比较多个文本文件的差异,格式为“diff [参数] 文件 文件”。
参数 | 作用 |
---|---|
-y | 以并列的方式显示文件的异同之处 |
-w | 忽略全部的空格字符 |
-W<宽度> | -W<宽度>或--width<宽度> 在使用-y参数时,指定栏宽 |
文件目录管理命令
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 文件名”。
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输入时会停止。
输出重定向使用的较多,
标准输入重定向( 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]这样的方式仅匹配这三个指定数字中的一个
常用转义符
- 反斜杠( \):使反斜杠后面的一个变量变为单纯的字符串。
echo \$
$
- 单引号(''):转义其中所有的变量为单纯的字符串。
echo '$PROD'
$PROD
- 双引号( ""):保留其中的变量属性,不进行转义处理。
PROD=5
echo "$PROD"
5
- 反引号( ``):把其中的命令执行后返回结果。
echo `ls -l`
命令别名
可以给命令添加别名
# 添加别名
alias la='ls -al'
# 取消别名
unalias la
环境变量
Linux系统中的环境变量是用来定义系统运行环境的一些参数,使用env可以查看所有的环境变量。
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的 Shell 解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash 解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
默认创建的变量不具有全局性,不能被其他用户使用。需要使用export将其提升为全局变量。
export prod
Vim和Shell命令脚本
Vim
vim包含三种模式,是一个默认安装在linux系统中的文本编辑器。
- 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
- 输入模式:正常的文本录入。
- 末行模式:保存或退出文档,以及设置编辑环境
切换到输入模式
命令 | 作用 |
---|---|
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中的配置一致。
一块网卡添加多个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进行修改
配置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硬件
编写Shell脚本
基础知识
查看当前SHELL默认解释器
echo $SHELL
/bin/bash
shell脚本第一行需要指定解释器:
#!/bin/bash
脚本如果没有执行权限,可以指定权限,也可以使用bash直接执行:
bash example.sh
# 添加权限
chmod u+x example.sh
接收用户的参数
在shell脚本中可以使用
$
+数字与符号
来获取参数
命令 | 解释 |
---|---|
$* | 所有的参数,以"$1 \(2 ...\)n" 的形式输出所有参数 |
$@ | 所有的参数列表,以"$1" "\(2" … "\)n" 的形式输出所有参数 |
$? | 上一条命令执行的结果状态,0表示执行成功,其他表示执行失败,成功表示命令执行后没有错误,例如ping 10.6.2.2不通,但是该命令执行成功,但是$?是1。成功和失败是以结果判断 |
$0 | shell脚本名称 |
\(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"列表
判断用户的参数
格式:[ 条件表达式 ],左右各有一个空格
文件测试所用的参数
运算符 作用 -d 测试文件是否为目录类型 -e 测试文件是否存在 -f 判断是否为一般文件 -r 测试当前用户是否有权限读取 -w 测试当前用户是否有权限写入 -x 测试当前用户是否有权限执行 [ -d /usr/local/temp/example.sh ]
echo $?
输出不是0,表示/usr/local/temp/example.sh不是一个目录
与、或、非
使用与和或来表示是否继续运行后面的命令
运算符 作用 && 如果测试条件为0,那么会继续执行 || 如果测试条件不为0,那么会继续执行 ! 将测试条件的结果取反 数字比较符
运算符 作用 -eq 是否等于 -ne 是否不等于 -gt 是否大于 -lt 是否小于 -le 是否等于或小于 -ge 是否大于或等于 用于测试命令中进行数字比较:
字符比较符
运算符 作用 = 比较字符串内容是否相同 != 比较字符串内容是否不同 -z 判断字符串内容是否为空 在测试命令中,环境变量如果不存在会报错
流程控制语句
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可以查看文件的权限:
其中第一位表示文件类型,3位表示所有者权限,3位表示文件所属组权限,3位表示其他用户权限,权限可以使用3位添加之和表示,例如上图可以表示为:rw-r--r--可以表示为644。
接着的第一个root表示文件所属用户,第二个root表示文件所属用户组。
4表示文件大小,Feb 7 11:49表示文件最后一次修改时间,log表示文件名。
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 是一种对二进制程序进行设置的特殊权限, 可以让二进制程序的执行者临时拥有属主的权限
- 只有可执行二进制程序才能设置SGID权限
- 命令执行者要对该程序拥有执行(x)权限
- 命令执行者在执行程序的时候,组身份升级为该可执行程序文件的属组
- SGID权限只在该程序执行过程中有效,也就是组身份只在程序执行过程中发生改变,命令结束用户组身份恢复.
可以通过以下命令将可执行可执行文件的执行者临时拥有拥有者的权限
chmod u+s xxx
例如:/bin/passwd命令就是
如果当前用户没有x执行权限,那么就会是S
当普通用户执行/bin/passwd命令时,会操作/etc/shadow文件,但是该文件的权限是000,只有root用户有权限操作,那么当普通用户执行/bin/passwd,由于有s权限,那么就表示当前用户会在执行过程中临时拥有文件拥有者root的权限。
SGID(group)
SGID和SUID类似,不过是执行者临时拥有文件所属组的权限,而不是所属人的权限。
chmod g+s xxx
权限代码:-rwxrws
---,如果用户组没有x权限,那么为S
。
同时SGID还可以用在目录上,这样的目录的子文件会继承源目录的所属组。
在temp目录创建text.txt,可以看到文件所属组是root
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
可以看到没有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
习题
使用访问控制列表( ACL)来限制 linuxprobe 用户组,使得该组中的所有成员不得在/tmp目录中写入内容。
答: 想要设置用户组的 ACL,则需要把 u 改成 g,即 setfacl -Rm g:linuxprobe:r-x /tmp。
查看系统日志
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 |
“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为 5 的逻辑分区的设备文件”
硬盘分区原理:
硬盘设备是由大量的扇区组成的,每个扇区的容量为 512 字节。 第一个扇区保存着主引导记录与分区表信息。第一个扇区由 主引导记录需要占用 446 字节,分区表为 64 字节,结束符占用 2 字节所组成。其中分区表中每记录一个分区信息就需要 16 字节,这样一来最多只有 4 个分区信息可以写到第一个扇区中,这 4 个分区就是 4 个主分区。如果需要大于4个分区,那么就会将一个分区作为扩展分区,扩展分区可以创建多个逻辑分区
,这样就可以由多个分区了。
注意:逻辑分区从5开始。
可以看出/dev/sdb8的意思就是,序号为2的硬盘的第四个逻辑分区。
文件系统与数据资料
文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。 Linux系统支持数十种的文件系统,而最常见的文件系统如下
- Ext3: 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。
- ext4: Ext3 的改进版本,作为 RHEL 6 系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外, Ext4 文件系统能够批量分配 block 块,从而极大地提高了读写效率。
- xfs: 是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB。
存储原理:
日常在硬盘需要保存的数据实在太多了, 因此 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,则可对多块硬盘进行自检优先级设置 |
如果想将文件系统为 ext4 的硬件设备/dev/sdb2 在开机后自动挂载到/backup 目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab 文件中写入下面的信息
/dev/sdb2 /backup ext4 defaults 0 0
umount
卸载文件系统就意味不再使用硬件的设备资源,因此卸载操作只需要说明想要取消关联的设备文件或挂载目录的其中一项即可。
umount /dev/sdb2
如果当前操作目录就在这个目录,那么会导致出现target is busy
,退出这个目录即可
添加硬盘设备
通过虚拟机添加一个新的硬盘
可以看到/dev下有一块新硬盘sdb。
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
使用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
将挂载信息写到/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/
添加交换分区
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
可以看到在创建8M的文件时被阻止了。
edquota
edquota 命令用于编辑用户的 quota 配额限制,格式为“edquota [参数] [用户] ”。
参数 | 解释 |
---|---|
-u | 要针对哪个用户进行设置 |
-g | 要针对哪个用户组进行设置 |
使用root用户修改quota
edquota -u tom
# 修改hard 6144 -> 10240
测试:
dd if=/dev/zero of=/boot/tom bs=8M count=1
软硬方式链接
可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效
硬链接:
可以将它理解为一个“指向原始文件 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
可以看出硬链接会是硬盘中的连接数增加,软链接如果删除了原文件,那么该链接无法访问。
使用RAID和LVM磁盘阵列技术
RAID(独立冗余磁盘阵列)
RAID0
RAID 0 技术把多块物理硬盘设备(至少两块)通过硬件或软件的方式串联在一起,组成一个大的卷组,类似于扩容
RAID1
它是把两块以上的硬盘设备进行绑定,在写入数据时,是将数据同时写入到多块硬盘设备上,类似于主从
RAID5
RAID5 技术是把硬盘设备的数据奇偶校验信息保存到其他硬盘设备中。 RAID 5 技术实际上没有备份硬盘中的真实数据信息,而是当硬盘设备出现问题后通过奇偶校验信息来尝试重建损坏的数据。parity 部分存放的就是数据的奇偶校验信息
RAID10
RAID 10 技术是 RAID 1+RAID 0 技术的一个“组合体”,类似于扩容+主从。
创建RAID
添加硬盘
添加4块5G的虚拟硬盘
# 查看linux中设备
ll /dev/ | grep sd
创建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
格式化与挂载
# 使用ext4文件系统处理该磁盘矩阵
mkfs.ext4 /dev/md0
# 挂载
mkdir /RAID
mount /dev/md0 /RAID
可以看到md0的容量为10G,同时需要把挂载信息写到/etc/fstab中
echo "/dev/md0 /RAID ext4 defaults 0 0" >> /etc/fstab
损坏与修复
# 模拟设备损坏
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
删除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(逻辑卷管理器)
解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。
比如小明家里想吃馒头但是面粉不够了,于是妈妈从隔壁老王家、老李家、老张家分别借来一些面粉,准备蒸馒头吃。首先需要把这些面粉(物理卷[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
、
配置方法:
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-
文件
# 查看所有会话
nmcli c show
# 使用home会话
nmcli c up home
切换到了home会话,使用的就是ifcfg-home配置文件。
绑定两块网卡
借助于网卡绑定技术,不仅可以提高网络传输速度,更重要的是,还可以确保在其中一块网卡出现故障时,依然可以正常提供网络服务。
添加另一块网卡
两块网卡使用同样的模式
设置网卡信息
# 查看新添加的网卡信息
ip addr
可以看到新添加了一个网卡,需要注意的是,这些原本独立的网卡设备此时需要被配置成为一块“从属”网卡,服务于“主”网卡,不应该再有自己的 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 地址等信息
查看信息
cat /proc/net/bonding/bond0
测试网卡切换
可以看出当前激活从网卡变成了eno16777736
远程控制服务
配置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客户端工具也可以使用密钥登录,那么需要指定私钥
远程传输命令 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看到上传的文件
不间断会话服务
screen 是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。
使用screen执行命令后,并不会因为ssh服务中断而结束命令。
# 安装
yum install -y screen
管理远程会话
# 创建一个窗口,指定名称
screen -S backup
# 退出窗口
exit
然后在screen窗口中执行的命令,尽管关闭了ssh窗口,该命令仍然在后台执行。
# 查看当前已存在的窗口
screen -ls
# 恢复指定的窗口
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拒绝了。将其临时关闭,即可访问。
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
其中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
对程序端口的限制
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
添加口令功能
# 创建用户名,密码文件
htpasswd -c /etc/httpd/passwd linuxprobe
输入密码 123456
再次输入 123456
# 编辑个人主页配置文件
vim /etc/httpd/conf.d/userdir.conf
# 重启服务
systemctl restart httpd
再次访问个人主页就需要用户名密码了,linuxprobe/123456
虚拟主机功能
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进行修改
设置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服务器
创建vuser.list文件作为用户名和密码,奇数行为用户名,偶数行为密码
vim /etc/vsftpd/vuser.list
zhangsan
redhat
lisi
redhat
使用
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
修改指定虚拟用户
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
创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。
# 添加用户 virtual,nologin使其不可登录
useradd -d /var/ftproot -s /sbin/nologin virtual
# 查看该目录
ls -d /var/ftproot
# 修改权限
chmod -Rf 755 /var/ftproot/
建立用于支持虚拟用户的 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
在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证文件的名称修改为 vsftpd.vu
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.vu
为虚拟用户设置不同的权限,使用匿名方式设置,其中张三
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 | 退出 |
下载的文件会放到用户的家目录下。
使用 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
创建用于访问共享资源的账户信息。
pdbedit 命令用于管理 SMB 服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。
注意:Samba 服务程序的数据库要求账户必须在当前系统中已经存在。
参数 作用 -a 用户名 建立 Samba 账户 -x 用户名 删除 Samba 账户 -L 列出账户列表 -Lv 列出账户详细信息的列表 # 检查当前机器是否已有用户
id dingli
# 创建samba用户,密码设置为987654321`
pdbedit -a -u dingli
修改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
创建目录,修改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
重启
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服务。
在输入用户名密码后即可访问。
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 服务程序的运行。
可以看到其中包含了区域配置文件
将listen-on 和 allow-query 设置为any,这样可以使任意机器使用bind服务
区域配置文件( /etc/named.rfc1912.zones):用来保存域名和 IP 地址对应关系的所在位置。类似于图书的目录,对应着每个域和相应 IP 地址所在的具体位置,当需要查看或修改时,可根据这个位置找到相关文件。
数据配置文件目录( /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来进行测试
问题
- DNS 服务器之间传输区域数据文件时,使用的是递归查询还是迭代查询?
答:DNS 服务器之间是迭代查询,用户与 DNS 服务器之间是递归查询。
- 当用户与 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设置网络即可
dhcp服务器上设置网卡信息
dhcp客户端设置网卡信息
分配固定的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 端口。
邮件投递代理( 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连接服务器
写一封邮件
可以在邮件服务器上看到,使用mail命令可以看到当前登录用户的邮件:
设置用户别名信箱
通过设置别名来隐藏邮箱地址
# 配置用户别名,冒号前是用户的别名,冒号后是接受邮件的真是用户
cat /etc/aliases
bin: root
daemon: root
adm: root
lp: root
# 添加一个别名
vim /etc/aliases
xxoo: root
# 重启别名服务
newaliases
使用 Squid 部署代理缓存服务
正向代理:让用户使用 Squid 代理服务器上网,还可以基于指定的 IP 地址、域名关键词、网站地址或下载文件后缀等信息,实现类似于访问控制列表的功能。
反向代理:反向代理模式可以大幅提升网站的访问速度,还可以帮助网站服务器减轻负载压力。
总结来说,正向代理模式一般用于企业局域网之中,让企业用户统一地通过 Squid 服务访问互联网资源,这样不仅可以在一定程度上减少公网带宽的开销,而且还能对用户访问的网站内容进行监管限制,一旦内网用户访问的网站内容与禁止规则相匹配,就会自动屏蔽网站。反向代理模式一般是为大中型网站提供缓存服务的,它把网站中的静态资源保存在国内多个节点机房中,当有用户发起静态资源的访问请求时,可以就近为用户分配节点并传输资源,因此在大中型网站中得到了普遍应用。
正向代理和反向代理的区别
- 网段:正向代理Proxy和Client在一个网段,感知到使用了代理,反向代理Proxy和Server一个网段,且Client不知道使用了代理。
- 配置:正向代理需要配置Client的代理服务器为Proxy,反向代理不用。
- 功能:正向代理主要用于管理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的配置如下
其中使用acl 用于定义src,port,method 变量。http_access用户定义是否允许通过。
正向代理
标准正向代理
将网卡Vmnet1禁用,这样我们的主机就无法通过192.168.10网段来访问虚拟机了。主机仍然可以通过10.6.2.131进行访问,且192.168.10.180和183两台机器是可以相互ping通的。
在虚拟机B中启动httpd服务,同时使用虚拟机进行访问
打开虚拟机防火墙
firewall-cmd --permanent --zone=public --add-port=3128/tcp
firewall-cmd --reload
设置浏览器代理
使用代理后可正常访问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和端口
这样我们访问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
如果是虚拟机需要保证子网掩码和网关和虚拟机一致:
外网访问限制
防火墙
端口配置
服务配置
SELinux
- 域限制
- 文件上下文限制
DNS记录类型
- A记录
- AAAA记录
- NS记录
- CNAME记录
- PTR记录
虚拟机模式
仅主机模式
使用VMnet0网卡,仅和主机通信。
NAT模式
类似于SNAT技术,通过使用主机的ip进行访问互联网。
桥接模式
占用主机局域网ip,要和主机在同一个网段中。
linux-RHEL7.0 —— 《Linux就该这么学》阅读笔记的更多相关文章
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 四 档案的文件系统的压缩和打包
1.压缩文件案的用途与技术 a.用途,简单来说,就是节约磁盘空间.如果从传输角度讲,占用宽带也会小很多(Apache就有自动压缩的功能,节省宽带资源,提升网站的输出能力) b.压缩技术 ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 三 Linux磁盘与文件系统管理
一.认识EXT2文件系统: a.硬盘的组成:转动小马达+存储的磁盘+读写的机械臂 b.磁盘的一些概念 扇区为最小的物理储存单位,每个扇区为512B ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 二
Linux档案与目录管理 1.一些比较特殊的目录,需要用力的记下来 . 代表当前层目录 .. 代表上一层目录 - 代表前一个工作目录 (这个好屌!其他的 ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 一
1. Linux的档案权限与目录配置 一.基础知识: a.分为三类,拥有者(owner).群组(group).其他人(other) b.三个核 ...
- Mysql 5.5从零开始学阅读笔记
第一章 1.什么是数据库? 数据库包含两层含义:保管数据的“仓库”,以及数据管理的方法和技术. 2.表 行被称为记录,列被称为字段 3.主键 primary key,用于唯一标识表中的每一条记录,主键 ...
- Unix/Linux环境C编程入门教程(19)Red Hat Entetprise Linux 7.0环境搭建
位架构,包括英特尔X-86_64.Power和s390.动态定时能力将降低内核内部中断数量,Open vSwitch 2.0功能可调节虚拟机之间的流量.RHEL 7中默认的文件系统是XFS,包含了一个 ...
- Linux rhel7 下MySQL5.7.18详细安装文档
Linux rhel7 下MySQL5.7.18详细安装文档 本文安装MySQL5.7使用的是vm虚拟机rhel7操作系统 ,ftp文件传输是FileZilla3.27,远程连接xssh5.0 1 登 ...
- Kali Linux 2.0配置并安装常用的工具
Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Linux 发行版,包含很多安全和取证方面的相关工具. Kali Linux 2.0是基于Debian ...
- Red Hat 9.0 Linux 分辨率修改
Red Hat 9.0 Linux 分辨率修改 我是在VMware Workstation中装了一个红帽的Linux系统,装上之后发现分辨率有点低,是800x600的,看着很不舒服,然后就想着怎么样可 ...
随机推荐
- C# HttpClient类库
示例代码: 1 using System.Net.Http; 2 using System.Net.Http.Headers; 3 using System.Threading.Tasks; 4 5 ...
- 我的hacker标杆
前言:我为什么用"标杆"而不是用偶像来做题目呢?因为在我的心中,值得我学习的黑客绝不是仅仅值得成为我个人的偶像,更应该成为业界的标杆. 国外篇: 丹尼斯·里奇 评价:克尼汉评价道: ...
- CSAPP-Lab03 Attack Lab 记录
纸上得来终觉浅,绝知此事要躬行 实验概览 Attack!成为一名黑客不正是我小时候的梦想吗?这个实验一定会很有趣. CMU 对本实验的官方说明文档:http://csapp.cs.cmu.edu/3e ...
- 【爬虫】让我沉醉的python爬虫技术
今天终于有机会好好学习我一直梦寐以求想掌握的爬虫技术,其实爬虫技术涉及的面不多,我力求做到精通写在简历上. 1.工程分析流程 (1)需求分析 ①目标网站:②抓取内容:③存储格式. (2)项目实施 分析 ...
- jq全选、全不选、反选、单删、批量删除
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- scoped样式
scoped样式 作用∶让样式在局部生效防止冲突 写法∶<style scoped> 比如School组件和Student组件的样式名一样,当组件汇总到一起时样式会冲突.所以加上scope ...
- VMWare ESXi 6.0如何复制虚拟机
1.复制前建议将待复制的虚拟机电源关闭. 2.登录ESXi 6.0主机后,点击"配置"选项卡,再点击"存储器". 3.能看得相关的数据存储,然后右键点击存储器如 ...
- 一比一还原axios源码(四)—— Axios类
axios源码的分析,到目前为止,算上第0章已经四章了,但是实际上,还都没有进入axios真正的主线,我们来简单回顾下.最开始我们构建了get请求,写了重要的buildURL方法,然后我们处理请求体请 ...
- petite-vue源码剖析-逐行解读@vue/reactivity之reactive
在petite-vue中我们通过reactive构建上下文对象,并将根据状态渲染UI的逻辑作为入参传递给effect,然后神奇的事情发生了,当状态发生变化时将自动触发UI重新渲染.那么到底这是怎么做到 ...
- Linux项目部署 jdk tomcat 安装配置 linux下 failed connect to localhost:8080;Connection refused
ONBOOT=yes 5.安装wget (1)安装 yum -y install wget (2) 查看版本 wget --version或 wget -V 一.安装jdk 配置 (1)安 ...