3.3.RHCE

1.计划任务与系统安全

1.1 cron周期性计划任务

1.概述 

  用来定期执行程序,目前最主要的用途是定期备份数据
  软件包名:cronie、crontabs(管理计划任务的命令工具)
  服务名:crond
  日志文件:/var/log/cron(记录什么时间执行什么操作)
  
  rpm -q cronie #软件包默认系统自动安装
  systemctl status crond #服务默认随机自启
View Code

2.cron定义时间格式

  *  *  *  *  *   命令/xx.sh
  分 时 日  月 周

  分钟:从0到59之间的整数
  小时:从0到23之间的整数
  日期:从1到31之间的整数
  月份:从1到12之间的整数
  星期:0~6之间的整数,0代表周日

  *    #代表每分,每时,每天,每月,每周
  ,   #分隔多个不连续的时间
  -    #指定连续时间范围
  /    #指定执行任务的时间间隔
  
  30 2 * * * 命令 #每天凌晨2点30分执行一个任务
  00 2 * * 5 命令 #每周5凌晨2点执行(3列和5列不能同时定义)
  30 23 1 * * 命令 #每月1号23:30分执行任务
  30 23 1,3,5 * * 命令 #每月1、3、5号23:30执行任务
  30 3 2-5 * * 命令 #每月2-5号凌晨3:30分执行任务
  00 */2 * * * 命令 #每两小时执行一个任务
  
View Code

3.命令

  crontab  -e   -u   用户名      #编写计划任务
  crontab  -l   -u  用户名     #查看计划任务
  crontab  -r   -u  用户名      #清除计划任务 
 
 #a.编写计划任务
 crontab -e #默认是当前用户
 */1 * * * *  date >> date.txt #每一分钟执行一个任务
 30 3 * * 6  tar -czf `date +%F-%H-%M`-log.tar.gz /var/log/*.log #每周6凌晨3:30分备份/var/log/日志文件

 #b.查看计划任务
 crontab -l

 #c.清除计划任务
 crontab -r
 
注意:
 有时候在直接编写任务计划不会执行,可以把计划写到脚本中。
 */1 * * * * tar -czf `date +%F%H%M%S`-bak_log.tar.gz /var/log/*.log
 计划中写入上面这个命令发现并没有执行,可以把它写到脚本中执行。
vim bak.sh
 #!/bin/bash
  tar -czf `date +%F-%H-%M-%S`-bak_log.tar.gz /var/log/*.log

chmod +x bak.sh

crontab -e
  */1 * * * * /root/bak.sh 
【只有任务出错才会发送邮件吗?正确可以发送吗】
【bak.sh会发送,>> date.txt不发送】
View Code

2.系统安全

2.1 常见协议及端口

1.了解

  一个服务器有好多服务。网站,数据库。通过ip(域名)如何找到你要访问的服务呢?依靠端口。
  
#1.文件
 /etc/services 文件记录协议及端口信息

