70.Linux搭建准备工作:

1.Linx上网问题:

  • 图示:

    image-20221231104955090

  • 结论:

    • Linux通过windows的物理网卡进行上网
    • 如果VM8虚拟网卡禁用,即Linux与windows主机无法ping通;
    • Linux是可以进行上网的

2.配置白名单和安全组:

  • 直接修改文件内容,重启系统生效:

    1
    vim /etc/selinux/config
  • selinux的取值:

    说明
    enforcing 强制模式,会阻止你的进程来访问对应的资源(不符合selinux策略规则的情况)
    permissive 宽容模式:只会有告警,不会阻止进程来访问资源
    disabled 关闭selinux
  • 查看setlinux的属性值:

    1
    getenforce
  • 通过命令临时修改selinux值:

    1
    setenforce [num]     # 0:permissive,1:enconfig

3.配置防火墙:

  • 防火墙根据配置文件/etc/sysconfig/iptables 来控制本机的“出”“入”网络访问行为

    参数 说明
    status 查看防火墙状态
    start 启动防火墙
    stop 关闭防火墙
    disable 开机禁用
    enable 开机启用
    1
    systemctl status firewalld
    1
    systemctl start firewalld
    1
    systemctl stop firewalld

4.配置网络yum源:

  • 方式一:

    1
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
  • 方式二:

    • repos.d的配置文件

      1
      2
      链接:https://pan.baidu.com/s/15RA1D2RX_8dkLMw3Pl4bhA 
      提取码:abcd
    • 打开yum.repos.d目录,上传配置文件:

      1
      cd /etc/yum.repos.d/
    • 清除以前的文件,加载上传文件:

  • 清除以前的文件,加载上传文件:

    1
    2
    yum clear all
    yum repolist
  • 安装:(出现complete为成功)

    1
    yum install bind-utils -y

1.第一章:

1.通配符:

  • 常见通配符:

    通配符 说明
    * 任意的字符重复任意多次
    ? 重复1次
    {n1..n2} 这个是一个连续的n1-n2的范围
  • 使用:

    1
    touch file{1,5}

2.单一执行的例行工作:at命令

  • 单一执行的例行性工作:仅处理执行一次就结束了

    1
    at -> atd
  • 使用 at 命令来生成所要运行的工作,系统将这个工作,以文本方式写入/var/spool/at/目录内,该工作便能等待 atd 这个服务的取用与执行了

  • 了安全问题,不是所有人都可以进行 at 工作调度。我们可以利用/etc/at.allow和/etc/at.deny 这两个文件来进行 at 的使用限制

    1
    2
    cat /etc/at.allow
    cat /etc/at.deny
  • at命令的实际工作过程

    1. 寻找到/etc/at.allow文件存在,写在这个文件的用户才能使用at命令
    2. /etc/at.allow不存在,则寻找/etc/at.deny文件,写在该文件的用户不能使用at命令
    3. 若两个文件都不存在,那么只有root可以使用at命令
  • 命令格式:at [参数] [时间]

  • 参数:

    参数 说明
    -m(mail) 当任务完成之后,即使没有标准输出,将给用户发送邮件
    -l(atq) atq的别名,可列出目前系统上面的所有该用户的at调度
    -d(atrm) atrm的别名,可以取消一个在at调度中的工作
    -v(verbose) 使用较明显的时间格式,列出at调度中的任务列表
    -c(cat) 可以列出后面接的该项工作的实际命令内容
    -f(file) 从文件中读取作业
  • 时间取值格式:

    参数 说明
    HH:MM 在今天的HH小时MM分钟执行,如果今天的这个时间点已经过了,则明天执行
    HH:MM YYYY-MM-DD 强制规定在某年某月的某一天的特殊时刻进行该工作
    now + 2 minutes 从现在开始几分钟minutes, hours, days, or weeks
    更多请man at查看…….
  • 使用:Ctrl+D结束交互

    1
    2
    3
    # 命令执行的在一分钟后向本用户发送邮件
    at -m now + 1 minutes
    at>
    1
    2
    # 定义三分钟之后显示hello
    at now + 3 minutes

3.使用网易邮箱发送邮箱:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 授权码,网易设置处邮箱获取
JPLJTOSJZGDBEJLU
# 安装邮箱软件
yum install sendmail -y
yum install mailx -y
# 启动sendmail服务
systemctl start sendmail
# 方式一:
# 发送给系统内部用户
echo "邮箱内容" | mail -s "标题" [接受用户]
# 在对应用户查看邮箱
mail
# 方式二:
# 修改配置文件,内容如下所示
vim /etc/mail.rc
# 修改完成后重启服务
systemctl restart sendmail
# 发送
echo "邮箱内容" | mail -s "标题" [外部接受用户]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 开启ssl
set ssl-verify=ignore
# 下方输入证书目录,下方为centos系统证书默认位置,也自行生成证书并指定
set nss-config-dir=/etc/pki/nssdb
# 下方填入你配置的第三方smtp服务器的地址及端口,如果使用的是云服务器,安全组需要开放465端口(入口和出口)
set smtp=smtps://smtp.163.com:465
# 认证方式
set smtp-auth=login
# 设置发信人邮箱昵称
set smtp-auth-user=qv1095322098@163.com
# 下方输入上方邮箱的客户端授权码
set smtp-auth-password=JPLJTOSJZGDBEJLU
# 下方输入用于发送邮件的邮箱账号
set from=qv1095322098@163.com

4.循环执行的例行性工作:crontab命令:

  • 循环执行的例行性工作:每隔一定的周期就需要执行一次

  • 循环执行的例行性工作调度是由crond这个系统服务来控制的。同样,我们也可以限制使用crontab的用户账号

  • crontab命令的实际工作过程

    1. 以账号来判别是否可使用crontab命令
      • /etc/cron.allow 将可以使用 crontab 的账号写入其中,若不在该文件内的用户,则不可使用 cronta
      • /etc/cron.deny 将不可以使用 crontab 的账号写入其中,若不在该文件内的用户,则使用 crontab
    2. 当用户使用 crontab 新建工作调度之后,该项工作就会被记录到/var/spool/cron/里面
    3. cron 执行的每一项工作都会被 记录到/var/log/cron这个日志文件中
  • 命令格式: crontab [-u user] [-l | -r | -e]

  • 参数

    参数 说明
    -u(user) 只有 root 才能进行这个任务,帮某个用户新建/删除 crontab
    -e(edit) 编辑 crontab 的工作内容
    -l(list) 查阅 crontab 的工作内容
    -r(remove) 删除所有的 crontab 的工作内容
  • 编辑 crontab 文件格式为:每一行为一个工作,每项工作具有六个字段

    代表意义 分钟 小时 日期 月份 命令
    数字范围 0-59 0-23 1-31 1-12 0-7,0和7都代表周日 执行的命令
  • 编辑 crontab 文件内的特殊字符:

    特殊字符 含义
    * 代表任何时刻
    代表分隔时段
    - 代表一段时间范围
    /数字 指定时间的间隔频率,例如每 3 分钟进行一次,*/3
  • 使用:

    1
    crontab -l
    1
    2
    3
    4
    crontab -u qv123 -e 
    # 编辑文件内容
    42-45 16 * * * echo "qv123" # 在每月每天不分星期天的16点42-45分钟,每一分钟控制台输出qv123
    42-45 16 * * * wall "qv123" # 在每月每天不分星期天的16点42-45分钟,每一分钟控制台输出闹钟qv123

5.系统的例行性任务:

  • 在 /etc/crontab 文件中执行

    1
    vim /etc/crontab
  • 说明:

    1
    2
    3
    4
    5
    SHELL=/bin/bash     # 运行计划所使用的shell 默认是bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin # 指定命令执行环境变量路径
    MAILTO=root # MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户

    * * * * * user-name command to be executed # user-name表示执行命令的用户是谁
  • 当需要同一时间执行多个脚本时,可以将这多个脚本放在一个目录下,然后使用 run-parts 来执行

  • run-parts:该命令可将后面接的“目录”内的所有文件找出来执行。

    1
    01 * * * * root run-parts /etc/cron.hourly
    1
    systemctl restart crond

6.可唤醒停机期间的工作任务:

  • anacron 可以处理关机状态时未执行的计划任务

  • anacron不能指定何时执行某项任务,而是以天为单位或是在开机后立刻进入anacron的操作(/etc/anacrontab)

    1
    vim /etc/anacrontab
  • 它会去检测停机期间应该进行但是并没有进行的crontab任务,并将该任务执行一遍,然后anacron就会自动停止了

2.第二章-chrony服务器:

1.概念:

  • Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件

  • 它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务

  • Chrony由两个程序组成,分别是chronyd(服务端)和chronyc(客户端)

  • chronyd是一个后台运行的守护进程用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿

  • chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作

  • NTP 是网络时间协议(Network Time Protocol)的简称,通过 udp 123 端口进行网络时钟同步

    1
    cat /etc/services      # 查看服务端口
  • RHEL7中默认使用chrony作为时间服务器,也支持NTP,需要额外安装。NTP与chrony不能同时存在,只能用其中一个

2.安装与配置:

  • 安装:

    1
    yum -y install chrony
  • 启动进程:

    1
    2
    systemctl enable chronyd
    systemctl start chronyd
  • Chrony的配置文件是/etc/chrony.conf

    1
    2
    # 查看配置文件帮助
    man 5 chrony.conf
  • 配置文件详情:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    # 使用 pool.ntp.org 项目中的公共服务器。以server开,理论上想添加多少时间服务器都可以。
    pool 2.rhel.pool.ntp.org iburst

    # 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。
    driftfile /var/lib/chrony/drift

    # 如果系统时钟的偏移量大于1秒,则允许系统时钟在前三次更新中步进。
    makestep 1.0 3

    # 启用实时时钟(RTC)的内核同步。
    rtcsync

    # 通过使用 hwtimestamp 指令启用硬件时间戳
    #hwtimestamp *

    # 增加调整系统时钟所需的最小可选源数量。
    #minsources 2

    # 指定 NTP 客户端地址,以允许或拒绝连接到扮演时钟服务器的机器
    #allow 192.168.0.0/16

    # 即使没有与时间源同步,也可以提供时间;即:如果时间源同步失败,将本地层级设置为10。
    #local stratum 10

    # 指定包含 NTP 身份验证密钥的文件。
    #keyfile /etc/chrony.keys

    # 指定日志文件的目录。
    logdir /var/log/chrony

    # 选择日志文件要记录的信息。
    #log measurements statistics tracking

3.配置时间服务器:

  • 修改配置文件:

    1
    vim /etc/chrony.conf
  • 设置开机启动,重启服务

    1
    2
    systemctl enable chronyd
    systemctl restart chronyd
  • 查看时间同步状态

    1
    timedatectl status
  • 开启网络时间同步

    1
    timedatectl set-ntp true
  • 添加阿里云服务器代替pool 2.rhel.pool.ntp.org iburst同步时间,可添加多个

    1
    server ntp.aliyun.com iburst
  • 修改允许通过客户端地址

    1
    allow 192.168.0.0/16
  • 也在向其他服务器提供时间服务

    1
    local stratum 10