#2.常见协议
 http:超文本传输协议(明文协议)             默认端口:80   
 https:安全的超文本传输协议(加密协议)       默认端口:443 
 ssh:远程连接协议                             默认端口:22
  (ssh协议在服务器里有服务,这个服务基于ssh这个协议让别人链接。这个服务的端口是22号端口)
 telnet:远程管理协议                       默认端口:23
  (xshell最初使用该协议,后来使用ssh协议。telnet是明文协议,有安全隐患)
  
 ftp:文件传输协议         默认端口:20(数据端口(21(命令端口)
 tftp:简单的文件传输协议   默认端口:69
 DNS:域名解析协议            默认端口:53
 smtp:用户发邮件协议      默认端口:25
 pop3:用户收邮件协议      默认端口:110
View Code

2.2 SELinux内核安全机制

1.了解

 1.了解
  Security-Enhanced Linux 是一套增强Linux系统安全的强制访问控制体系(内核防火墙),针对用户、进程、目录和文件提供了预设的保护策略,以及管理工具。
 2.SELinux运行模式
  enforcing        #强制模式
  permissive       #宽松模式
  disabled         #禁用模式
 3.模式切换
 #1.查看当前运行模式
  [root@localhost ~]# getenforce
  Enforcing  #默认为强制模式
 #2.切换为宽松模式(重启恢复默认)
  [root@localhost ~]# setenforce 0
 #3.切换为强制模式(重启恢复默认)
  [root@localhost ~]# setenforce 1
 #4.永久修改运行模式
  [root@localhost ~]# vim /etc/selinux/config 
  ...
  SELINUX=disabled
View Code

2.3 系统防火墙

 1.防火墙原理  

  两种防火墙的应用场景不同。SELinux是内核防火墙,对系统里面的应用程序做各种管制。系统防火墙用来对用户的数据包做各种过滤,防止恶意流量。firewalld和iptables都是系统防火墙管理工具,真正实现防火墙功能的是netfilter模块。
  系统防火墙基于netfilter模块实现。netfilter模块是Linux内核自带一个模块,网络过滤器。netfilter工作在主机或网络的边缘(也就是防火墙所在的位置)。
  服务器有外网网卡和内网网卡。防火墙在外网网卡位置工作,对用户数据包过滤。如果用户的访问在规则里是放行的,过滤后请求就能到达主机上面的应用程序。
View Code

2.防火墙种类

 

 

 分类方式一:
   软件防火墙:软件技术实现数据包过滤
   硬件防火墙:硬件设备,实现数据包过滤
 分类方式二:
   主机型防火墙:保护自己本机应用程序
   网络防火墙:保护内部其他服务器应用程序
   
   主机型防火墙保护自己本机里的应用程序,有外网网卡和内网网卡。用户访问请求通过防火墙外网网卡才能访问到主机里面的程序。防火墙在外网网卡前面过滤用户数据包。能否进来完全看防火墙规则。
  网络型防火墙保护内部其他服务器应用程序,所有的业务都在集群里面,不在每个集群主机上起防火墙,而是专门搞一个防火墙设备在外面做数据过滤。防火墙设备做完数据过滤后,直接把请求通过内部交换机转发到集群里。
  iptables既能实现主机型防火墙,又能实现网络型防火墙。  
  iptables是在链里面配规则。
  firewall拒绝别人访问,要在区域里面配规则。
View Code

2.4 firewalld防火墙

1.防火墙预设安全区域

  public:仅允许访问本机的sshd、DHCP、ping等少量协议
  trusted:允许任何访问(和防火墙关掉没区别)
  block:拒绝任何来访请求,有明确回应
  drop:拒绝任何来访请求,没有任何回应(丢弃)
  注意:
    防火墙默认public区域,但别人访问时会先看其它区域,最后才看public区域。(也就是优先看拒绝的区域)【trusted区域什么时候看呢】
View Code

2.常用命令

 #开启防火墙
 systemctl start firewalld
 #查看防火墙默认区域(public,可被别的机器ping通)
 firewall-cmd --get-default-zone
 #将默认区域修改为block
  (block被ping时提示:Destination Host Prohibited)
 firewall-cmd --set-default-zone=block
 #将默认区域修改为dorp
  (drop被ping不通,且没有提示)
 firewall-cmd --set-default-zone=drop
 #查看public区域所有规则
 firewall-cmd --zone=public --list-all
    public (active)
      target: default    #默认区域
      icmp-block-inversion: no
      interfaces: ens32 #区域针对的是ens32这块网卡
      sources:  #代表源IP,客户端ip
         #若drop中的sources放某ip,则只拒绝这个ip
      services: ssh dhcpv6-client #允许访问的服务,ping也允许
      ports: #源端口(客户端端口)
      protocols: #自己的端口(若写80,别人无法访问自己的80端口)
      masquerade: no
      forward-ports: 
      source-ports: #防火墙源端口
      icmp-blocks:  #ping的端口
      rich rules: 
     #注意:常用sources和protocols
 #为public区域临时添加http协议(此时在客户端输入ip可以访问)
  (重启消失)
 firewall-cmd --zone=public --add-service=http
 #为public区域临时删除http协议
 firewall-cmd --zone=public --remove-service=http
 #为public区域永久添加http协议(会有警告,还没显示在list all中,输入网址不能访问)(重启还在)
 firewall-cmd --permanent --zone=public --add-service=http
 #为public区域永久删除http协议
 firewall-cmd --permanent --zone=public --remove-service=http
 #永久修改需重新加载防火墙配置
 firewall-cmd --reload
View Code

3.封网段开服务

 #单独拒绝某一个IP(拒绝放block或drop都可以)(--permanent永久)
 firewall-cmd --zone=block --add-source=192.168.0.40
 #查看
 firewall-cmd --zone=block --list-all
    block (active)
      target: %%REJECT%%
      icmp-block-inversion: no
      interfaces: 
      sources: 192.168.0.24
      services: 
      ports: 
      protocols: 
      masquerade: no
      forward-ports: 
      source-ports: 
      icmp-blocks: 
      rich rules: 
 #删除block区域的指定IP
 firewall-cmd --zone=block --remove-source=192.168.0.24
View Code

4.防火墙端口映射

 #当有人访问5432端口时,映射到本机的80端口
  #当你改了某些服务的端口,没有使用默认端口,此时可以使用防火墙来映射
 firewall-cmd --zone=public --add-forward-port=port=5432:proto=tcp:toport=80
success
 #命令解释:
    --add--forward   #添加转发端口
    port=port=5432   #指定转发的端口
    proto=tcp        #指定tcp协议
    toport=80        #指定目标端口
 #查看
 firewall-cmd --zone=public --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: ens32
      sources: 
      services: ssh dhcpv6-client http
      ports: 
      protocols: 
      masquerade: no
      forward-ports: port=5432:proto=tcp:toport=80:toaddr=
      source-ports: 
      icmp-blocks: 
      rich rules:    
View Code

2.5 iptables

1.iptables框架

5个链分散存放在4个表中,链里面存放规则的。
View Code

2.iptables的4表

 filter:数据过滤表,是iptables的默认表,用于对数据包进行过滤
       包含三个链:INPUT,OUTPUT,FORWARD(都是针对数据过滤的链)           分别过滤入站,出战,转发的数据
 nat:地址转换表,不过滤数据包,修改数据包中的源IP与目的IP和端口映射 
  包含三个链:PREROUTING,POSTROUTING,OUTPUT(针对地址转换的链)
 mangle:包标记表,修改数据包的一些标志位,以便对数据包进行策略路由
        包含五个链:PREROUTING,FORWARD,POSTROUTING,INPUT,OUTPUTr决定是否跟踪数据包
 (建立在一个服务器有多个网卡的基础上)(可以在防火墙的mangle表中配一些规则,数据包访问机器里的网站时用哪个网卡接收请求。用户数据包访问防火墙设备其它服务如ftp用哪块网卡去接收请求。或数据包在给客户返回时,用那块网卡把数据包转发出去。这就叫策略路由)  
 raw:状态跟踪表,用于跟踪数据包
      包含两个链:OUTPUT,PREROUTING
View Code

3.iptables的5链 

 INPUT链(数据包入站链):入站规则,限制客户端数据包目地地址,是防火墙主机的上层应用所需要的链
 OUTPUT链(数据包出站链):出站规则,限制防火墙主机上层应用产生的数据包是否可以出站需要的链
 FORWARD链(数据包转发链):用于将数据包转发到本机的另外一个网络所需要的链
 
   input链只针对主机型防火墙,给自己本机的应用程序实现流量过滤的。针对主机里面的网址配置两条规则,第一条规则:允许所有客户端访问本机网站应用。第二条规则:拒绝所有客户端访问本机网站应用。会从上到下逐条匹配规则。第一条匹配后,第二条就不看了。若是所有规则都不匹配,就按照每个链的默认规则处理。
  用户请求通过input入站链后,访问到网站了,网站程序是否允许给用户返回数据。若允许本机里的数据出去,就会通过外网网卡返回给用户。output链一般不配规则,一般允许别人访问的话都会给它返回数据。
  若是用户要访问的数据在内部集群,就用不到input链,而需要forward流量转发链。网络型防火墙,用户请求进来后经由forward链做转发。若forward链允许放行,就把请求从外网网卡转到内网网卡。再通过内网网卡和企业内部的路由器路由到公司的内部服务器上。因为外网卡是给用户提供访问的,内网卡是和集群内部之间进行通信的。外网网卡不能直接和内部服务器进行沟通,因为它们根本不在同一个网段。所以只能通过forward链把本机的流量转到内网网卡后,由内网网卡转到内部服务器。所以网络型防火墙也可以看成是一个路由器。
   PREROUTING链(路由前的地址转换链):用于处理刚到达本机并在路由转发前的数据包,它会转换数据包中的目标IP地址,通常用于DNAT(destination NAT)目标地址转换
(外部主机想访问企业内部的网络或服务时,要做目标地址转换。客户端地址通过企业路由器转换成企业内部的私有地址。VPN就是基于这个原理。我们想访问谷歌,但国内有防火墙,我们访问谷歌的请求会被拦截。可以在防火墙外面挂个vpn,我们连接vpn的时候,vpn就会把我们的地址转换成vpn的内部地址,然后vpn帮助我们访问谷歌。)  
  POSTROUTING链(路由后的地址转换链):用于处理即将离开本机的数据包,它会转换数据包中的源IP地址,通常用于SNAT(source   ipaddress)源地址转换
(比如后期可以用于企业的机器共享上网用。比如在企业内部的机器想访问外网,但它们都是私有地址,内网地址,没有公网地址。可以使用防火墙设备的外网网卡。)
View Code

4.iptables命令格式

 Iptables [-t 表名] 选项 [链名] [条件] [-j 目标操作]
注意:
   创建规则时可以不指定表,默认为filter表
   如果没有找到匹配条件,执行防火墙默认规则(意思是防火墙链里面有一个默认的规则)
选项:
  -A    #添加防火墙规则至链末尾
  -I    #添加防火墙规则至链开头
  -L    #查看iptables所有规则,与-n连用
  -n    #以数字形式显示地址、端口等信息,与-L连用
  --line-numbers   #查看规则时,显示规则的行号
  -D  #删除链内指定的序号(或内容)的一条规则
  -F   #清空指定表的所有规则
  -P   #为指定的链设置默认规则
条件:
  -p 匹配协议
  -s 匹配源地址,-d匹配目标地址
  -i 匹配接受数据的网卡,-o匹配发送数据的网卡
  --sport 匹配源端口号,--dport匹配目标端口号
目标操作
  ACCEPT:允许通过/放行
  DROP:直接丢弃,不给出任何回应
  REJECT:拒绝通过,有明确回应  
View Code

5.主机型防火墙规则配置 

 主机型防火墙:
    保护自己本机应用程序,用到filter表中的INPUT和OUTPUT链。
    (网络型防火墙也是依靠filter表,用的是forward链)
 工作原理:
    通过iptables在机器里面配置了一些规则,这些规则是针对本机里的应用程序的服务的。若是客户端要访问本机的网站,这时候要看INPUT链中的规则,若规则拒绝客户端访问本机网站,则客户端的数据包就被直接拒绝了,就访问不到本机的网站。若规则允许客户端访问本机网站,则数据包就能进来。
    OUTPUT数据包出站链,决定本机的网站服务产生的数据包能不能出去。
Iptables [-t 表名] 选项 [链名] [条件] [-j 目标操作]
  #停止本机的firewalld防火墙(iptable和firewalld控制同一个内核模块,所以不能同时起,会冲突)
  systemctl stop firewalld
  systemctl disable firewalld     
  #安装iptables服务
  yum -y install iptables-services
  systemctl start iptables
  #拒绝icmp访问(此时就ping不通本机ip了)
  iptables -t filter -I INPUT -p icmp -j REJECT
  #查看规则(不写链名,就显示该表下的所有链的规则)
  iptables -t filter -nL --line-numbers
  #在第四条规则前插入规则
  iptables -t filter -I INPUT 4 -p icmp -j REJECT
  #清空某一条规则(默认为filter表)
  iptables -t filter -D  INPUT  3 
  #清空所有规则(默认为filter表所有规则)
  iptables -F
  #清空nat表所有规则
  iptables -t nat -F    
View Code

 

 6.设置防火墙默认规则

 #查看每个链的默认规则(policy后面就是默认规则)
   #iptables的每个链默认都是允许放行
  iptables -t filter -nL
Chain INPUT (policy ACCEPT) #默认规则ACCEPT放行所有
target     prot opt source               destination 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination   

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
 #清空防火墙规则
  iptables -F
 #允许22号端口被访问(ssh远程链接的端口号,否则下一步后会断开)
   #设置端口时要指定协议(通过tcp协议访问22端口就拒绝)
 iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
 #将filter表INPUT链默认规则修改为DROP(默认规则不让设置成REJECT)
  iptables -t filter -P INPUT DROP 
 #将默认规则修改为ACCEPT
  iptables -t filter -P INPUT ACCEPT
View Code

7.防火墙针对端口进行访问控制

 #a.设置防火墙拒绝所有80端口的访问(拒绝别人访问网站)
   #网站对应的协议要么就是http(80)要么就是https(443),
   #根据端口做匹配还要指定端口对应的是哪个协议(tcp是客户端和服务端建立链接的协议)
   #-p不能指定http
  iptables -t filter -I INPUT -p tcp --dport 80 -j REJECT
 #b.此时打开另一个终端:命令行浏览器访问  
  curl 192.168.0.80 #拒绝连接
 #c.单独拒绝某个IP不允许访问本机的某个服务(端口)  
   #此时可以ping通
  iptables -I INPUT -s 192.168.0.60 -p tcp --dport 80 -j REJECT #ip通过哪个协议访问哪个端口
 #d.单独拒绝某个IP所有服务
  iptables -t filter -I INPUT  -s 192.168.0.40 -j REJECT
 #e.设置防火墙拒绝某个网段(ssh会断开)
  iptables -t filter -I INPUT -s 192.168.0.0/24 -j REJECT
 【拒绝客户端访问本机网卡ens32】
  iptables -I INPUT -i ens35 -j DROP #为什么没反应(关了32生效了)
View Code

2.6 iptables-网络型防火墙

 

 1.原理

  FORWARD链(数据包转发链):做路由转发的。是用于将数据包转发到本机的另外一个网络所需要的链。
  客户端想访问公司网站,而公司网站在集群主机里。单独用一个设备部署了防火墙。防火墙通过外网网卡接收用户请求。若认为数据包没有危险就放行。内网网卡和企业的交换机或路由器可以直接连到企业内部的其他机器,做数据转发。(外网网卡和集群的机器是没法通信的)
  (网络型防火墙理解成一个转发数据包,做路由转发,理解成一台路由器)
  (路由器的功能就是接收请求转发请求)
View Code

2.主机规划

 准备三台机器
 iptables   ens32内网IP:192.168.0.80,ens34外网IP:192.168.1.100
 client24   ens32:192.168.1.24,网关指向防火墙外网IP:192.168.1.100
 web26      ens32:192.168.0.26,网关指向防火墙内网IP:192.168.0.80
View Code

3.client配置

  #修改主机名
  hostnamectl set-hostname client40 #重启生效
  #修改ip,将网关指向防火墙主机的外网网卡(因为我们没有路由器,所以这样设置网关可以使它们互相通信)
  vim /etc/sysconfig/network-scripts/ifcfg-ens34
    将IPADDR="192.168.0.40"改为IPADDR="192.168.1.40"
    将GATEWAY="192.168.0.254"改为GATEWAY="192.168.1.100"
  systemctl restart network 
  #重启网络
  systemctl restart network
View Code

4.web60配置

  #修改主机名
  hostnamectl set-hostname web60 #重新登录名字生效
  #修改ip,将网关指向防火墙主机的内网网卡
  vim /etc/sysconfig/network-scripts/ifcfg-ens32
   将IPADDR="192.168.0.40"改为IPADDR="192.168.1.40"
   将GATEWAY="192.168.0.254"改为GATEWAY="192.168.1.100"
  #重启网络
  systemctl restart network
  #安装httpd服务
  yum -y install httpd
  echo  web26 > /var/www/html/index.html #修改默认首页
  systemctl start httpd
  systemctl status httpd
  #关闭防火墙
  systemctl stop firewalld #停掉防火墙(外部已经有防火墙了)
                           【防火墙会关掉httpd服务吗】
  setenforce 0 #把SELinux停掉
View Code

5.防火墙主机配置

  #修改主机名
  hostnamectl set-hostname iptables #重新登录名字生效
  #虚拟机增加一块网卡
   xxxxxx
  #修改新增网卡的ip
  方法一:
    nmtui修改网卡IP地址(交互式修改)
      nmtui 回车
      编辑连接 回车
      有线连接1 回车(我们添加完网卡后的连接名叫有线连接1)
      配置名称修改为 ens34
      IPv4配置 回车选择手动,右边的显示:回车
        地址:192.168.1.100
        网关不用设置(因为外网网卡不需要网关,互联网中是由路由的)
        一直往下滑,滑到最下面选确定
        返回
        确定
    systemctl restart network #重启网络 
  方法二:
    命令行临时配ip
     #配置ip
     ifconfig ens34 192.68.0.66 
     #复制文件
     cp /etc/sysconfig/network-scripts/ifcfg-ens32 /etc/sysconfig/network-scripts/ifcfg-ens34
     #修改文件
     vim /etc/sysconfig/network-scripts/ifcfg-ens34
       删掉UUID
       NAME="ens32"改为NAME="ens34"
       DEVICE="ens32"改为DEVICE="ens34"
       IPADDR="192.168.0.44"改为IPADDR="192.168.0.66"
     #重启网络
     systemctl restart network 
  #开启路由转发功能(修改内核参数)
   echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf 
   sysctl -p   #加载配置立即生效
  #查看路由转发是否开启(1表示开启)
   cat /proc/sys/net/ipv4/ip_forward
   1
  #清空刚才主机型防火墙做的规则
  iptables -F
View Code

6.防火墙主机配置规则并测试

  #client24访问测试
   curl 192.168.0.26  #页面内容显示成功 
  #防火墙主机配置规则:client24访问内网所有地址80端口时拒绝转发
   iptables -I FORWARD -s 192.168.1.24 -p tcp --dport 80 -j DROP
  #client24/25访问测试
   curl 192.168.0.26  #24访问页面内容显示失败,25成功
  #拒绝所有客户端地址访问内网80端口
  iptables -t filter -I FORWARD -p tcp --dport 80 -j REJECT
  #client24/25访问测试
   curl 192.168.0.26  #24/25访问页面内容显示失败
  #清除规则
   iptables -F   
View Code

2.7 iptables扩展

1.iptables扩展模块 

 #1.原理
  若是某客户端的ip被拒绝了,但该客户端换了一个ip,继续访问。
 #2.命令格式
  iptables 选项 链名 -m 扩展模块 --具体扩展条件 -j 动作
 #3.操作
  #根据MAC地址封锁主机,安装nmap扫描获取对方IP的MAC地址
  [root@iptables ~]# yum -y install nmap

  #a.扫描对方主机IP
  [root@localhost ~]# nmap 192.168.0.80
  Starting Nmap 6.40 ( http://nmap.org ) at 2022-08-02 12:04 CST
  Nmap scan report for 192.168.0.80
  Host is up (0.00019s latency).  #当前主机状态
  Not shown: 995 closed ports     
  PORT     STATE SERVICE          #主机上开启了哪些端口
  22/tcp   open  ssh
  80/tcp   open  http
  111/tcp  open  rpcbind
  3306/tcp open  mysql
  6000/tcp open  X11
  MAC Address: 00:0C:29:CE:6C:B9 (VMware) #MAC地址

  Nmap done: 1 IP address (1 host up) scanned in 1.18 seconds
  #b.通过MAC地址限制访问自己的80端口
  [root@iptables ~]# iptables -t filter -I INPUT -p tcp --dport 80 -m mac --mac-source 00:0C:29:CE:6C:B9 -j REJECT
View Code

2.基于多端口设置过滤规则  

 #a.允许访问多个端口
 iptables -t filter -I INPUT -p tcp -m multiport --dports 20,21,80,443 -j ACCEPT
 #b.根据IP范围设置封锁规则
 iptables -t filter -I INPUT -p tcp --dport 80 -m iprange --src-range 192.168.1.20-192.168.1.30 -j REJECT
  #--src-range:源IP,--dst-range:目标IP 
View Code

3.配置SNAT实现共享上网

 #a.原理:
   通过防火墙规则,允许内部主机访问外网
 #b.环境部署
 准备三台机器
 内部防火墙:iptables   ens32外网IP:192.168.0.80,ens34内网IP:192.168.1.100
 内部client25        ens32:192.168.1.25,网关指向防火墙内网IP:192.168.1.100
 外部web26           ens32:192.168.0.26,网关指向防火墙外网IP:192.168.0.80
 #c.实现192.168.1.25等内部网址转换为192.168.0.80
 iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -p tcp  -j SNAT --to-source 192.168.0.80
   #POSTROUTING:路由后链
   #-s:指定源地址为192.168.1.0网段的地址
   #-p:想要通过tcp协议
   #--dport:访问目标的80端口时
   #-j:SNAT协议
   #--to-source:转换源地址为192.168.0.80
 #d.内部client25访问外部web26
   curl  192.168.0.26 
 #e.外部web26动态查看apache访问日志
  tail -f /var/log/httpd/access_log
    看到192.168.0.80访问过
View Code

4.永久保存iptables规则

 service iptables save
   #对应文件 /etc/sysconfig/iptables
   #不想永久保存,直接删掉文件。或先-F清空,再使用该命令
View Code

3.用户提权与OpenSSH安全

3.1 sudo用户提权

1.原理

  管理员提前为用户设置执行权限许可,被授权用户有权执行命令权限。
  配置文件:/etc/sudoers
  命令格式:sudo  特权命令
View Code

2.命令

 visudo或vim /etc/sudoers
View Code

3.文件解读

 visudo #输入/root找到下面的行
  .. .. #输入/systemctl找命令路径,或which systemctl
  root    ALL=(ALL)    ALL
  user1   ALL=(root)   /usr/bin/systemctl start httpd,/usr/bin/yum install vsftpd,/bin/passwd,!/bin/passwd root    #! 取反
  #user1用户可以从所有地址登录系统,以root的身份,执行后面的命令
  解释:
    root:用户名root
    ALL表示可以从所有地址 
    (ALL)以任何人的身份
    ALL表示执行系统中的所有命令
View Code

4.示例

 su - user1
 sudo -l #查看user1可以执行哪些特权命令
 sudo systemctl start httpd #可以执行
 sudo systemctl stop httpd  #执行失败(若只写systemctl则成功)
View Code

5.为sudo机制启用日志记录,以便跟踪sudo执行操作

 visudo
   .. ..
   Defaults logfile="/var/log/sudo.log"   #手动添加
   .. ..  
 sudo systemctl start httpd #user1执行该命令
 cat /var/log/sudo.log
 Aug  2 16:53:41 : user1 : TTY=pts/1 ; PWD=/home/user1 ; USER=root ;
    COMMAND=/bin/systemctl start httpd
#什么时间,哪个用户,在哪个终端,在哪个路径,以谁的身份,执行了什么命令
View Code

3.2 ssh免密连接

1.概述

OpenSSH是开源免费提供ssh远程安全登录的程序 
View Code

2.相同系统ssh免密登录

 设置免密登录后,无论对方修改主机名、ip、密码,都不影响连接。
 若改了端口:ssh -p 2222 192.168.0.66
 不想被免密连接,直接把公钥删除了就行
 #aa.生成公私钥
 ssh-keygen
  #直接回车默认私钥的存放位置以及私钥的名字id_rsa
  #直接回车表示不给私钥设置密码(别的主机拿到私钥也可以使用)
   #私钥文件很重要,设置密码可以防止别人拿着你的私钥文件连接
 #b.查看密钥文件
 ls /root/.ssh
   #id_rsa(私钥,钥匙)
   #id_rsa.pub(公钥,锁子)
 #c.将公钥拷贝至其他主机
  ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.80
  ssh-copy-id -i .ssh/id_rsa.pub user1@192.168.0.80
                           #在user1家目录多了.ssh目录
  #-i .ssh/id_rsa.pub 可以省略
  #以对方主机root的身份拷贝
  #由于我们是首次拷贝,所以要知道对方主机的root密码
  #此时对方主机家目录生成.ssh目录
 #d.其他主机查看公钥文件
  ls .ssh   #authorized_keys
        #cat authorized_keys可以看到root@192.168.0.80
 #e.验证是否实现密钥认证登录
  root用户登录:ssh 192.168.0.27
  user1身份登录:ssh user1@192.168.0.27
  若修改端口为2222:
    ssh-copy-id -p 2222 user1@192.168.0.80 
View Code

3.windows免密连接linux

 #a.创建公私钥
  点击工具,用户密钥管理者,点击生成(生成密钥对),下一步,下一步,不给密钥文件设置密码直接下一步,点击保存为文件(保存公钥文件),完成(此时显示的是私钥)。
 #b.粘贴
  将生成的公钥文件的内容复制到目标机器的authorized_keys中:
   vim /root/.ssh/authorized_keys
 #c.连接
  在xshell中ssh root@192.168.0.40时,选择Public Key
 注意:
   若是生成公私钥后使用hostnamectl修改主机名,公钥可能会失效。
View Code

3.3 scp远程复制工具

1.概述

 scp可以实现主机之间的文件拷贝
View Code

2.将本地文件拷贝至远程主机

 scp /opt/test.txt root@192.168.0.27:/opt
View Code

3.将远程主机文件拉取到本地

scp root@192.168.0.27:/etc/fstab /opt
View Code

3.4 提高ssh服务安全性

1.配置文件

vim /etc/ssh/sshd_config
.. ..
#Port 22               #ssh默认监听端口
#PermitRootLogin yes   #是否允许root连接,yes允许,no不允许
#PermitEmptyPasswords no         #不允许空密码登录
#PasswordAuthentication yes       #允许用密码登录
AllowUsers 用户1 用户2 用户3@192.168.0.0/24  #定义账号白名单
##DenyUsers 用户1  用户2                    #定义账号黑名单
View Code

2.重启服务

systemctl restart sshd
View Code

3.修改端口22为2222后,查看端口

 netstat -ntlp  #看到sshd的端口变为2222
 linux登录:ssh -p 2222 root@192.168.0.80
 xshell登录:ssh root@192.168.0.80 2222
View Code

4.不允许root远程连接

 PermitRootLogin no
 虽然之前已经做了ssh免密登录,但root用户登录不上去。
 可以使用user1用户登录,然后su -切换到root用户。
View Code

5.定义账号白名单

 在文件最后一行加入下面内容:
 AllowUsers 用户1 用户2 用户3@192.168.0.0/24 
   #只允许用户1和用户2登录,用户3只允许通过192.168.0.0登录
   #白名单和黑名单有一个就行
   #只要不在白名单的用户都属于黑名单用户
View Code

3.5 本地解析文件

1.概述

 主机名与IP地址解析配置文件
View Code

2.位置 

 Linux系统:/etc/hosts
 windows系统:C:\Windows\System32\drivers\etc
View Code

3.操作

vim /etc/hosts
  192.168.0.60 host60
  192.168.0.40 host40
ssh root@host60 #此时远程连接,只需要指定主机名就可以了
View Code

4.文件共享服务FTP与NFS

4.1 文件共享服务FTP介绍

 1.概述

 FTP:文件传输协议,是一种基于TCP协议端到端的数据传输协议。
 基于C/S架构,服务端默认使用20、21号端口
 服务端:
   端口20(数据端口)用于服务端数据传输
   端口21(命令端口)用于服务端接收客户端发出的相关FTP命令
 客户端:
   客户端依靠访问服务端的工具,这些工具也会在客户端打开随机的端口。
View Code
2.FTP工作模式
两种工作模式主要用来决定数据如何传输
 #a.主动模式(数据传输请求是由服务端主动向客户端发起连接请求)
  FTP客户端从本机的非特殊端口(>1023)连接FTP服务器的命令端口21,服务端通过本地的20号端口主动向客户端的随机端口发起连接请求,开始传输数据
  注意:若客户端没关防火墙,会拦截服务端的数据传输请求
View Code

 #b.被动模式(数据传输请求是由客户端主动向服务端发起连接请求)
 被动模式的数据端口是随机的,不用20号端口。
 FTP客户端通过向FTP服务器发送PASV命令进入被动模式,FTP服务器会另开一个随机端口,客户端主动连接到随机端口后,开始传输数据(被动模式客户端开不开防火墙都无所谓)
View Code

 

 3.可以实现ftp功能的软件

 #服务端软件
  vsftpd:非常安全的ftp软件
  WU-ftpd:华盛顿大学研发的一款FTP软件
  proftpd:专业的FTP软件
  pureftp:纯粹的FTP软件
  ServU:windows里的一款FTP软件
  FileZilla:windows里的一款FTP软件,Linux系统也可以使用
 #客户端工具
  ftp
  lftp、lftpget
  wget
  curl(linux命令行的浏览器)
  浏览器
  FileZilla:windows客户端工具,可从软件商店直接下载
View Code

4.2 vsftpd介绍

1.vsftpd介绍

 vsftpd是一款运行在Linux操作系统上开源且免费FTP服务程序
View Code

2.vsftpd用户访问模式

 vsftpd软件走的是ftp协议来传输数据。
 ftp协议本身在进行数据传输时分为主动模式和被动模式。
 vsftpd被用户访问时分为三种模式:
  本地用户模式:用户需要在服务端存在
  匿名用户模式:不需要用户认证,可直接访问(并不是真的匿名,是以服务端的本机里的ftp账号的身份来访问)
  虚拟用户模式:数据库映射机制
View Code

3.vsftpd服务相关参数

 /var/ftp                    #匿名用户共享目录(服务端)
 /etc/vsftpd                 #配置文件所在目录
 /etc/vsftpd/vsftpd.conf     #主配置文件
 /usr/sbin/vsftpd            #主程序文件
 /etc/vsftpd/ftpusers        #黑名单
 /etc/vsftpd/user_list #控制名单(配置文件控制白名单与黑名单)
 /var/log/xferlog            #日志目录
View Code

4.3 vsftpd匿名用户模式

#1.服务端安装并启动软件
  yum -y install vsftpd
  systemctl start vsftpd
#2.客户端下载连接工具
  yum -y install ftp lftp
#3.客户端使用ftp访问FTP服务端
  ftp 192.168.0.80
    Name (192.168.0.80:root):ftp #用户名输入ftp
    Password:                    #没密码,直接回车
    ftp> ls                  #Passive Mode(默认是被动模式)
    227 Entering Passive Mode (192,168,0,80,157,67).
    150 Here comes the directory listing.
    -rw-r--r--    1 0   0  0 Jul 01 05:23 c.txt
    drwxr-xr-x    2 14  50 36 Jul 01 05:27 pub
    226 Directory send OK.
 #客户端使用lftp访问FTP服务端
  lftp 192.168.0.80       
    lftp 192.168.0.80:~>  #默认以ftp用户的身份访问
    lftp 192.168.0.80:~> ls
      drwxr-xr-x  2 14 50  36 Jul 01 05:27 pub
      #服务端grep ftp /etc/passwd 看到ftp家目录/var/ftp
      #/var/ftp里面有pub目录
#4.客户端下载
  get pub/passwd          #下载pub目录下文件到客户端家目录
  get ran.sh            #下载/var/ftp目录下文件到客户端家目录
  get /pub/passwd -o /opt  #下载到指定目录
#5.客户端上传
  #a.修改所有者和所属组
  mkdir /var/ftp/upload         #服务端操作
  chown ftp:ftp /var/ftp/upload #服务端操作
  #b.修改主配置文件
  vim /etc/vsftpd/vsftpd.conf 
    29 #anon_upload_enable=YES   #29行取消注释
  systemctl restart vsftpd
  #c.客户端上传
  cd upload
  put /opt/ping.txt
  注意:
    此时pub目录可以下载文件,upload目录可以上传不可以下载
    /var/ftp目录,所有者/所有组是root,不是ftp。
    所以客户端不能在该目录下增删改文件。
    而是新建所有者和所属组为fpt用户的upload目录
  #d.在upload目录中创建目录
    取消33行的注释
    33 #anon_mkdir_write_enable=YES 
    mkdir aal
  #e.在upload目录中删除文件(也可以用mv重命名)
   vim /etc/vsftpd/vsftpd.conf 
      anon_other_write_enable=yes  #在最后一行添加
   rm -rf upload/passwd
View Code

4.4 vsftpd本地用户模式

1.使用场景

 给对方发一个专门连ftp的账号,把要共享的数据提前放到该账号的家目录。
 cp nginx-1.18.0.tar.gz  /home/ftpuser/
View Code

2.用户权限较大时(#chroot_local_user=YES)

 此时可以使用cd /etc命令切换路径,ls /etc查看内容。
 #a.客户端连接
 lftp -u ftpuser 192.168.0.60
 #b.下载到家目录
  get nginx-1.18.0.tar #从root身份连接服务器,所以家目录/root
 #c.上传文件
  put bak.sh
 #d.创建目录
  mkdir test
 #e.重命名
  mv test test1
 #f.删除
  rm -rf test1
View Code

3.用户权限较小时(chroot_local_user=YES)

 此时输入ls命令:
   refusing to run with writable root inside chroot()
 #a.取消用户家目录的w权限
   chmod u-w /home/ftpuser/ #服务器端
   此时无法进行cd /etc,mvmkdir,put操作,get可以使用
 #b.创建目录并修改归属关系 
   mkdir /home/ftpuser/upload 
   chown ftpuser:ftpuser /home/ftpuser/upload 
   此时mv,mkdir,put,get都可用。
View Code

4.5 vsftpd有关文件

1.文件位置

ls /etc/vsftpd
 ftpusers   #黑名单文件,里面的用户都不能访问(root和系统账号)。
 user_list  #控制名单,既可以当黑名单又可以当白名单,默认是黑名单
 vsftpd.conf #主配置文件
View Code

2.主配置文件

 vim /etc/vsftpd/vsftpd.conf
 #a.匿名用户参数
 12 anonymous_enable=YES #是否允许匿名用户访问,默认yes允许
 29 #anon_upload_enable=YES  #允许upload目录上传文件
 33 #anon_mkdir_write_enable=YES  #允许upload目录中创建目录
 anon_other_write_enable=yes  
   #在最后一行添加,允许在upload目录中删除文件(也可以用mv重命名)
   
 #b.本地用户参数
  16 local_enable=YES  #是否允许本地用户访问,默认yes允许
  19 write_enable=YES  #是否允许本地用户写权限,默认yes允许
  23 local_umask=022   #本地用户上传目录默认权限为755
  40 xferlog_enable=YES       #启动xferlog日志记录,该文件记录传输数据 
  49 #chown_username=whoever #改变上传文件的属主与属组
                        #谁上传文件,文件所有者是谁。
                        #将whoever改为root,所有者就变为root
  53 #xferlog_file=/var/log/xferlog  #日志文件默认位置
  60 #idle_session_timeout=600    #客户端连接超时时间
  63 #data_connection_timeout=120 #数据连接超时时间
 101 #chroot_local_user=YES #是否允许本地用户切换目录,默认no允许(限制活动范围,根目录就变成家目录了)
 127 userlist_enable=YES     
      #是否启用控制名单文件,yes启用,
      #如果启用控制名单功能,需要指定该文件为黑名单|白名单
 128 userlist_deny=no   #手写    
      #yes拒绝user_list文件中用户登录ftp服务器(黑名单)
      #no允许登录(白名单)
      #若白名单,删掉所有用户,然后自己手写希望登录的用户 
 max_clients=    #限制最大并发连接数量      
View Code

4.6 vsftpd虚拟用户模式

需要数据库支持!
View Code

4.7 文件共享服务NFS网络文件系统

1.概述

 NFS网络文件系统,是一种基于TCP/UDP传输协议的文件共享服务
 NFS基于C/S架构,服务端启用协议将文件共享到网络上,然后允许本地NFS客户端通过网络挂载方式将服务端共享的文件挂载到本地。(此时往客户端本地存储数据,就存到了服务器端的共享目录。也叫网络附加存储,类似百度网盘)
 NFS协议端口号:2049
 软件包:nfs-utils
 服务名:nfs
 配置文件:/etc/exports
  #NFS基于RPC远程过程调用机制,支持在异构系统之间数据的传送 
View Code

2.RPC的作用

  nfs的端口不是固定的,nfs内部有很多功能,不通功能会起不通端口。所以端口不一定是2049。
  用户连接nfs,RPC会先接收用户请求,RPC会先去看nfs当前用的端口号是多少,然后返回给用户。
  RPC协议的端口111,软件包和服务名都是rpcbind。
View Code

3.NFS服务端配置

 #a.添加硬盘并创建共享目录
  mkfs.xfs /dev/sde
  mkdir /ser-public
  chmod o+t /ser-public
  mount /dev/sde /ser-public/
 #b.做逻辑卷挂载到共享目录
  umount /dev/sde #要先卸载才能变成卷组
  vgcreate myvg /dev/sde #之前格式化了也无所谓,会提示覆盖
  vgs #查看
  lvcreate -L 19.9G -n mylv myvg #不能设置成20G
  mkfs.xfs /dev/myvg/mylv #格式化
  mount /dev/myvg/mylv /ser-public/
 #c.安装软件包并启动服务查看端口
  yum -y install nfs-utils
  systemctl start nfs
  systemctl enable nfs
  ss -anptul | grep 2049 #看到端口起来了就可以做数据共享了
 #d.将目录共享给别人
   vim /etc/exports
     /ser-public 192.168.0.80(rw) 192.168.0.40(ro)
     /test 192.168.0.0/24(rw)  #共享给指定网段
   systemctl restart nfs
View Code

4.NFS客户端配置

 将一个新硬盘格式化后挂载到服务端的一个目录,再将目录共享给本地。
 #a.列出服务端共享的资源
  #如果客户端没有该命令需安装nfs-utils(不需要启服务)
  showmount -e 192.168.0.60 
     Export list for 192.168.0.60:
     /ser-public 192.168.0.80
     /nfs-upload 192.168.0.40,192.168.0.80
 #b.手动挂载NFS共享文件到本地
  mkdir /opt/upload
  mount 192.168.0.60:/nfs-upload /opt/upload
  df -h #查看正在使用的分区情况
 #c.本地客户端实现开机挂载配置
  vim /etc/fstab 
    192.168.0.60:/nfs-upload  /opt/upload nfs     defaults,_netdev   0 0
  mount -a
  #解释:_netdev指定nfs是网络设备  
 
 #d.客户端root和user1普通用户验证是否可以是否共享目录
  root和user1都可以执行cd和ls命令,都不能执行touch命令。若想有w权限,有两种方法:
  #方法一:给所有用户设置w权限
         chmod 777 /opt/upload
    此时客户端在使用这个目录时,是以谁的身份使用呢?
    客户端以root身份创建文件,以服务端的普通用户nfsnobody身份
    客户端以udi为1009的用户创建文件,若服务端uid为1009的用户为tom,则以服务端tom用户的身份运行。若服务端没有uid为1009的用户,创建的文件的所有者和所属组都显示1009,以后服务端有了uid为1009的用户才会变成对应的所有者和所属组。
   #方法二:给指定用户设置acl权限
          chmod 755 /opt/upload
          setfacl -m u:nfsuser:rwx /ser-public
          服务端nfsuser的uid为1001,则客户端uid为1001的用户在共享目录中具有w权限。
          
 #e.服务端开放允许以root身份访问
  vim /etc/exports
     /ser-public 192.168.0.80(no_root_squash,rw) 192.168.0.40(ro)
     /test 192.168.0.0/24(rw)  #共享给指定网段
  systemctl restart nfs
  #解释:
    no_root_squash 不挤压root用户身份(允许以root身份访问)
    此时在客户端以root身份在共享目录创建文件,服务端会以root身份运行。
View Code

4.8 常用的数据存储方式

1.NAS(网络附加存储)存储模式中的文件共享服务

 samba文件共享服务:支持跨平台
 FTP文件共享服务:支持跨平台
 NFS文件共享服务:支持跨平台
View Code

2.DAS存储(直连存储)

 直接附加在电脑主板上的硬盘
View Code
3.SAN存储(存储区域网络)
 块级别存储,把自己电脑上的硬盘共享给其他主机 
View Code

 5. Apache httpd的web服务

 1.概述

 Apache httpd是适用于Unix/Linux下的web服务器软件(web就是网站)。
 支持虚拟主机(一台服务器上实现好几个网站),支持HTTPS协议,支持用户认证,支持单个目录的访问控制,支持URL地址重写,支持路径别名,支持反向代理和负载均衡,高度模块化设计,支持并发访问量20000左右(已经逐步被Nginx替代了)
 基于B/S模式:服务端提供页面,浏览器显示并下载页面
 基于TCP/HTTP或者HTTPS协议进行传输
 软件包:httpd
 系统服务:httpd
View Code

2.提供web服务的软件

 Apache httpd(开源且免费)
 Tomcat(开源且免费)︰适合做java的网站
 websphere:商业软件,适合做Java的网站
 webLogic:商业软件,适合做ava的网站
 Jboss:红帽公司,商业软件,适合做Java的网站
 Tengine:开源免费的web服务器软件,基于Nginx二次开发,淘宝正在使用一款web服务器软件
 Nginx:开源免费的web服务器
View Code

3.配置并使用

 #a.服务端安装并启动httpd服务
  yum -y insta1l httpd
  systemct1 start httpd
  systemct1 enable httpd
    #nginx和httpd用的是同一个端口,两个软件不能同时启动
 #b.客户端访问
  curl http://192.168.0.80
View Code

4.服务相关参数和默认配置

 #a.相关参数
  主配置文件: /etc/httpd/conf/httpd.conf
  默认网页根目录: /var/www/html
  默认网页文件名: index.html  
 #b.提供的默认配置(在主配置文件中)
  Listen:监听地址:端口(80)
  ServerName:注册的DNS域名
  DocumentRoot:网页根目录(/var/www/html)
  Directorylndex:默认首页文件名(index.html)
View Code

5.httpd虚拟web主机(了解)

 虚拟web主机的特点:由同一台主机提供多个web站点
 #a.虚拟web主机实现的三种方式:
  基于域名的虚拟主机: www.xxoo.com www.xxxx.com www.oooo.com
  基于端口的虚拟主机
  基于IP地址的虚拟主机
 #b.虚拟主机配置路径
   /etc/httpd/conf.d/*.conf
 #c.虚拟主机配置
  <VirtualHost IP地址:端口>
  ServerName 此站点的DNS名称
  DocumentRoot 此站点的网页根目录
  </virtualHost>
 #d.案例
 vim /etc/httpd/conf.d/web.conf
    <VirtualHost *:80>
      serverName www.xxoo.com
      DocumentRoot /var/www/xxoo
    </VirtualHost>
    <VirtualHost *:80>
      serverName www.xxxx.com
      DocumentRoot /var/www/xxxx
    </VirtualHost>
    <VirtualHost *:80>
      serverName www.oooo.com
      DocumentRoot /var/www/oooo 
    </VirtualHost>
  #创建网页根目录
   mkdir /var/www/xxoo
   mkdir /var/www/xxxx
   mkdir /var/www/oooo
  #创建默认首页
   vim /var/www/xxoo/index.htm1
     xxoo
   vim /var/www/xxxx/index.htm1
     xxxx
   vim /var/www/oooo/index.htm1
     oooo
  #配置本地解析
   vim /etc/hosts
    192.168.0.26 www.xxoo.com
    192.168.0.26 www.xxxx.com
    192.168.0.26 www.oooo.com
  #重启服务
   systemctl restart httpd
  #访问测试
   curl http://www.xxoo.com
   curl http://www.xxxx.com
   curl http://www.oooo.com
View Code

6. NTP网络时间协议

6.1 NTP了解

1.NTP概述

  网络时间协议基于UDP用于网络时间同步,使网络中的计算机时钟同步到UTC(世界统一时间),再配合各个时区的偏移调整实现精准同步对时功能。 
View Code

2.chrony概述

  Chrony是一个开源软件,在RHEL7/CentOS7操作系统默认安装,它能保持系统时间与NTP时间服务器的时间保持同步,让时间始终保持同步。
  软件包:chrony
  服务名:chronyd
  命令程序:chronyc
  配置文件:/etc/chrony.conf 
View Code

3.启动chronyd服务&&设置服务随机自启

 rpm -q chrony
 systemctl status chronyd
 systemctl start chronyd
 systemctl enable chronyd
View Code

4.常用命令

 #a.查看时间同步源
M:信号源的模式。^表示服务器,=表示对等方
S:源的状态,*表示chronyd当前同步到的源。+表示可接受的来源

 #b.立刻手动同步时间
  #不必立刻手动同步,因为找到服务器后就会帮你同步,最多一分钟以内就帮你实现同步了。
 chronyc -a makestep 
 【使用date -s设置一个错误时间后,使用chronyc -a makestep 立刻手动同步,时间会恢复吗】

 #c.检查时间是否同步
  chronyc tracking
    Reference ID  : CB6B0658 (203.107.6.88)  
    #同步到的服务器ID与IP地址
 #d.修改时间并恢复
   date -s 2021-3-1
   systemctl restart chronyd
   date #恢复到正确时间(会有延时)
View Code

6.2 案例

1.配置服务端

vim /etc/chrony.conf
 #a.添加阿里NTP服务
  server ntp.aliyun.com iburst
  server ntp1.aliyun.com iburst
 #b.允许所有网段客户端进行时间同步(31行附近)
  allow 0.0.0.0/0    #或192.168.0.0/16
                     #或指定的ip                     
 #c.重启chronyd服务
  systemctl restart chronyd
 #d.查看时间同步源
  chronyc sources -n
View Code

2.配置客户端

 #修改配置文件
  vim /etc/chrony.conf 
 #a.注释其他server开头的配置,添加本地NTP公共时间同步服务器
  server 192.168.0.24 iburst
 #b.重启chronyd服务&&设置服务随机自启
  systemctl restart chronyd
  systemctl enable chronyd
 #c.查看时间同步源
  chronyc sources -n
View Code

7. Rsync+inotify数据同步

7.1 rsync远程同步

 1.概述

 rsync(Remote Sync):数据同步与增量备份的工具。
 cpscp、tar是完全备份,rsync除了完整备份,还能实现增量备份和数据同步。
View Code

2.语法和选项

 #a.本地同步语法
  rsync 选项…  本地目录A   本地目录B   #同步整个目录
  rsync 选项…  本地目录A/  本地目录B   #只同步目录下的数据
 #b.远程同步语法
 rsync 本地目录  用户名@对方IP地址:/目标目录  #同步源目录本身
 rsync 本地目录/ 用户名@对方IP地址:/目标目录 #同步源目录下内容
 【这里的用户名代表什么意思?用user1报错】
 #c.常用选项
 -n       测试同步过程,不做实际修改
 --delete 删除目标目录下多余的文档
 -v       显示详细操作信息
 -z       传输过程中启用压缩/解压缩
 -a       递归同步,包含目录/子目录及所有文件、保留符号链接文件、保留文件权限、时间标记、保留文件的属主/属组标记、保留设备文件及其他特殊文件
View Code

3.本地同步

 yum -y install rsync
 rsync -avz /test1 /test2
View Code

4.远程同步

 yum -y install rsync #客户端和服务端都要安装
 rsync -avz /test1/ root@192.168.0.28:/opt
                   #要输入远程主机用户的密码
View Code

7.2 rsync+inotify实时同步

1.inotify概述

 inotify是Linux内核用于通知用户文件系统变化的机制,如文件增加、删除等事件可以立刻让用户得知。 
 可以和rsync结合使用,inotify监控到文件发生变化,rsync就去同步,达到实时同步的效果。(一般不会用于文件内容实时同步,主要用于文件增加或被删的实时同步)
View Code
2.inotify使用方式
 #命令格式
  inotify  选项  目标文件
 #常用选项
  -m  持续监控,捕获一个事件后不退出
  -r  递归监控,包括子目录
  -q  减少屏幕输出信息
  -e  指定监控的:modify(修改),create(创建),delete(删除),attrib(权限)
View Code

3.inotify安装及使用

 #a.安装依赖
  yum -y install gcc
 #b_1.yum安装
  yum -y install inotify-tools 
 #b_2.源码安装过程:
  #官网下载源码包并解压
  http://download.sf.net/inotify-tools/,点击inotify-tools文件夹,选择3.13版本,点击inotify-tools-3.13.tar.gz下载,拖动到/opt目录中。
  (也可以直接wget --no-check-certificate https://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz)
  tar -xf inotify-tools-3.13.tar.gz 【文件颜色为什么这样】
  cd inotify-tools-3.13/
  #c.configure检查系统环境并指定路径与功能
   ./configure #若是出现error表示缺少源码包
   ./configure --prefix=/usr/local/inotify-tools
  #d.编译并安装
   make&&make install
  #e.将命令程序链接到PATH路径下,方便后期的使用【软连接绝对路径】
   cd /usr/local/inotify-tools/bin
   ls #inotifywait(命令)  inotifywatch
   ln -s /usr/local/inotify-tools/bin/inotifywait /sbin
  #f.测试
   #打开一个终端监控/opt目录
    inotifywait -mrq -e modify,create,delete,attrib /opt
   #在第二个终端创建一个文件
    touch a.txt
   #此时在第一个终端会显示信息
View Code

4.配置实时监控

 本地某个目录发生变化就进行同步,可以本地同步也可以远程同步
 #a.做好免密登录
  ssh-keygen  #生成公私钥
  ssh-copy-id root@192.168.0.80
 #b.用脚本进行监控并远程同步
  #没有-m选项,否则本次while退不出,只能监控一次/opt目录。
  #一个q减少输出,两个q不显示输出
  #若用rq,while inotifywait -rqq -e modify,create,delete,attrib /opt/ &> /dev/null
  vim monitor.sh 
#!/bin/bash
while inotifywait -rqq -e modify,create,delete,attrib /opt/
do
   rsync -az --delete  /opt/ root@192.168.0.80:/opt/a
done &
 
  chmod +x monitor.sh
  ./monitor.sh #也可以放到后台运行
 #c.停止脚本
  ps -ef | grep monitor.sh  
  kill pid
 #d.设置开机自动执行monitor.sh脚本
  chmod +x /etc/rc.d/rc.local #给/etc/rc.local指向的文件添加执行权限
  vim /etc/rc.local
    最后一行添加:
    bash /root/monitor.sh
View Code

 8.Ansible批量运维管理

8.1 Ansible介绍

1.DevOps思想

  使开发和运维之间以重复性的方式更好地沟通协作。可以使用符合DevOps思想的软件,工具,平台。
  Ansible是符合DevOps思想的批量管理工具。
View Code

2.Ansible介绍

  Ansible是一个基于Python语言开发批量管理工具。采用模块化设计,并且支持自定义模块。
  Ansible基于Paramiko(pe挼迷扣)模块实现SSH协议批量链接,不需要在客户端主机安装Agent(默认只要被管理节点开启SSH服务,Ansible就可以管理远程主机)
  Ansible基于PyYAML(批外鸭某)模块支持Playbook(就是ansible的脚本),可以通过Playbook完成可重复的复杂工作
  Ansible通过Roles(角色)比Playbook更加强大,适合部署大型的环境(搭建OpenStack云平台)
View Code

3.Ansible组成部分

 Ansible核心程序:可以调用模块
 Host lnventory:清单文件,Ansible管理的主机信息,包括P地址、SSH端口号、账号、密码
 Core Modules:核心模块(3000多个),所有任务均由模块完成
 Custom Modules:自定义模块,完成核心模块无法完成的任务,支持任意语言编写
 Plugins:众多的插件,如Connection Plugins连接插件能建立Ansible与其他主机间的通信 
 Playbooks:YAML格式,模块化定义一系列任务,供外部统一调用                Playbooks的所有功能可以通过shell脚本实现
           ansible执行shell脚本也可以对远程主机进行批量管理   
View Code

8.2 Ansible文件

1.主配置文件

 vim /etc/ansible/ansible.cfg
  14 #inventory  = /etc/ansible/hosts  #默认清单文件位置
  22 #sudo_user  = root    #ansible以root身份管理连接主机
  26 #remote_port = 22     #远程的ssh端口默认使用22号端口
View Code

2.默认清单文件

 vim /etc/ansible/hosts
 #定义主机方式1(一台一台定义,不适合批量管理)
 host80 #可以写每个机器的主机名或ip地址。若写主机名要做本地解析
 host40
 #定义主机方式2(通过组名管理,适合批量管理)
 [组名]
 host80 #要管理的主机名或ip,以后通过组名管理这些机器
 host40
 #定义主机方式3(主机名有规律时)
 www[001:006].example.com
 host[11:12]
View Code

8.3 实验配置

1.实验环境准备

  实验机3台,1台为ansible管理主机,2为被管理主机
  ansible-server  192.168.0.60
  host60          192.168.0.80
  host40          192.168.0.40
View Code

2.管理主机操作

 #a.关闭防火墙与SElinux
 systemctl stop firewalld
 systemctl disable firewalld
 iptables -F #清空iptables
 setenforce 0
 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
 #b.修改/etc/hosts文件实现本地解析
  vim /etc/hosts
  ...
  192.168.0.80 host80
  192.168.0.40 host40
 #c.ssh密钥认证
 ssh-keygen
 for i in host80 host40
 do
   ssh-copy-id $i
 done
 ssh  host80
 ssh  host40
 #d.安装阿里的epel源(Base源用于安装ansible所需依赖)
 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo;wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
 #e.安装ansible软件包
 yum -y install ansible
 ansible --version
 #f.编辑清单文件定义主机组
 vim /etc/ansible/hosts
 [websrvs]
 host80 
 host40
 #g.列出指定组内主机列表
 ansible websrvs --list-host
View Code

8.4 Ansible命令

1.命令格式

ansible 组名/主机  [-m 模块名] [-a 具体操作]
View Code

2.使用ping模块测试websrvs组内主机ssh连通性 

 #a.返回信息说明:
    #对host60和host40两个主机执行操作了,
    #SUCCESS代表执行成功了
    #调用了/usr/bin/python执行ping模块
    #模块执行成功后的返回信息:
      #"changed": false,表示未对远程主机造成改变(也可以通过返回值的颜色来判断命令的执行结果)
      #"ping": "pong"         #pong证明执行成功了

 #b.Ansible命令返回值的颜色判断命令执行的结果
  绿色:代表命令执行成功了,没有对远程节点造成改变
  黄色:代表命令执行成功了,对远程节点造成了改变
  红色:代表你的命令执行失败或者是有异常,反正就是错误了
  粉色:代表命令执行后发出的警告信息,给我们一些建议(可以忽略)
  
View Code

3.ansible-doc命令介绍

 常用选项:
ansible-doc -l  #列出所有模块列表(/搜索,q退出)
ansible-doc -s  #查看模块帮助信息(会显示模块的参数)
     ansible-doc -s ping #查看ping模块的帮助信息
    ansible-doc -s command #查看command模块的帮助信息
View Code

8.5 Ansible常用模块介绍

1.command 默认模块和shell模块

#1.command模块和shell模块的区别
 command模块为默认模块,用于远程执行命令。
 shell模块和command模块类似用于远程执行命令。
 区别在于shell模块通过远程主机的/bin/bash程序处理命令。      
 而command模块在远程主机中执行命令时,不会经过远程主机的bash处理,在使用command模块执行命令时"<,>,|,;,&" 等符号的功能会失效
 
#2.使用案例
ansible websrvs -a 'uname -r'#查看组内主机内核信息
ansible websrvs -a 'free -h' #查看资源利用率(内存信息)
ansible websrvs -a 'df -h /' #查看根分区利用率
ansible websrvs -a 'rm -rf /opt/*' #特殊符号*没起作用
ansible websrvs -m shell -a 'rm -rf /opt/*'
ansible websrvs -m shell -a 'systemctl stop firewalld && systemctl disable firewalld' #关闭防火墙&&设置开机不自起

#3.常用参数
 #chdir参数表示执行命令之前,会先进入到指定的目录中
 ansible websrvs -m command -a 'chdir=/opt touch xx.txt'  
 #creates参数表示如果/etc/passwd文件存在于远程主机中,则不执行对应命令,如果不存在,才执行”touch”命令
 ansible websrvs -m command -a 'creates=/opt/xx.txt touch /opt/xx.txt' 
 #removes参数表示如果/opt/abc文件不存在,就不执行“mv”命令,如果文件存在则执行“mv”命令
ansible websrvs -m command -a 'removes=/opt/abc mv /opt/abc /root/'
 #cmd参数指定用于执行的命令(用于在Playbook剧本中)
View Code

2.script模块

#1.script模块概述
  script模块用于远程执行脚本,脚本存放在ansible主机本地,不需要拷贝到远程主机

#2.使用案例
ansible websrvs -m script -a '/root/yum1.sh'
View Code

3.copy模块

#1.copy模块概述
  用于将文件复制到远程主机(shell中scp一次只能针对一个主机拷贝。)

#2.常用参数
 src:此参数用于指定需要拷贝的文件或目录
 dest:此参数用于指定文件将拷贝到远程主机的哪个目录中
 force:当远程主机目标路径中已经存在与ansible主机中的文件内容不同的同名文件时是否对远程主机的文件强制覆盖,默认yes覆盖,设置为no,则不会覆盖。
 backup:当远程主机目标路径中已经存在与ansible主机中的文件内容不同的同名文件时是否对远程主机的文件进行备份,设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
 owner:指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
 group:指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错  
 mode:指定文件拷贝到远程主机后的权限,如果你想将权限设置为”rw-r–r–“,则可以使用mode=0644表示  
  
#3.使用案例    
 #a.将本地/tmp/test.txt文件拷贝至ftp组内主机的/var/ftp目录下
 ansible websrvs -m copy -a 'src=/tmp/test.txt dest=/var/ftp/'
 #b.当远程主机的目标路径中存在同名文件且与ansible主机中的文件内容不同时,不执行覆盖
 ansible websrvs -m copy -a 'src=/tmp/test.txt dest=/var/ftp/test.txt force=no'
 #c.当远程主机的目标路径中存在同名文件且与ansible主机中的文件内容不同时,先对远程主机文件进行备份,再进行拷贝操作(拷贝文件格式如下:test.txt.21115.2022-08-15@18\:49\:18~)
ansible websrvs -m copy -a 'src=/tmp/test.txt dest=/var/ftp/test.txt backup=yes' 
 #d.拷贝文件到远程主机,并指定属主为xiaobai,所属组为xiaohei
 ansible websrvs -m shell -a 'useradd xiaobai;groupadd xiaohei'
 ansible websrvs -m copy -a 'src=/tmp/test.txt dest=/var/ftp/ owner=xiaobai group=xiaohei'
 #e.拷贝文件到远程主机,并指定权限为0744
 ansible websrvs -m copy -a 'src=/tmp/test.txt dest=/var/ftp/ mode=744'
 ansible websrvs -a 'ls -l /var/ftp/test.txt' #查看
 ansible websrvs -m shell -a 'chmod 755 /var/ftp/test.txt'#修改
View Code

4.yum模块

View Code

5.service 模块

View Code

8.6 Ansible剧本Playbook

1.Playbook概述

#1.Playbook概述  
  Playbook是ansible中类似脚本的文件,是由一个或多个"play"组成的列表。用于配置,部署,和管理被控节点。ansible会按照playbook中的剧本一步一步执行。剧本需要遵循YAML语法格式编写。

#2.playbook核心属性 
 hosts:执行的远程主机列表
 remote_user:指定以远程主机哪个用户的身份执行命令
 tasks:任务集
 variables:内置变量或自定义变量在playbook中调用
 tempaltes模板,可替换文件中的变量并实现一些简单逻辑的文件
 handles和notify结合使用,由特定条件触发的操作,满足条件方执行,否则不执行
 tags标签,指定某条任务执行,用于选择运行playbook中的部分代码。
View Code

2.YAML语法

#1.YAML语法特点
  YAML是一个类似于XML、JSON的标记性语言,它强调以数据为中心,并不是以标识语言为重点,是一种人性化的数据格式语言。
  YAML的语法特点:
   ·严格区分大小写
   ·使用缩进表示层级关系,只允许使用空格不能用tab。(缩进的空格数量没有严格要求,只要相同层级的属性左对齐即可)
   ·#号表示注释
   ·书写YAML切记:后边要加一个空格
   ·若需要将多段YAML配置放在同一个文件中,中间需要用---作为分格

#2.YAML语法示例
【在json中没有】
zhangsan:   
 age: 30 
 address: tianjin 
 gongzuo: laoban 
---
lisi: 
 age: 30
 address: beijing
 gongzuo: xxxxx
---

#3.YAML语法支持的数据类型
1.纯量(类似变量):单个的,不可再分的值(纯量是1对1,对象是1对多)
 #a.整数
  c1: 123
 #b.浮点型(小数)
  c2: 123.1
 #c.布尔类型
  c3: true(真), false(假)
 #d.null类型(使用~表示null)
  c4: ~ #等价与c4: null
 #e.日期类型(格式必须是yyyy-MM-dd)
  c5: 2021-06-18
 #f.时间类型
   #时间和日期之间使用T连接,+代表时区,08:00是中国的时区,东八区
  c6: 2021-06-18T23:21:31+08:00
 #g.字符串类型(字符串中间有特殊字符用单引或双引括起来)
  c7: 'thi* ! $nmko'

2.对象:键值对的集合,又称为映射(mapping)哈希(hash)字典(dictionary)
 #a.对象形式一(推荐)
 thinkmo: 
  age: 12
  address: tianjin
 #b.对象形式二(了解)
 thinkmo: {age: 12,address: tianjin]


3.数组:一组按次序排列的值,又称为序列(sequence)列表(list)
 #a.数组形式一(推荐)
 xinmeng: 
  age: 12
  address: #数组中有两个值,不一定要用chengshi,可以随便写
  - chnegshi: tianjin
  - chnegshi: beijing
 #b.数组形式二(了解)
 address: [tianjin,beijing]
View Code

3.编写第一个Playbook剧本

#1.使用ping模块测试远程主机联通性,并在远程主机创建目录vim  
ping_websrvs.yml
---
- hosts: websrvs
  remote_user: root
  tasks: 
  - name: ping websrvs #定义任务名称ping websrvs
    ping:              #调用ping模块
  - name: touch file   
    shell: touch /opt/a.txt 
    
对应JSON语法如下:   
[
  {
    "hosts": "websrvs",
    "remote_user": "root",
    "tasks": [
      {
        "name": "ping websrvs",
        "ping": null
      },
      {
        "name": "touch file",
        "shell": "touch /opt/a.txt"
      }
    ]
  }
]    

#2.代码解释
 #第一行
  playbook剧本以---开头表明yam1格式文件
  (若只有一个任务,---可以不写,一段---就是一个play)
 #第二行
  使用"-"作为开头,表示以数组方式定义
  hosts关键字指定要操作的主机组名
 #第三行: 
  remote_user关键字可以指定在进行远程操作时使用哪个用户进行操作
 #第四行: 
  tasks关键字是用来指定要执行哪些操作任务

#3.运行剧本
 ansible-playbook ping_websrvs.yml
View Code

4.Playbook源码部署Nginx的Web服务

[root@ansible-server ~]# vim nginx.yml
---
- hosts: websrvs
  remote_user: root
  tasks:
  - name: Copy nginx
    copy: src=/root/nginx-1.18.0.tar.gz dest=/tmp
  - name: install Rely
    yum: name=gcc,pcre-cevel,openssl-devel,zlib
    #等价于shell: yum -y install gcc pcre-cevel openssl-devel zlib
  - name: unpacek nainx
    shell: tar -xf /tmp/nginx-1.18.0.tar.gz -C /tmp
  - name: install nginx
    shell: cd /tmp/nginx-1.18.0 && ./configure && make && make install
  - name: start nginx
    shell: /usr/local/nginx/sbin/nginx

#--syntax-check 用于检测playbook语法是否正确,如果正确只返回playbook名称
ansible-playbook --syntax-check nginx.ym1

#--check 用于模拟执行playbook
ansible-playbook --check nginx.yml

#使用playbook剧本批量在远程主机源码安装nginx
ansible-playbook nginx.yml

注意:
  这些功能直接用shell脚本就可以实现。就不用注意语法,对齐,属性了。
  若要使用shell脚本源码安装nginx,第一步先用ansible把tar.gz包拷贝到每台主机(命令行一条命令就可以了)。然后用shell脚本。
  play不是必须要掌握的东西,但学ansible不知道playbook也不行。
  playbook还有循环,变量,条件判断,角色(部署大型的复杂环境)
View Code

 

 

 

posted @ 2022-07-25 12:22  8300110  阅读(98)  评论(0)    收藏  举报
levels of contents