4.chronyc 命令:

  • 查看 ntp_servers,-v 详细信息

    1
    chronyc sources -v
    1
    2
    3
    MS Name/IP address         Stratum Poll Reach LastRx Last sample               
    ===============================================================================
    ^* 203.107.6.88 2 6 77 33 -1793us[-7154us] +/- 42ms
    属性 说明
    M 这表示信号源的模式,^表示服务器,*=表示对等方,#*表示本地连接的参考时钟
    S 指示源的状态,* 表示chronyd当前同步到的源,+ 表示可接受的信号源,与选定的信号源组合在一起,- 表示被合并算法排除的可接受源,? 指示已失去连接性或其数据包未通过所有测试的源,x 表示chronyd认为是虚假行情的时钟(即,其时间与大多数其他来源不一致),〜 表示时间似乎具有太多可变性的来源
    Name/IP address 这显示了源的名称或IP地址,或参考时钟的参考ID
    Stratum 这显示了来源的层,层1表示一台具有本地连接的参考时钟的计算机。与第1层计算机同步的计算机位于第2层。与第2层计算机同步的计算机位于第3层
    Poll 这显示轮询源的速率,以秒为单位的时间间隔的以2为底的对数
    Reach 这显示了源的可达性寄存器以八进制数字打印。寄存器有8位
    LastRx 此列显示多长时间前从来源接收到了最后一个好的样本
    Last sample 此列显示上次测量时本地时钟与源之间的偏移,方括号中的数字表示实际测得的偏移量。可以用ns(表示纳秒),us (表示微秒),ms(表示毫秒)或s(表示秒)作为后缀。方括号左侧的数字表示原始测量值,已调整为允许此后施加于本地时钟的任何摆度。*+/-*指示器后面的数字表示测量中的误差范围。正偏移表示本地时钟位于源时钟之前
  • 通过chronyc命令临时添加同步服务器,重启chronyd进程后失效:

    1
    chronyc add server ntp.aliyun.com iburst
  • 查看 ntp_servers 状态,-v 详细信息

    1
    chronyc sourcestats -v
  • 查看 ntp_servers 是否在线,-v 详细信息

    1
    chronyc activity -v
  • 查看 ntp 详细信息,-v 详细信息

    1
    chronyc tracking -v
    属性 说明
    Reference ID 与之进行同步的ntp服务器的参考ID(一串16进制数字)和名称(或ip地址)
    Stratum 与附加硬件参考时钟的计算机stratum1)的距离
    Ref time (UTC) 来自参考时间源的最后测量的UTC时间
    System time 正常情况下,chronyd默认不会步进调整时钟,因为时间的跳跃会有对某些应用程序造成不良后果的风险
    Last offset 最后一次时钟更新时估计的本地偏移量
    RMS offset 偏移量的长期平均值
    Frequency 如果chronyd不进行校正,系统时钟出错的频率
    Residual freq 当前选择的参考时间源的‘residual frequency’。表示从参考时间源测量到的频率与当前使用的频率之间的差值
    Skew 频率上的估计误差范围
    Root delay 本计算机到最终同步的stratum-1计算机的网络路径延迟的总和
    Root dispersion 通过所有经过的计算机,回到最终同步的stratum-1计算机累积的总弥散
    Update interval 最后两次时钟更新的时间间隔
    Leap status 可能值为Normal、Insert second、Delete second、Not synchronized
  • 强制同步下系统时钟

    1
    chronyc -a makestep

3.第三章-远程连接服务器:

1.概念:

  • 远程连接服务器:通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在系统前面一样
  • 远程连接服务器的功能:
    • 分享主机的运算能力
    • 服务器类型:有限度开放连接
    • 工作站类型:只对内网开放
  • 远程连接服务器的类型(以登录的连接界面来分类)
    • 文字接口
    • 明文传输:Telnet、RSH等,目前非常少用
    • 加密传输:SSH为主,已经取代明文传输
    • 图形接口:XDMCP、VNC、XRDP等
  • SSH(Secure Shell Protocol,安全的壳程序协议)它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。
  • ssh协议本身提供两个服务器功能:
    • 类似telnet的远程连接使用shell的服务器
    • 类似ftp服务的sftp-server,提供更安全的ftp服务

2.连接加密技术:

  • 对称密钥:使用同一个密钥进行加密发送给对方和对方收到后解密;问题:如何保证密钥的安全

    image-20230211174208189 image-20230211174244525
  • 非对称密钥:使用公钥将数据加密,使用私钥对数据进行解密;问题:如何确保服务器的身份(把责任甩给客户端,看客户端是否登录)

    image-20230211174448543

  • 目前常见的网络数据包加密技术通常是通过“非对称密钥系统”来处理的。主要通过两把不一样的公钥与私钥来进行加密与解密的过程。

  • 公钥(public key):提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密

  • 私钥(private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有

  • SSH在连接的时候使用非对称加密,在传输数据时候使用对称加密

  • SSH工作过程:(在整个通讯过程中,为实现SSH的安全连接,服务端与客户端要经历如下五个阶段)

    过程 说明
    版本号协商阶段 SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本
    密钥和算法协商阶段 SSH支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的算法
    认证阶段 SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证
    会话请求阶段 认证通过后,客户端向服务器端发送会话请求
    交互会话阶段 会话请求通过后,服务器端和客户端进行信息的交互
  • 一:版本协商阶段:(client:SSH-2.0-JSCH_FinalShell_214,server:SSH-2.0-OpenSSH_8.0)

    1. 启动了sshd服务之后,服务会默认监听22号端口,客户端向服务发起tcp请求

    2. TCP连接建立后,服务器向客户端发送第一个报文

      1
      2
      # SSH-<主协议版本号>.<次协议版本号>.<软件版本号>
      # 例:SSH-2.0-JSCH_FinalShell_214
    3. 客户端收到报文后,比较本机支持的版本和发送的版本;如果客户端支持发送的版本,客户端回应报文

    4. 服务器收到报文后,也同意;则进入密钥和算法协商阶段,否则服务器断开TCP连接

  • 说明:上述报文都是采用明文方式传输。

  • 二:密钥和算法协商阶段

    • 算法协商:(client:Client: Key Exchange Init,server:serve:Key Exchange Init)

      1. 客户端发送算法协商报文给服务端,报文中包含自己支持的算法。

        1
        # 支持的算法:公钥算法列表,加密算法列表,MAC(消息验证码),算法列表,压缩算法列表
      2. 服务端收到的报文得出最终使用的算法,回复客户端。

    • 会话密钥的产生,DH算法:(client:Client: Diffie-Hellman Key Exchange Init,server:Diffie-Hellman Key Exchange Reply, New Keys, Unknown (140,client:New Keys)

      1. 客户端使用适当的客户端程序请求服务器

      2. 服务器会将公钥(由ssh服务计算出的密钥对)和生成的会话ID发送给客户端

        1
        2
        # 密钥对文件/etc/ssh/ssh_host*
        会话ID: ssh断开连接,现在要恢复连接,通过会话ID来确认是不是上一次的连接
      3. 客户端生成会话密钥,用服务器的公钥加密后,发送给服务器;服务器用自己的私钥将收到的数据解密,获得会话密钥

        1
        2
        3
        # 如果客户端使第一次连接到ssh服务器,客户端会将服务器的公钥数据记录到自己家目录下./ssh/known_hosts文件
        # 如果是存在记录,则进行对比
        会话密钥: ssh连接成功之后,使用对称加密对传输的数据进行加密, 使用加密的密钥就是会话密钥
  • 三:认证阶段

    • 基于口令的认证(password认证):

      1. 客户端向服务器发出用password认证请求,将用户名和密码使用公钥加密后发送给服务器
      2. 服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,
      3. 并返回认证成功或失败消息。

      image-20230211174448543

    • 基于密钥的认证(publickey认证)

      1. 手动client发送的公钥保存到Server上登录用户的家目录的.ssh/authorizedkeys文件中
      2. 客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized*keys中的公钥进行对比
      3. 如果相同,服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。
      4. 客户端收到后,使用私钥解密后的随机字符串用会话密钥加密发送给服务器。
      5. 客户端发送的字符串与服务器端生成的字符串的一样,则认证通过,否则,认证失败。

      image-20230211185651811

3.ssh远程连接服务:

  • 安装ssh服务:

    1
    2
    yum -y install openssh-server
    yum list | grep openssh
  • /etc/ssh目录下的配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@manage .ssh]# tree /etc/ssh/
    /etc/ssh/
    ├── moduli : 密钥交换算法ecdh: 商量模数和基数
    ├── ssh_config : 客户端配置文件
    ├── ssh_config.d : 额外的客户端配置文件
    │   └── 05-redhat.conf
    ├── sshd_config : 服务端配置文件
    ├── ssh_host_ecdsa_key 私钥
    ├── ssh_host_ecdsa_key.pub 公钥
    ├── ssh_host_ed25519_key 私钥
    ├── ssh_host_ed25519_key.pub 公钥
    ├── ssh_host_rsa_key 私钥
    └── ssh_host_rsa_key.pub 公钥
  • 修改配置文件:

    1
    vim /etc/ssh/sshd_config
  • 配置文件详情:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    17.#Port 22    #监听端口,默认监听22端口  【默认可修改】
    18.#AddressFamily any #IPV4和IPV6协议家族用哪个,any表示二者均有
    19.#ListenAddress 0.0.0.0 #指明监控的地址,0.0.0.0表示本机的所有地址
    20.#ListenAddress :: #指明监听的IPV6的所有地址格式
    22.# The default requires explicit activation of protocol 1
    23.#Protocol 2 #使用SSH第二版本
    25.# HostKey for protocol version 1 #一版的SSH支持以下一种秘钥形式
    26.#HostKey /etc/ssh/ssh_host_key
    27.# HostKeys for protocol version 2 #使用第二版本发送秘钥,支持以下四种秘钥认证的存放位置
    28.HostKey /etc/ssh/ssh_host_rsa_key # rsa私钥认证 【默认】
    29.#HostKey /etc/ssh/ssh_host_dsa_key # dsa私钥认证
    30.HostKey /etc/ssh/ssh_host_ecdsa_key # ecdsa私钥认证
    31.HostKey /etc/ssh/ssh_host_ed25519_key # ed25519私钥认证
    35.#ServerKeyBits 1024 #主机秘钥长度
    40.# Logging
    41.# obsoletes QuietMode and FascistLogging
    42.#SyslogFacility AUTH
    43.SyslogFacility AUTHPRIV #当有人使用ssh登录系统的时候,SSH会记录信息,信息保存在/var/log/secure里面
    44.#LogLevel INFO #日志的等级
    45.# Authentication:
    48.#LoginGraceTime 2m #登录的宽限时间,默认2分钟没有输入密码,则自动断开连接
    49.#PermitRootLogin yes #是否允许管理员远程登录,'yes'表示允许
    50.#StrictModes yes #是否让sshd去检查用户主目录或相关文件的权限数据
    51.#MaxAuthTries 6 #最大认证尝试次数,最多可以尝试6次输入密码。之后需要等待某段时间后才能再次输入密码
    52.#MaxSessions 10 #允许的最大会话数
    59.AuthorizedKeysFile .ssh/authorized_keys #选择基于密钥验证时,客户端生成一对公私钥之后,会将公钥放到.ssh/authorizd_keys里面
    79.PasswordAuthentication yes #是否允许支持基于口令的认证
    83.ChallengeResponseAuthentication no #是否允许使用键盘输入身份验证,也就是xshell的第三个登录方式
    129.#UseDNS yes #是否反解DNS,如果想让客户端连接服务器端快一些,这个可以改为no
    146.Subsystem sftp /usr/libexec/openssh/sftp-server #支持 SFTP ,如果注释掉,则不支持sftp连接
    154.AllowUsers user1 user2 #登录白名单(默认没有这个配置,需要自己手动添加),允许远程登录的用户。如果名单中没有的用户,则提示拒绝登录
  • 重新加载配置文件:

    1
    systemctl restart sshd

4.配置SSH密钥:

  • 创建密钥对

    1
    2
    3
    4
    ssh-keygen -t rsa -b [字节数]           # ssh-keygen - 生成、管理和转换认证密钥,t制定类型
    # RSA
    # window:C:/用户/user/.ssh/id_rsa私钥文件,linux:~/.ssh/id_rsa私钥文件
    # window:C:/用户/user/id_rsa.pub公钥文件,linux:~/.ssh/id_rsa.pub公钥文件
  • 复制该公钥文件到服务端的该目录下:

    1
    scp [本地的公钥文件路径] root@192.168.40.132:/root/.ssh/authorized_keys
  • 在本地服务器上登陆对端服务器

    1
    2
    3
    ssh 192.168.40.132
    ssh root@192.168.40.132
    ssh -i /root/.ssh/id_rsa root@172.24.8.128

5.sftp用法:

  • 连接远程服务器:

    1
    sftp root@[IP地址]
  • 连接的服务端:ls,mkdir,rmdir,pwd等

  • 本机客户端:lcd,lls,lpwd等

  • 将文件由本机上传到远程主机:文件会存储到当前远程主机的目录下

    1
    put [本机文件] 
  • 将文件由远程主机下载下来:文件会存储在当前本机所在的目录当中

    1
    get [远程主机文件]

4.第四章-Web服务器:

1.www简介:

  • 什么是www :
    • www是world wide web的缩写,也就是全球信息广播的意思。通常说的上网就是使用www来查询用户所需要的信息。www可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方式将信息以Internet传递到世界各处去。
    • 与其他服务器类似,当你连接上www网站,该网站肯定会提供一些数据,而你的客户端则必须要使用可以解析这些数据的软件来处理,那就是浏览器。www服务器与客户端浏览器之间的连接图
  • www所用的协议:
    • HTTP超文本传输协议(HyperText Transfer Protocal),是互联网上最广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。
    • 它是建立在TCP上一种的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事物结束后还会在服务端添加一条日志条目
  • WEB服务器:
    • 指网站服务器,是指驻留与因特网上某种类型计算机的程序,可以向浏览器等WEB客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载
    • 目前最主流的三个WEB服务器是Apache和Microsoft和Internet-信息服务器(Internet Information Services,IIS)unix nginx
  • 主要数据:
    • 服务器所提供的最主要数据是超文本标记语言(Hyper Text Markup Language,HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体)
    • HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式
  • 浏览器:
    • 客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上。
    • 那么著名的浏览器就有内建在Windows操作系统内的IE浏览器了,还有Firefox浏览器和Google的chrome浏览器

2.网址及HTTP简介:

  • web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在某个特殊的目录下面,这个目录就是我们整个网站的首页,在redhat中,这个目录默认在/var/www/html。浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的

  • URL:Uniform Resource Locator,统一资源定位符,它是WWW的统一资源定位标志,就是指网络地址;URL是URI概念的一种实现方式。

    1
    www.qv123.top/index.html
  • URI统一资源标识符,表示Web上每一种可用的资源,如HTML文档,图像,视频片段,程序等都是由一个URI进行标识的;URL是URI的一个子集

  • URI网址格式:**[协议名] : // [用户名] : [密码] @ [服务器地址] : [服务器端口号] / [路径] ? [查询字符串] # [片段ID]**

    • 浏览器常支持的协议有:http、https、ftp等
    • 端口号(port):http为80,https为443 (IANA:互联网数字分配机构)
      • 0-1023:众所周知,永久地分配给固定的应用程序使用,特权端口(只有管理员有权限启用并让进程监听)
      • 1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用:3306/TCP
      • 41952-60000:客户端程序随机使用的端口,动态端口,或私有端口
  • http请求方法:在http通信中,每个http请求报文都包含一个方法,用以告诉web服务器端需要执行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文件等

  • 状态代码:由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值

    • 1xx:指示信息 —— 表示请求已接收,继续处理
    • 2xx:成功 —— 表示请求已被成功接收、理解、接受
    • 3xx:重定向 —— 要完成请求必须进行更进一步的操作
    • 4xx:客户端错误 —— 请求有语法错误或请求无法实现
    • 5xx:服务器端错误 —— 服务器未能实现合法的请求
  • 常见状态代码、状态描述的说明如下:

    • 200 OK:客户端请求成功
    • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
    • 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
    • 403 Forbidden:服务器收到请求,但是拒绝提供服务
    • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL
    • 500 Internal Server Error:服务器发生不可预期的错误
    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
  • HTTP报文:http报文中有很多行内容,这些行的字段内容都是由一些ASCII码串组成,但各个字段的长度是不同的。http报文可分为两种,一种是从web客户端发往web服务器的http报文,称为请求报文。另外一种是从web服务器发往web客户端的报文,称为响应报文

  • http请求报文

    • http请求报文由请求头、请求行、空行和请求体几个部分组成:

    • http响应报文由响应头、状态行、空行和响应体这几个部分组成:

    • MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。后来http也支持了这个功能,用它来描述数据并标记不同的数据内容类型

    • 当web服务器响应http请求时,会为每一个http对象数据加一个MIME类型。当web浏览器获取到服务器返回的对象时,会去查看相关的MIME类型,并进行相应的处理

    • MIME类型存在于HTTP响应报文的响应头部信息里,它是一种文本标记,表示一种主要的对象类型和一个特定的子类型。常见的MIME类型

      MIME类型 文件类型
      text/html html、htm、shtml文本类型
      text/css css文本类型
      text/xml xml文本类型
      image/gif gif图像类型
      image/jpeg jpeg、jpg图像类型
      application/javascript js文本类型
      text/plain txt文本类型
      application/json json文本类型
      video/mp4 mp4视频类型
      video/quicktime mov视频类型
      video/x-flv flv视频类型
      video/x- wmv视频类型
      video/x-msvideo avi视频类型

3.HTTP协议请求的工作流程:

  1. 终端客户在web浏览器地址栏输入访问地址http://www.ceshi.com:80/index.html
  2. web浏览器请求DNS服务器把域名www.ceshi.com解析成web服务器的IP地址
  3. web浏览器将端口号(默认是80)从访问地址(URL)中解析出来
  4. web浏览器通过解析后的ip地址及端口号与web服务器之间建立一条TCP连接
  5. 建立TCP连接后,web浏览器向web服务器发送一条HTTP请求报文
  6. web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文
  7. web服务器关闭HTTP连接,关闭TCP连接,web浏览器显示访问的网站内容到屏幕上

4.www服务器的类型:

  • 仅提供用户浏览的单向静态网页:
    • 单纯是由服务器单向提供数据给客户端,Server不需要与client端有互动,所以你可以到该网站上去浏览,但是无法进行数据的上传
  • 提供用户互动接口的动态网站:
    • 这种类型的网站可以让服务器与用户互动,常见的例如留言板,博客。这种类型的网站需要通过“网页程序语言”来实现与用户互动的行为。常见的例如:PHP网页程序语言,配合数据库系统来进行数据的读、写。当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变
    • 另外一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码(JavaScript)传送给客户端,客户端的浏览器如果提供JavaScript的功能,那么该程序就可以在客户端的计算机上面工作了;另外一种可在客户端执行的就是flash动画格式,在这种动画格式内还可以进行程序设计
    • 搭建动态网站的需求
      1. 可支持的操作系统:让所有需要的软件都能够进行安装。
      2. 可运行的www服务器:例如Apache。
      3. 网页程序语言:Perl(Practical Extraction and Report Language,实用报表提取语言)、PHP(Hypertext Preprocessor,超文本预处理器,是一种通用开源脚本语言)、JSP(Java Server Pages,java服务器页面)、CGI(Common Gateway Interface,公共网关接口)、ASP(Active Server Pages,动态服务器页面)。
      4. 数据存储的数据库系统 :MySQL、MSSQL、Oracle等。
    • LAMP(linux+Apache+MySQL+PHP)
      • Apache主要提供www的服务器平台
      • MySQL:传统的文件读取是很麻烦的,如果你只要读取该文件当中的一小部分,系统还是会将整个文件读出来,若又有人同时读取同一个文件时,那就会造成效率与系统上的问题,所以才会有数据库系统的推出。数据库其实是一种特殊格式的文件,这种文件要通过特殊接口(数据库软件)来进行读写。由于这个特殊接口已经针对数据的查询、写入做过优化设计,因此很适合多人同时写入与查询工作
      • PHP:PHP可以被用来建立动态网页,PHP程序代码可以直接在HTML网页当中嵌入,就像编辑HTML网页一样简单。PHP是一种“程序语言”,这种程序语言可以直接在网页当中编写,不需要经过编译即可执行

5.www服务器的安装:

  • 服务器端:在linux上面实现网页服务器需要Apache这套服务器软件,httpd提供Apache主程序 http://httpd.apache.org/docs/2.4/

  • 安装软件:httpd

    • 卸载httpd:

      1
      rpm -ql httpd
    • 安装httpd:

      1
      yum install -y httpd 
    • 查看httpd文件结构:

      1
      tree /etc/httpd
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      ├── conf           # 存放的主配置文件
      │   ├── httpd.conf
      │   └── magic
      ├── conf.d # 存放额外的配置文件: 必须以.conf为后缀才生效
      │   ├── autoindex.conf # 额外的参数文件
      │   ├── README # 额外的参数文件
      │   ├── userdir.conf # 额外的参数文件
      │   └── welcome.conf # 默认首页得配置文件
      ├── conf.modules.d # 存放有关模块的配置文件, 必须以.conf后缀才生效
      │   ├── 00-base.conf
      │   ├── 00-dav.conf
      │   ├── 00-lua.conf
      │   ├── 00-mpm.conf
      │   ├── 00-proxy.conf
      │   ├── 00-systemd.conf
      │   └── 01-cgi.conf
      ├── logs -> ../../var/log/httpd # logs: 日志存放的位置
      ├── modules -> ../../usr/lib64/httpd/modules # modules: 指定httpd相关模块存放的路径
      └── run -> /run/httpd # run: 运行的一些信息
      └── state -> # state: 状态的一些信息
    • 如果你不想要修改原始配置文件httpd.conf的话,那么你可以将你自己的额外参数文件独立出来,例如你想要有自己的额外设置值,可以将它写入/etc/httpd/conf.d/zhuji.conf(注意,扩展名一定是.conf),而启动Apache时,这个文件就会被读入主要配置文件当中了

    • 默认的首页所在目录/var/www/html/,当输入网址时所显示的数据,就是放在这个目录当中的首页文件(默认为index.html)

    • 默认给一些可执行的CGI(网页程序)程序放置的目录/var/www/cgi-bin/,当输入网址/cgi-bin/时所显示的数据所在

    • 默认的Apache日志文件都放在/var/log/httpd/,对于流量比较大的网站来说,一个星期的日志文件的数据可以达到1GB左右

6.配置文件::

  • 修改主配置文件:

    1
    vim /etc/httpd/conf/httpd.conf
  • 文件内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    ServerRoot "/etc/httpd"                 #http服务的顶级目录为/etc/httpd
    42 Listen 80 #监听在80端口,80为web服务器的默认端口
    56 Include conf.modules.d/*.conf #包括/etc/httpd/conf.modules.d/*.conf的所有文件
    66 User apache #服务的用户(ps -ef | grep httpd,先以root用户把/usr/sbin/httpd服务启动起来)。启动服务后转换的身份,在启动服务时通常以root身份,然后转换身份,这样增加系统安全
    67 Group apache
    86 ServerAdmin root@localhost #你的邮箱,有事的时候给你发邮件
    95 #ServerName www.example.com:80 ServerName 0.0.0.0:80匹配任意IP地址,监听端口在80端口
    注:默认是不需要指定的,服务器通过名字解析过程来获得自己的名字,但如果解析有问题(如反向解析不正确),或者没有DNS名字,也可以在这里指定ip地址,当这项不正确的时候服务器不能正常启动。解决办法就是启动该项把www.example.com:80修改为自己的域名或者直接修改为localhost
     
    102 <Directory /> #目录为根,<>为起始标志,</>为结束标志
    # AllowOverride:是否允许额外配置文件
    # 参数:
    # None: 不可复写,ALL: 全部的权限均可被复写;
    # AuthConfig: 仅有网页认证(账号密码)可复写,允许使用与认证授权相关的指令,Indexes: 仅允许Indexes方面的复写
    103 AllowOverride none
    # Require:设置客户端的访问权限
    # 参数:
    # all denied拒绝所有人,all granted允许所有来源访问,expr expression #允许表达式为true时访问
    # ip [] #允许 特定IP段访问,多个段之前用空格隔开,host splaybow.com #只允许来自域名splaybow.com的主机访问
    104 Require all denied
    105 </Directory> #和<Directory />是一组标签,目录控制容器
     
    119 DocumentRoot "/var/www/html" #网页文件存放的目录
     
    124 <Directory "/var/www">
    125 AllowOverride None
    126 # Allow open access:
    127 Require all granted
    128 </Directory>
     
    131 <Directory "/var/www/html">
    # options: 配置在directory中,还是设置目录的权限
    # 参数:
    # All:除MultiViews之外的所有特性,这是默认设置;ExecCGI  允许使用mod_cgi执行CGI脚本
    # FollowSymLinks:服务器允许在此目录中使用符号连接,如果此配置位于<Location>配置段中,则会被忽略
    # Includes:允许使用mod_include提供的服务器端包含
    # IncludesNOEXEC:允许服务器端包含,但禁用"#exec cmd""#exec cgi",但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本
    # Indexes:如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表
    # MultiViews:允许使用mod_negotiation提供内容协商的"多重视图"(MultiViews)
    # SymLinksIfOwnerMatch  服务器仅在符号连接与其目的目录或文件的拥有者具有相同的uid时才使用它。 如果此配置出现在<Location>配置段中,则将被忽略
    144 Options Indexes FollowSymLinks #索引,跟踪软链接
    151 AllowOverride None
    156 Require all granted
    157 </Directory>
     
    163 <IfModule dir_module> #加载一个目录模块,IfModule如果模块存在执行
    164 DirectoryIndex index.html # 指定首页页面,如果找不到,展示默认页面
    165 </IfModule>
     
    171 <Files ".ht*"> #不能访问.ht*的文件
    172 Require all denied
    173 </Files>
    182 ErrorLog "logs/error_log" # 报错日志文件
    189 LogLevel warn # 日志级别
    191 <IfModule log_config_module>
    #日志配置模块 /var/log/httpd,日志模块:通过时间节点去记录(man date
    196 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{ Referer}i\" \"%{User-Agent}i\"" combined
    197 LogFormat "%h %l %u %t \"%r\" %>s %b" com mon
    198
    199 <IfModule logio_module>
    201 LogFormat "%h %l %u %t \"%r\" %>s %b \" %{Referer}i\" \"%{User-Agent}i\" %I %O" combi nedio
    202 </IfModule>
    217 CustomLog "logs/access_log" combined
    218 </IfModule>
     
     
    220 <IfModule alias_module> #别名模块
    Redirect permanent /foo http://www.example.com/bar # 重定向
    Alias /webpath /path # 资源别名:/webpath:url的资源位置,/path:服务器的绝对路径
    247 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" # 脚本别名
    248
    249 </IfModule>
    cgi(通用网关接口)是web服务器运行时外部程序的规范,按cgi编写的程序可以扩展服务器的功能。cgi应用程序能与浏览器进行交互,还可通过数据库API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据
     
    255 <Directory "/var/www/cgi-bin">
    256 AllowOverride None
    257 Options None
    258 Require all granted
    259 </Directory>
    261 <IfModule mime_module> #多用途互联网邮件扩展模块
    266 TypesConfig /etc/mime.types # minme数据类型文件
    283 AddType application/x-compress .Z # 添加minme类型
    284 AddType application/x-gzip .gz .tgz
    305 AddType text/html .shtml
    306 AddOutputFilter INCLUDES .shtml # 添加输出过滤器
    307 </IfModule>

    ErrorDocument 500 "The server made a boo boo." # 出现响应状态为500时,显示内容
    ErrorDocument 404 /missing.html # 出现响应状态为404时,跳转页面
    # mime多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。 
    316 AddDefaultCharset UTF-8 # 默认字符集
    318 <IfModule mime_magic_module>
    324 MIMEMagicFile conf/magic
    325 </IfModule>
    348 EnableSendfile on
    353 IncludeOptional conf.d/*.conf
  • 首页配置文件:

    1
    vim /etc/httpd/conf.d/welcome.conf
  • 配置文件内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # # LocationMatch: 路径匹配,^: 代表以....开始,$: 代表以....结束,$: 代表以....结束,+: 代表的是/重复1次或任意多次
    <LocationMatch "^/+$">
    Options -Indexes
    ErrorDocument 403 /.noindex.html
    </LocationMatch>

    <Directory /usr/share/httpd/noindex>
    AllowOverride None
    Require all granted
    </Directory>

    Alias /.noindex.html /var/www/html/baidu.html
    Alias /poweredby.png /usr/share/httpd/icons/apache_pb3.png

7.搭建基于http协议的静态网站:

1
2
echo hello world > /var/www/html/index.html
curl 192.168.126.140 # 测试

8.搭建两个不同IP地址的静态网站:

  • 添加两个IP地址

    1
    2
    nmcli c modify ens160 +ipv4.addresses 192.168.73.149/24
    nmcli connection up ens160 # 重启
  • 创建两个不同页面目录,用于存放html等网页信息;并创建首页信息

    1
    2
    mkdir /var/www/host
    echo this is host > /var/www/host/index.html
  • 在conf.d配置目录中添加虚拟主机的配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    vim /etc/httpd/conf.d/host.conf
    # 格式如下
    <Directory "/var/www/host3">
    AllowOverride None
    require all granted
    </Directory>

    <VirtualHost 192.168.73.148:80>
    DocumentRoot "/var/www/host3"
    </VirtualHost>
  • 重启httpd服务

9.搭建两个不同端口号的静态网站:

  • 完成不同IP网站的配置后

  • 查看端口使用情况:

    1
    ss -tnl
  • 修改虚拟主机配置文件:

    1
    vim /etc/httpd/conf.d/host.conf
  • 添加新增监听端口:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 格式1如下
    Listen 1000 # 只监视端口号

    <VirtualHost 192.168.73.148:1000>
    DocumentRoot "/var/www/host3"
    </VirtualHost>
    # 格式2如下
    Listen 192.168.73.148:1000 # 监视IP+端口号

    <VirtualHost 192.168.73.148:1000>
    DocumentRoot "/var/www/host3"
    </VirtualHost>

10.搭建两个基于域名访问的网站:

  • 域名解析:浏览器如何通过域名去查询URL对应的IP(对应服务器地址)

    • 浏览器缓存:浏览器会按照一定的频率缓存DNS记录

    • 操作系统缓存:如果浏览器缓存中找不到需要的DNS记录,那就去操作系统中的hosts文件找(加端口号无效)

      • windows下的hosts文件路径:C:\Windows\System32\drivers\etc\hosts
      • Linux下的hosts文件路径:/etc/hosts
    • 路由缓存:路由器也有DNS缓存

  • 配置:

    1. 完成基于不同IP的网站配置后

    2. 修改虚拟主机的配置文件:

      1
      2
      3
      4
      5
      6
      vim /etc/httpd/conf.d/host.conf
      # 格式如下
      <VirtualHost 192.168.73.148:80>
      DocumentRoot "/var/www/host3"
      ServerName www.qv147.com # 域名
      </VirtualHost>
    3. 在客户端的hosts域名文件中添加域名:

      1
      2
      3
      4
      5
      6
      7
      # 使用powershells打开 C:\Windows\System32\drivers\etc\
      # 使用notepad hosts笔记本打开文件
      # 内容
      127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
      ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

      192.168.73.148 www.qv147.com

11.搭建基于https协议的静态网站:

  • 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。

  • HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷

  • 需要使用另一种协议:安全套接字层超文本传输协议HTTPS

  • HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道。HTTPS并不是一个新协议,而是HTTP+SSL(TLS)。原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间

  • SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。到了1999年,SSL 应用广泛,已经成为互联网上的事实标准。IETF 就把SSL 标准化。标准化之后SSL被改为 TLS(Transport Layer Security传输层安全协议

  • TLS的工作过程:

    • 阶段一:

      • 客户端向服务端发送Client Hello报文,打招呼

        1
        2
        3
        4
        5
        6
        - Random Bytes:客户端产生的随机数random_c,用于生成最终密钥
        - Session ID:会话标识符
        - Cipher Suites:加密套件
        - ECDHE_ECDSA:秘钥交换算法
        - AES_128:对称加密的算法
        - GCM_SHA256:HASH算
    • 阶段二:可以合并为一个报文

      • 服务端选择合适的加密套件,向客户端发送Server Hello报文进行回复

        1
        2
        - Random Bytes:服务器生成的随机数random_s
        - Cipher Suites:服务器选择的加密套件
      • 服务端向客户端发送Certificate报文,其中有自己的数字证书(包含自己服务器的公钥),以实现验证身份

      • 服务端向客户端发送Server Key Exchange报文,其中有基于选择的加密套件生成的公钥,用于协商出对称加密的密钥

        1
        2
        3
        - EC Diffie-Hellman:服务器和浏览器是通过Diffie-Hellman算法来生成最终的密钥
        - Pubkey:服务器向客户端发送了Pubkey这个随机数
        # 客户端已经拥有了三个随机数,可以运行Diffie-Hellman算法生成Premaster secret(最终的会话密钥)
      • 服务端向客户端发送Server Hello Done报文,表示响应结束

    • 阶段三:

      • 客户端向服务端发送Client Key Exchange报文,包含自己生成的公钥,用于协商出对称加密的密钥
      • 客户端向服务端发送Change Cipher Spec报文,包含变更密码规范,告知对方以后的通信都是基于AES加密的
      • 客户端向服务端发送Finished报文,表示发送完毕
    • 阶段四:

      • 服务端向客户端发送Change Cipher Spec报文,包含变更密码规范,告知对方以后的通信都是基于AES加密的
      • 服务端向客户端发送Finished报文,表示发送完毕
  • SSL协议分为两层:

    • SSL记录协议 (SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能
    • SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
  • SSL协议提供的服务:

    1. 认证用户和服务器,确保数据发送到正确的客户机和服务器
    2. 加密数据以防止数据中途被窃取
    3. 维护数据的完整性,确保数据在传输过程中不被改变
  • HASH算法:

    • HASH是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。
    • Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。
    • 因此Hash算法常用在不可还原的密码存储、信息完整性校验等
    • 常见的HASH算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1
  • 对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES

  • 常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

  • CA就是一个公认的公证单位(证书授权)

    • 你可以自行产生一把密钥且制作出必要的证书数据并向CA单位注册,那么当客户端的浏览器在浏览时,该浏览器会主动向CA单位确认该证书是否为合法注册过
    • 如果是,那么该次连接才会建立,如果不是,浏览器会发出警告信息,告知用户应避免建立连接
    • 所以说,如此一来WWW服务器不但有公证单位的证书,用户在建立连接时也比较有保障
  • X.509通用的证书格式包含三个文件:key,csr,crt

    • KEY:私钥文件
    • CSR:服务器向第三方机构申请证书
    • CRT:是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
  • .pem: 证书,

  • 证书申请及使用流程:

    image-20230211192148560

  • mod_ssl是一种以openssl 的工具箱为基础专门为apache webserver 提供密码保护的软件

  • 配置:

    • 安装mod_ssl:

      1
      2
      yum install -y mod_ssl 
      # 将在/etc/httpd/conf.d目录下产生ssl.conf的配置文件
    • 搭建CA服务器:

      • 机构生成私钥:ca.key文件

        1
        2
        openssl genrsa -out [机构名.key] [字节数]    # 在当前目录文件下
        # 例:openssl genrsa -out ca.key 2048
      • 机构生成RSA公钥:ca.pub文件

        1
        2
        openssl rsa -in [机构名.key] -pubout -out [机构名.pub]    # 在当前目录文件下
        # 例:openssl rsa -in ca.key -pubout -out ca.pub
      • 生成CA机构的证书:ca.crt文件

        1
        2
        3
        4
        5
        6
        openssl req -new [证书版本] -days [证书有效天数] -key [机构私钥] -out [机构证书] 
        # 例:openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
        # 问题:国家,省份,城市,组织名,组织单位,公用名,邮箱
        # 参数
        -req:是证书请求的子命令
        -out: 输出证书
    • 为服务器签发证书:

      • 生成私钥:server.key文件

        1
        2
        openssl genrsa -out [服务名.key] [字节数]
        # 例:openssl genrsa -out server.key 2048
      • 生成申请文件:server.csr文件

        1
        2
        openssl req -new -key [服务名.key] -out [服务名.csr]
        #例:openssl req -new -key server.key -out server.csr
    • 将申请文件提交给CA机构,让CA机构签发证书:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      openssl [证书版本] -req -days [证书有效天数] -in [申请文件] -CA [机构证书] -CAkey [机构私钥] -CAcreateserial -out [签发后的证书]
      #例:openssl x509 -req -days 36500 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
      # 参数:
      -req: 说明输入是一个证书申请文件
      -in: 指定申请文件
      -CA: 指定CA机构的证书
      -CAkey: 指定CA结构的私钥
      -CAcreateserial: CA创建序列号:唯一标识
      -out: 输出证书
    • 创建虚拟主机目录,添加内容到index.html

      1
      echo this is https website > /var/www/host4/index.html
    • 创建一个配置文件myssl文件,修改ssl配置文件内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      vim /etc/httpd/conf.d/myssl.conf
      # 内容:
      <VirtualHost _default_:443>
      SSLEngine on # 此虚拟机启动还是禁止
      SSLProtocol all -SSLv3 # ssl协议的版本
      SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA # 密码套件,列出允许客户端协商的密码
      SSLCipherSuite PROFILE=SYSTEM # 密码套件
      SSLCertificateFile /root/ssl/server.crt # 指定服务器的证书路径
      SSLCertificateKeyFile /root/ssl/server.key # 指定服务器的密钥文件路径
      DocumentRoot "/var/www/host4"
      ServerName 192.168.73.150
      </VirtualHost>
    • 重启服务:

      1
      systemctl restart httpd
    • 在主机的域名配置文件C:\Windows\System32\drivers\etc\hosts添加内容

      1
      192.168.73.150 www.qv369.com

12.搭建基于虚拟目录和用户控制的网站:

  • 搭建虚拟目录:

    • 创建虚拟主机访问目录和输入index.html内容

    • 修改虚拟主机配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      vim /etc/httpd/conf.d/host.conf
      # 内容
      <VirtualHost 192.168.73.101:80>
      DocumentRoot "/var/www/host5"
      # alias别名: 针对的是:浏览器中输入URL, URL的路径path的那一部分映射到Linux上真正的目录
      # /host:URL地址栏输入的目录,/var/www/host5:映射到服务器真正的目录
      alias /host "/var/www/host5"
      </VirtualHost>
    • 重启服务

  • 配置用户控制:

    • 创建和修改密码文件:

      1
      2
      3
      4
      cd /usr/local/http_dir
      mkdir mypasswd
      htpasswd -c /usr/local/http_dir/mypasswd [用户名] # -c:create创建
      htpasswd /etc/httpd/mymima xiaohong # 修改
    • 创建虚拟主机访问目录和输入index.html内容

    • 修改虚拟主机配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      vim /etc/httpd/conf.d/host.conf
      # 内容
      <Directory "/var/www/host5">
      AuthType Basic # 基本认证类型
      AuthName "Please login:192.168.73.101" # 提示信息
      AuthUserFile /usr/local/http_dir/mypasswd # 用户认证文件的用户名和密码指定的文件路径
      Require user qv123 # 指定用户可以访问该服务器
      </Directory>
    • 重启服务

13.搭建动态网站:

  • CGI程序的标准输入:

    -

  • CGI程序的标准输出:

  • 图示:

    image-20230109120216268
  • 配置:

    • 修改配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      vim /etc/httpd/conf.d/host.conf
      # 内容
      <Directory "/var/www/host7">
      AllowOverride None
      require all granted
      Options +ExecCGI # 此目录下的文件增加执行的权限
      AddHandler cgi-script .cgi # ?
      </Directory>

      <VirtualHost 192.168.73.102:80>
      DocumentRoot "/var/www/host7"
      </VirtualHost>
    • 在虚拟主机访问目录下创建cgi后缀的文件:test.cgi

      1
      2
      3
      4
      5
      6
      7
      8
      9
      Vim /var/www/cgi-bin/test.sh
      #! /bin/bash
      # 状态行/响应行:web服务器会帮我们加载
      # 响应头:返回数据内容的minme类型
      # 空行
      # 响应体
      printf "Content-Type: text/html;charset=utf-8\n"
      printf "\n"
      printf "hellow worlds\n"
    • 重启服务

14.搭建论坛:

  1. 上传Disuz源码包

    1
    2
    链接:https://pan.baidu.com/s/1zx6MnNMQpPACeBz9Khrgog 
    提取码:abcd
  2. 安装httpd

    1
       
  3. 安装PHP相关的软件:

    1
    yum install -y php* 
  4. 安装数据库

    1
    yum install -y mariadb 
  5. 重启数据库服务:

    1
    systemctl restart mariadb
  6. 配置数据库:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    mysql_secure_installation
    # 配置如下
    Enter current password for root (enter for none):

    Set root password? [Y/n] Y
    New password:
    Re-enter new password:

    Remove anonymous users? [Y/n] Y

    Disallow root login remotely? [Y/n] n

    Remove test database and access to it? [Y/n] Y

    Reload privilege tables now? [Y/n] Y
  7. 解压上传的Disuz源码包:

    1
    unzip  Discuz_X3.4_SC_UTF8_20210520.zip [解压目录]
  8. 设置权限:对这些目录的权限进行修改

    1
    2
    cd upload
    chmod 777 -R config uc_client uc_server data
  9. 重启httpd服务:

    1
    systemctl restart httpd
  10. 浏览器访问 http://IP+/upload 安装

5.搭建Halo博客程序:

1.安装JAVA:

1
2
sudo yum install java-11-openjdk -y
java -version

2.安装mysql:

1
2
3
4
5
6
7
8
docker run -id \
-p 3307:3306 \
--name=b_mysql \
-v $PWD/conf:/etc/mysql/mysql.conf.d \
-v $PWD/logs:/var/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=$Rui123456 \
mysql:8.0.32

3.安装halo:

  • 下载application.yaml模板:

    1
    2
    mkdir ~/.halo && cd ~/.halo
    wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
  • 修改application.yaml配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    server:
    port: 8090

    # Response data gzip.
    compression:
    enabled: false
    spring:
    datasource:

    # H2 database configuration.
    # driver-class-name: org.h2.Driver
    #url: jdbc:h2:file:~/.halo/db/halo
    #username: admin
    #password: 123456

    # MySQL database configuration.
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://8.130.17.95:3307/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: '@Qv110119'

    # H2 database console configuration.
    #h2:
    # console:
    # settings:
    # web-allow-others: false
    # path: /h2-console
    # enabled: false

    halo:

    # Your admin client path is https://your-domain/{admin-path}
    admin-path: admin

    # memory or level
    cache: memory
  • 创建halo容器:

    1
    docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=unless-stopped halohub/halo:1.6.0

6.第五章-nginx服务器:

1.安装和配置nginx:

  • 安装:

    1
    yum install -y nginx
  • 修改配置文件:

    1
    2
    3
    # /etc/nginx/conf   # 此目录下为nginx主配置文件目录
    # /etc/nginx/conf.d # 此目录下为nginx额外配置文件目录
    vim /etc/nginx/conf.d/halo.conf # 此为halo博客得配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    upstream halo {           # 自定义名称halo的模块
    server 127.0.0.1:8090;
    }

    server { # 对应的服务
    listen 80; # 监听的端口
    listen [::]:80;
    server_name 8.130.17.95; # 绑定的域名,访问此域名的80端口转发访问的本地8090端口
    client_max_body_size 1024m;
    location / {
    proxy_pass http://halo; # halo和upstream halo后的名称相对应
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
  • 检查配置文件语法:

    1
    nginx -t
  • 重载配置文件:

    1
    nginx -s reload

2.nginx服务器配置ssl证书:

  • 导入ssl证书:

    1
    2
    3
    # 证书文件:文件类型为PEM,密钥文件:文件类型为KEY
    cd /etc/nginx
    mkdir cert # 此目录下存放证书
  • 修改配置文件:

    1
    vim /etc/nginx/conf.d/halo.conf     # 此为halo博客得配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    upstream halo {           # 自定义名称halo的模块
    server 127.0.0.1:8090;
    }
    server {
    listen 443 ssl;
    server_name www.qv123.top; # 绑定的域名
    charset utf-8;
    ssl_certificate /etc/nginx/cert/9146237_www.qv123.top.pem # 证书文件路径
    ssl_certificate_key /etc/nginx/cert/9146237_www.qv123.top.key # 密钥文件路径
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    location / {
    proxy_pass http://halo; # halo和upstream halo后的名称相对应
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    upstream halo {           # 自定义名称halo的模块
    server 127.0.0.1:8090;
    }
    server {
    listen 80;
    listen [::]:80;
    server_name www.qv123.top; # 绑定的域名
    rewrite ^(.*)$ https://$host$1; # 将所有HTTP请求通过rewrite指令重定向到HTTPS
    client_max_body_size 1024m;
    location / {
    proxy_pass http://halo;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

7.第五章-NFS服务器:

1.NFS服务器的概念:

  • 文件系统:实现了VFS的接口, 来提供组织文件的功能
  • NFS(Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样
  • NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中看来,那个远程主机的目录就好像是自己的一个磁盘分区一样
  • 由于NFS支持的功能比较多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口并不固定,而是随机取用一些未被使用的小于1024的端口用于传输。但如此一来就会产生客户端连接服务器的问题,因为客户端需要知道服务器端的相关端口才能够连接
  • 此时就需要RPC(Remote Procedure Call,远程过程调用)的服务。由于当服务器在启动NFS时会随机选取数个端口号,并主动向RPC注册,所以RPC知道每个NFS功能所对应的端口号,RPC将端口号通知给客户端,让客户端可以连接到正确的端口上去。RPC采用固定端口号port 111来监听客户端的需求并向客户端响应正确的端口号
  • 注:在启动NFS之前,要先启动RPC,否则NFS会无法向RPC注册。另外,RPC若重新启动,原来注册的数据会消失不见,因此RPC重启后,它管理的所有服务都需要重新启动以重新向RPC注册

2.NFS的使用:

  • 服务端:

    • 安装RPC主程序:rpcbind

      1
      yum install rpcbind
    • 安装NFS主程序:nfs-utils

      1
      yum install nfs-utils
      1
      2
      systemctl restart rpcbind
      systemctl restart nfs-server
    • 配置文件/etc/exports,允许网段内主机访问共享目录

      1
      2
      #|   共享目录     |  主机名        (权限)|
      /usr/qv123/nfsdata 192.168.73.0/24(rw)
      1
      man exports    # 查看所有参数
      权限参数值 说明
      rw/ro rw:可读写,ro:只读,还是与文件系统的rwx有关
      sync/async sync:数据会同步写入到内存与硬盘中,async:则代表数据会先暂存于内存当中
      no_root_squash/root_squash no_root_squash表示就显示root用户和root组;root_squash表示将root用户和组映射为匿名用户和组(默认设置)。
      all_squash/no_all_squash allsquash:客户端所有用户创建文件时,客户端会将文件的用户和组映射为匿名用户和组no_all_squash:客户端普通用户创建的文件的UID和GID是多少,服务端就显示为多少(默认设置)
      anonuid=anongid= 将文件的用户和组映射为指定的UID和GID,若不指定默认为65534(nfsnobody)
    • 使配置生效

      1
      exportfs -r
    • 查看是否存在共享目录:

      1
      showmount -e [服务端IP地址]
  • 客户端:

    • 安装和配置软件

      • 方式一:安装nfs-utils(临时挂载

        1
        yum install  -y nfs-utils
      • 查看是否可以连接上共享目录:

        1
        showmount -e [服务端IP地址]
      • 创建挂载目录,挂载目录或解挂载目录

        1
        2
        mount -t nfs [服务端IP地址]:[服务端共享目录]  [本地挂载目录]
        umount [本地挂载目录]
      • 方式二:

        • 安装autofs(自动挂载

          1
          yum install -y autofs
        • 配置文件:

          1
          2
          3
          autofs.conf:针对服务autofs的配置
          timeout = 300, #
          dismount_interval = 300 # 挂载超时时间
          1
          2
          3
          auto.master:是针对目录对应的挂载配置文件
          /misc这个目录自动挂载的信息autofs在 /etc/auto.misc中
          配置语法: 目录 自动挂载配置文件的目录
          1
          2
          3
          4
          auto.xxx:具体的挂载的信息
          cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
          挂载的目录 挂载的选项 :要挂载的设备
          boot -fstype=ext2 :/dev/hda1
        • 修改配置文件:

          1
          2
          3
          4
          5
          6
          7
          vim /etc/auto.master
          # 添加内容
          /nfsclient /etc/auto.nfs
          vim /etc/auto.nfs
          # 添加内容
          #本地端子目录 -挂载参数 服务器所提供的目录
          nfsdir 192.168.73.150:/usr/qv123/nfsdata
          参数 参数功能
          fgbg 当执行挂载时,该挂载行为会在前台(fg)还是后台(bg)执行,若在前台执行,则mount会持续尝试挂载,直到成功或time out为止;若为后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的程序运行。
          softhard hard表示当两者之间的任何一台主机脱机,则RPC会持续地呼叫,直到对方恢复连接为止。如果是soft的话,那RPC会在time out后重复呼叫,而非持续呼叫
          intr 当使用上面提到的hard方式挂载时,若加上intr这个参数,则当RPC持续呼叫时,该次的呼叫是可以被中断的
          rsizewsize 读出(rsize)与写入(wsize)的区块大小。这个设置值可以影响客户端与服务器端传输数据的缓冲记忆容量
        • 重启autofs服务

          1
          systemctl restart autofs
        • 查看挂载信息:

          1
          mount | grep /nfs
        • 触发自动挂载,进入到子目录中触发,退出挂载目录一定时间后触发解挂载:

          1
          cd /nfsclient/nfsdir    

8.第五章-DNS域名解析服务器:

1.介绍:

  • DNS(Domain Name System)是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网
  • DNS系统使用的是网络的查询,那么自然需要有监听的port。DNS使用的是53端口,在/etc/services(搜索domain)这个文件中能看到。通常DNS是以UDP这个较快速的数据传输协议来查询的,但是没有查询到完整的信息时,就会再次以TCP这个协议来重新查询。所以启动DNS时,会同时启动TCP以及UDP的port53

2.因特网的域名结构:

  • 由于因特网的用户数量较多,所以因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。“域”(domain)是名字空间中一个可被管理的划分
  • 域名只是逻辑概念,并不代表计算机所在的物理地点。域名可分为三大类
    • 国家顶级域名:采用ISO3166的规定。如:cn代表中国,us代表美国,uk代表英国,等等。国家域名又常记为ccTLD(country code top-level domains,cc表示国家代码contry-code)
    • 通用顶级域名:最常见的通用顶级域名有7个,即:com(公司企t业),ne(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)
    • 基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名

3.域名服务器的类型划分:

  • 根域名服务器:最高层次的域名服务器
  • 顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名
  • 权限域名服务器:负责一个“区”的域名服务器
  • 本地域名服务器:本地域名服务器不属于域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器

4.DNS域名解析:

  • 解析工作过程:

    1. 查询浏览器的缓存: 查到了返回IP给浏览器

    2. 查询操作系统的缓存:

      1
      ipconfig/displaydns
    3. 查询操作系统中 /etc/hosts : ip和名字的映射关系

    4. 访问本地dns服务器,dns服务器给我返回解析后的IP

    5. 本地域名服务器(114.114….)去访问根域名服务器(.), 根域名服务器不会解析(www.baidu.com),根域名服务器会告诉本地域名服务器:com顶级域名服务器在哪儿(IP)

    6. 本地域名服务器(114.114….)去访问顶级域名服务器(com), com顶级域名服务器也不会解析(www.baidu.com), 顶级域名服务器会告诉本地域名服务器, baidu二级域名服务器在哪儿(IP)

    7. 本地域名服务器(114.114….)去访问二级域名服务器(baidu), baidu二级域名服务器也不会解析(www.baidu.com), 二级域名服务器会告诉本地域名服务器,www三级域名服务器在哪儿(ip)

    8. 本地域名服务器(114.114….)去访问三级域名服务器(www), www三级服务器解析www.baidu.com,如果解析成功了,返回IP给本地域名服务器

  • 注:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间使用的交互查询就是迭代查询(返回的DNS服务器的IP地址)

  • 114.114.114.114是国内移动、电信和联通通用的DNS,手机和电脑端都可以使用,干净无广告,解析成功率相对来说更高,国内用户使用的比较多,而且速度相对快、稳定,是国内用户上网常用的DNS

  • 8.8.8.8是GOOGLE公司提供的DNS,该地址是全球通用的,相对来说,更适合国外以及访问国外网站的用户使用

  • FQDN:

    • (Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”)
    • 例如:主机名是bigserver,域名是mycompany.com,那么FQDN就是bigserver.mycompany.com
    • 全限定域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式
  • DNS解析方式

    • 正向解析:将FQDN—–>IP
    • 反向解析:将IP—–>FQDN

5.搭建DNS服务器:

  • 提供DNS服务的软件叫bind,服务名是named

  • 安装:

    1
    2
    yum install -y bind
    rpm -ql bind # 查看
  • 查看配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    vim /etc/named.conf        # bind主配置文件
    # 内容
    options {
    # 定义监听端口,如果所有地址都监听,则只写端口
    listen-on port 53 { 127.0.0.1; };
    listen-on-v6 port 53 { ::1; }; # ipv6
    # 定义数据文件目录
    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"; # 内存的统计文件
    secroots-file "/var/named/data/named.secroots"; # 安全的文件
    recursing-file "/var/named/data/named.recursing"; #递归的文件
    allow-query { localhost; }; #只允许本地主机进行查询
    recursion yes; #允许递归

    # 指定日志记录分类和他们的目标位置
    logging {
    channel default_debug {
    file "data/named.run";
    severity dynamic;
    };
    };

    # 定义区域
    zone "." IN {
    type hint;
    file "named.ca";
    };
    # 包含其他的配置文件
    include "/etc/named.rfc1912.zones";
    include "/etc/named.root.key";
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    vim /etc/named.rfc1912.zones   # 定义zone的文件
    # 内容
    zone "localhost.localdomain" IN {
    type master; # 配置三选一,master:主域名服务器,slave:从域名服务器,hint根域名服务器
    file "named.localhost"; # 区域解析文件路径,解析记录;要把一个域名解析成某一个IP, dns一般都会有缓存,而且从域名和主域名同步的数据的设置
    allow-update { none; }; # 允许哪些主机来更新
    };

    zone "localhost" IN {
    type master;
    file "named.localhost";
    allow-update { none; };
    };

    zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
    type master;
    file "named.loopback";
    allow-update { none; };
    };

    zone "1.0.0.127.in-addr.arpa" IN { # .in-addr.arpa: 固定搭配,方向解析即将IP解析域名
    type master;
    file "named.loopback";
    allow-update { none; };
    };

    zone "0.in-addr.arpa" IN {
    type master;
    file "named.empty";
    allow-update { none; };
    };
    1
    /etc/rndc.conf        # rndc配置文件
  • 查看工作目录:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vim /var/named/named.localhost  # 本地主机解析库
    # 内容
    $TTL 1D # TTL 1D: 缓存时间
    @ IN SOA @ rname.invalid. (
    0 ; serial
    1D ; refresh
    1H ; retry
    1W ; expire
    3H ) ; minimum
    NS @
    A 127.0.0.1
    AAAA ::1
    1
    2
    /var/named/named.ca      #根解析库
    /var/named/slaves # 从ns服务器文件夹
  • 1
    2
    3
    4
    /usr/sbin/named-checkconf   # 检测/etc/named.conf文件语法
    /usr/sbin/named-checkzone # 检测zone和对应zone文件的语法
    /usr/sbin/rndc # 远程dns管理工具
    /usr/sbin/rndc-confgen # 生成rndc密钥
  • 日志文件:

    1
    /var/log/named.log

6.正向解析:

  • 修改主配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vim /etc/named.conf
    # 内容
    options { # 全局选项
    listen-on port 53 { 192.168.73.150; }; # 监听端口为53,大括号内为DNS服务器IP地址
    directory "/var/named"; #全局目录
    allow-query { 192.168.73.0/24; }; #只允许本地主机进行查询
    };
    # 区域定义:
    zone "rhce.com" IN { # 正向解析baidu.com
    type master; # 主服务器类型
    file "rhce.zone"; # 区域文件名
    };
  • 检查配置文件的正确性:

    1
    named-checkconf /etc/named.conf 
  • 正向解析文件资源记录(Resource Record,RR)

  • 常见的正解文件RR相关信息:

    domain IN RR type RR data
    主机名. IN A IPv4的IP地址
    主机名. IN AAAA IPv6的IP地址
    域名. IN NS 管理这个域名的服务器主机名字,即由哪一台主机去解析当前所定义的域主机
    域名. IN SOA起始授权记录 管理这个域名的七个重要参数
    域名. IN MX 顺序数字,接收邮件的服务器主机名字
    主机别名. IN CNAME 实际代表这个主机别名的主机名字
  • SOA主要是与区域有关,所以domain要写域名。而SOA后面会接七个参数,这七个参数的意义如下:

    1
    2
    时间单位:M(分钟),H(小时),D(天),W(周),默认是秒
    @ IN SOA dns.rhce.com. test.163.com ( 0 1D 1H 1W 3H )
  • 修改区域配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    vim /var/named/rhce.zone
    # 内容
    $TTL 1D # TTL 1D: 缓存时间
    @ IN SOA dns.rhce.com. test.163.com ( # dns.rhce.com.:DNS服务器,test.163.com:管理员的Email
    0 # Serial标识序列号,表示时间,例:20170215
    1D # 刷新时间,即每隔多久到主服务器检查一次,此处为2小时
    1H # 重试时间,应该小于刷新时间,此处为4分钟
    1W # 过期时间,此处为1天
    3H ) # 主服务器挂后,从服务器至多工作的时间,此处为2天)

    IN NS dns.rhce.com.
    IN MX 10 mail.rhce.com.

    dns.rhce.com. IN A 192.168.73.150 # DNS服务器IP地址
    mail.rhce.com. IN A 192.168.73.102
    www.rhce.com. IN A 192.168.73.103
    ;sftp -> ftp.rhce.com.
    ;ftp.rhce.com -> ftp.rhce.com.rhce.com.
    ftp IN A 192.168.73.148
    dhcp IN A 192.168.73.149
    ntp IN A 192.168.73.101
    ;cname: change name
    web IN CNAME www.rhce.com.
  • 检查:

    1
    named-checkzone rhce.com /var/named/rhce.zone
  • 重启named服务

    1
    systemctl restart named
  • 测试:

    1
    2
    #方式一:
    host www.rhce.com 192.168.73.150
    1
    2
    3
    4
    5
    #方式二:
    [root@quruixiang named]# nslookup
    > server
    Default server: 180.76.76.76
    Address: 180.76.76.76#53
  • 使用另一台主机测试:

    1
    2
    3
    # 修改/etc/resolv.conf下DNS服务器IP地址为上面修改的DNSIP地址
    vim /etc/resolv.conf
    ping www.rhce.com
    1
    2
    3
    4
    [root@quruixiang named]# nslookup
    > www.rhce.com
    Server: 180.76.76.76
    Address: 180.76.76.76#53

7.反向解析:

  • 修改主配置文件:

    1
    2
    3
    4
    5
    6
    vim /etc/named.conf
    # 内容
    zone "73.168.192.in-addr.arpa" IN { # 解析192.168.73.0/24网段
    type master;
    file "73.168.192.zone";
    };
  • 修改区域配置文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    vim /var/named/73.168.192.zone
    # 内容
    $TTL 1D
    @ IN SOA dns.rhce.com. test.163.com (
    0
    1D
    1H
    1W
    3H )

    IN NS dns.rhce.com.

    dns.rhce.com. IN PTR 192.168.73.150 # DNS服务器IP地址
    150 IN PTR dns.rhce.com.
    102 IN PTR mail.rhce.com.
    103 IN PTR www.rhce.com.
    148 IN PTR ftp.
    149 IN PTR dhcp.
    101 IN PTR ntp.
  • 重启named服务

    1
    systemctl restart named
  • 测试:

    1
    host 192.168.73.101 192.168.73.150
    1
    2
    3
    4
    [root@quruixiang named]# nslookup
    > www.rhce.com
    Server: 180.76.76.76
    Address: 180.76.76.76#53

8.主从同步:

  • 完全区域传送:复制整个区域文件:

    • 修改主DNS服务器主配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      vim /etc/named.conf
      # 内容
      options {
      allow-transfer { 192.168.73.0/24; }; # 开启区域传送,允许范围
      };
      zone "73.168.192.in-addr.arpa" IN { # 解析192.168.73.0/24网段
      type master;
      file "73.168.192.zone";
      };
    • 修改从DNS服务器主配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      vim /etc/named.conf
      options {
      listen-on port 53 { 192.168.73.151; };
      allow-query { 192.168.73.0/24; };
      };
      # 内容
      zone "rhce.com" IN {
      type slave;
      masters { 192.168.73.150; }
      masterfile-format text; # 格式为text,防止乱码
      file "slaves/rhce.zone";
      };
    • 重启DNS主服务器和从DNS从服务器

      1
      systemctl restart named
    • 使用从DNS进行域名解析:

      1
      host www.rhce.com 192.168.73.151
    • 查看从DNS服务器/var/named/slaves目录下的文件:

      1
      ll /var/named/slaves
  • 增量区域传送:仅复制区域里变化的文件

    • 修改主DNS服务器对应的区域配置文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      vim /var/named/rhce.zone
      # 内容
      @ IN SOA dns.rhce.com. test.163.com (
      2023011012
      1D
      1H
      1W
      3H )
      IN NS dns.rhce.com.
      IN NS dns1.rhce.com. # 添加内容

      dns.rhce.com. IN A 192.168.73.150
      dns1.rhce.com. IN A 192.168.73.151 # 添加内容
    • 重启DNS主服务器何从DNS从服务器

      1
      systemctl restart named
    • 使用从DNS进行域名解析:

      1
      host www.rhce.com 192.168.73.151
    • 如果从DNS和主DNS的同一个区域解析文件中serial不一致,即从DNS serial比主DNS旧才传送

    • 查看从DNS服务器/var/named/slaves目录下的文件:

      1
      2
      ll /var/named/slaves
      -rw-r--r--. 1 named named 558 Jan 12 21:06 rhce.zone

9.批量解析:

  • 正向解析:修改主DNS服务器的区域配置文件:

    1
    2
    3
    vim /var/named/rhce.zone
    # 内容
    $GENERATE 10-20 $.baidu.com. IN A 172.24.8.$
  • 正向解析:修改主DNS服务器的区域配置文件:

    1
    2
    3
    vim /var/named/73.168.192.zone
    # 内容
    $GENERATE 10-20 $ IN PTR $.baidu.com

9.第七章-selinux:

1.概念:

  • SELinux是Security-Enhanced Linux的缩写,意思是安全强化的linux

  • SELinux 主要由美国国家安全局(NSA)开发,当初开发的目的是为了避免资源的误用

  • 系统资源都是通过程序进行访问的,如果将/var/www/html/权限设置为777,代表所有程序均可对该目录访问

  • 如果已经启动www服务器软件,那么该软件触发的进程将可以写入该目录,而该进程是对整个internet提供服务的。

  • NSA为了控制这方面的权限与进程的问题,就使用linux来作为研究目标,最后将研究的成果整合到linux内核里面去,也就是SELinux

  • SELinux是对程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序,因此刚好也是能够控制网络服务能否访问系统资源的一道关卡

    访问控制 说明
    DAC(Discretionary Access Control) 自主访问控制,传统的文件权限与账号的关系
    MAC(Mandatory Access Control) 强制访问控制,以策略规则制定特定程序读取特定文件

2.selinux的运行模式:

  • SELinux是通过MAC的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源

  • 主体(subject):就是进程

  • 目标(object):被主体访问的资源,可以是文件、目录、端口等

  • SELinux支持三种模式:

    模式 说明
    enforcing 强制模式,代表SELinux正在运行中,开始限制domain/type
    permissive 宽容模式,代表SELinux正在运行中,不过仅会有警告信息并不会实际限制domain/type的访问
    disabled 关闭,SELinux并没有实际运行
  • 查看目前的模式

    1
    getenforce
  • 临时设置:

    1
    setenforce [0/1]      # 0:permissive,1:enforcing
  • 永久修改:修改完成后重启才能生效

    1
    vim /etc/selinux/config

3.setlinux的策略:

  • 策略(policy):由于进程与文件数量庞大,因此SELinux会依据某些服务来制定基本的访问安全策略。这些策略内还会有详细的规则(rule)来指定不同的服务开放某些资源的访问与否。目前主要的策略有

    策略 说明
    targeted 针对网络服务限制较多,针对本机限制较少,是默认的策略
    strict 完整的SELinux限制,限制方面较为严格
  • 查看目前的selinux使用的策略:

    1
    sestatus
  • 永久修改策略:改变策略之后需要重新启动

    1
    vim /etc/selinux/config

4.setlinux的安全上下文:

  • 安全上下文(security context):主体能不能访问目标除了策略指定外,主体与目标的安全上下文必须一致才能够顺利访问

    1
    2
    #                     身份标识      角色     类型
    drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 home
    字段 说明
    主体 root:表示root的账号身份, system_u:表示进程,unconfined_u:用户账号
    角色 object_r:代表的是文件或目录等文件资源,system_r:代表的是进程
    类型 type:在文件资源上面称为类型,domain:在主体程序中则称为域,domain与type搭配,才能够顺利读取文件资源
  • 最终文件的成功访问还是与文件系统的rwx权限设置有关

  • 查看文件的安全上下文:

    1
    2
    3
    4
    ll -Z
    # 内容
    -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
    drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 home
  • 修改安全上下文:

    1
    chcon [-R] [-t type] [-u user] [-r role] [路径]
    参数 说明
    -R 连同该目录下的子目录也同时修改
    -t 后面接安全上下文的类型字段
    -u 后面接身份识别(主体)
    -r 后面接角色
    -v 将过程显示到屏幕上
    1
    chcon [-R] --reference=[范例文件] [路径]      # 将文件的安全上下文按照范例文件修改
  • 还原默认上下文:

    1
    restorecon [-Rv] [路径]

10.第八章-防火墙:

1.概念:

  • Linux系统运行时,内存分内核空间和用户空间

    • 内核空间:是Linux内核代码运行的空间,它能直接调用系统资源
    • 用户空间:是运行用户程序的空间,用户空间的程序不能直接调用系统资源
  • 防火墙:防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出

  • 防火墙又可以分为硬件防火墙软件防火墙

    • 硬件防火墙是由厂商设计好的主机硬件,这台硬件防火墙的操作系统主要以提供数据包数据的过滤机制为主,并将其他不必要的功能拿掉。
    • 软件防火墙就是保护系统网络安全的一套软件(或称为机制),例如Netfilter与TCP Wrappers都可以称为软件防火墙
  • 这儿主要介绍linux系统本身提供的软件防火墙的功能,那就是Netfilter,即数据包过滤机制

  • 数据包过滤,也就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决定该连接为放行或抵挡的机制。由于这种方式可以直接分析数据包头部数据,包括硬件地址,软件地址,TCP、UDP、ICMP等数据包的信息都可以进行过滤分析,因此用途非常广泛(主要分析OSI七层协议的2、3、4层)。

  • 由此可知,linux的Netfilter机制可以进行的分析工作有:

    1
    2
    3
    4
    # 拒绝让Internet的数据包进入主机的某些端口
    # 拒绝让某些来源ip的数据包进入
    # 拒绝让带有某些特殊标志(flag)的数据包进入,最常拒绝的就是带有SYN的主动连接的标志了
    # 分析硬件地址(MAC)来决定连接与否
  • 虽然Netfilter防火墙可以做到这么多事情,不过,某些情况下,它并不能保证我们的网络一定就很安全。例如:

    1
    2
    3
    # 防火墙并不能有效阻挡病毒或木马程序。(假设主机开放了www服务,防火墙的设置是一定要将www服务的port开放给client端的
    # 假设www服务器软件有漏洞,或者请求www服务的数据包本身就是病毒的一部分时,防火墙是阻止不了的)
    # 防火墙对于内部LAN的攻击无能为力(防火墙对于内部的规则设置通常比较少,所以就很容易造成内部员工对于网络无用或滥用的情况)
  • netfilter这个数据包过滤机制是由linux内核内建的不同的内核版本使用的设置防火墙策略的软件不一样,在红帽7系统中firewalld服务取代了iptables服务

  • 但其实iptables服务firewalld服务它们都只是用来定义防火墙策略的“防火墙管理工具”而已,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter

2.iptables:

  • 防火墙会从以上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止,ACCEPT,REJECT,DROP)。

  • 如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:

    • 一种是“通”(即放行)

    • 一种是“堵”(即阻止)。

  • 当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;

  • 如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。

  • iptables服务把用于处理或过滤流量的策略条目称之为规则多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下

    链名 说明
    INPUT 处理流入的数据包
    OUTPUT 处理流出的数据包
    FORWARD 处理转发的数据包
    PREROUTING 在进行路由选择前处理数据包,用于目标地址转换
    POSTROUTING 在进行路由选择后处理数据包,用于源地址转换
  • 图示:

    image-20230114213025760

  • 表:

    • 有些规则的作用痕相似,多条具有相同功能的规则合在一起就组成流一个“表”

    • iptables提供流四张表

      表名 说明
      filter 主要对数据包进行过滤
      nat 网络地址转换,主要y用于修改数据包中IP地址,端口号等
      mangle 拆解报文,做出修改,并重新封装;主要用于修改数据包的TOS,TTL,Mark标记
      raw 主要用于决定数据包是否被状态跟踪机制处理
  • 表链关系:

    image-20230114214157383

  • 处理的动作:

    动作 说明
    ACCEPT 允许数据包通过
    DROP 直接丢弃数据包,不回复对方
    REJECT 拒绝数据包,回复对方
    SNAT 源IP地址转换,出本地网络栈之前
    MASQUERADE SNAT一种特殊形式,
    DNAT 目标IP地址转换
    REDIRECT 在本机做端口映射
    LOG 记录日志信息,/var/log/messages
  • 安装iptables服务的包:

    1
    yum install -y iptables-services
  • 关闭防火墙,重启iptables服务:

    1
    2
    systemctl stop firewalld
    systemctl start iptables
  • iptables命令:

    • iptables命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables就会根据策略规则所预设的动作来处理这些流量

    • 语法:

      1
      2
      3
      4
      5
      iptables -t [表名] -[A/I/D/R] [规则链名] [规则号] -[i/o 网卡名] -p [协议名] 
      -s [源IP/源子网] --sport [源端口] -d 目标IP/目标子网] --dport [目标端口] -j [动作]
      # 例:
      ## 添加规则filter表,默认规则号1,允许TCP连接80端口
      # iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
    • iptables的参数说明:

      参数 说明
      -L –list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则
      -A –append:在指定链 chain 的末尾插入指定的规则
      -I –insert :在链 chain 中的指定位置插入一条或多条规则。默认规则号是1,在链的头部插入
      -D –delete:在指定的链 chain 中删除一个或多个指定规则
      -R Replays替换/修改第几条规则
      -P –policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的
      -F –flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则
      -N –new-chain chain 用指定的名字创建一个新的链
      -X –delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链
      -E –rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响
      -h 显示帮助信息
    • 添加规则表filter中的规则链,头部添加条目:

      1
      iptables -t filter -I INPUT  -p tcp --dport 80 -j ACCEPT     
    • 添加规则表filter中的规则链,尾部添加条目:

      1
      iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    • 修改/替换规则表中规则链的条目:

      1
      iptables -R filter -I INPUT 4
    • 删除规则链的条目:

      1
      iptables -D INPUT 1
    • 查看规则表:

      1
      iptables -vnL --line-numbers
    • 给指定规则链上添加策略:

      1
      iptables -p INPUT DROP
    • 清空指定链上的所有规则:

      1
      iptables -F input

3.firewalld:

  • 相比于传统的防火墙管理工具,firewalld支持动态更新技术并加入了区域的概念

  • 区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以选择不同的集合,从而实现防火墙策略之间的快速切换

  • firewalld中常见的区域名称(默认为public)以及相应的策略规则:

    区域 默认规则策略
    阻塞区域(block) 拒绝流入的流量,除非与流出的流量相关
    工作区域(work) 拒绝流入的流量,除非与流出的流量相关
    家庭区域(home) 拒绝流入的流量,除非与流出的流量相关
    公共区域(public) 不相信网络上的任何计算机,只有选择接受传入的网络连接。
    隔离区域(DMZ) 隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
    信任区域(trusted) 允许所有的数据包。
    丢弃区域(drop) 拒绝流入的流量,除非与流出的流量相关
    内部区域(internal) 等同于home区域
    外部区域(external) 拒绝流入的流量,除非与流出的流量有关;而如果流量与ssh服务相关,则允许流量
  • firewalld默认提供的九个zone配置文件:/usr/lib/firewalld/zones/

    1
    2
    3
    4
    5
    6
    7
    8
    9
    block.xml 
    drop.xml
    home.xml
    public.xml
    work.xml
    dmz.xml
    external.xml
    internal.xml
    trusted.xml
  • 在RHEL7中,firewalld服务是默认的防火墙配置管理工具,他拥有基于和基于的两种管理方式

    • CLI(命令行界面)
    • GUI(图形用户界面)
  • firewall-config和firewall-cmd是直接编辑xml文件,其中firewall-config是图形化工具,firewall-cmd是命令行工具。

  • 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 关闭应急状况模式
    –query-panic 查询紧急模式状态
    –version 查看版本
    –help 查看帮助
    –state 显示状态
    –get-services 查看命令支持的服务
  • 禁止协议访问或者开放协议访问

    1
    2
    firewall-cmd --add-service=http
    firewall-cmd --remove-service=http
  • 禁止端口访问或者开放端口访问

    1
    2
    firewall-cmd --add-port=80/tcp
    firewall-cmd --removes-port=80/tcp
  • 禁止源IP地址访问或者开放源IP地址访问

    1
    2
    firewall-cmd --add-source=[IP地址]
    firewall-cmd --removes-source=[IP地址]
  • 永久添加:

    1
    firewall-cmd --add-source=[IP地址] --permanent
    1
    firewall-cmd --reload     # 重载配置文件
  • 查看

    1
    firewall-cmd --list-all

4.富规则:

  • 查看帮助文档:

    1
    man 5 firewalld.richlanguage
  • 添加富规则:

    1
    2
    3
    4
    firewall-cmd --permanent --add-service=ssh	   # 先添加服务,默认已添加
    # 禁止172.24.8.0网段的地址进行ssh访问
    firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="172.24.8.0/24"
    service name="ssh" reject'
  • 删除富规则:

    1
    2
    firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" 
    source address="172.24.8.0/24" service name="ssh" reject'

5.端口转发:

  • 配置端口转发:将一个网段的源IP地址中的端口转发

    1
    2
    3
    4
    firewall-cmd --permanent --add-masquerade     # 开启IP伪装
    # 在172.24.8.0网段的主机访问该服务器的5423端口将被转发到80端口
    firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.24.8.0/24"
    forward-port port="5423" protocol="tcp" to-port="80"'
  • 配置端口转发:将本机的端口转发到一个网段的主机端口

    1
    2
    3
    firewall-cmd --permanent --add-masquerade     # 开启IP伪装
    # 此规则将本机80端口转发到192.168.1.1的8080端口上
    firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.1 --permanent