第二部分(连网)描述了UNIX系统上所使用的协议和用于设置、扩展、维护网络及面向Internet的服务器的技术。另外还介绍了上层网络软件,包括域名系统、电子邮件、单点登录和Web托管。

第十三章 TCP/IP连网

1、基础知识

OSI七层模型结构

  • 应用层 message 报文 HTTPS DNS FTP 应用层协议
  • 表示层 PPDU
  • 会话层 SODU
  • 传输层 segment 报文段 端口:16bit HTTP
  • 网络层 package 包/分组 路由器 IP:32bit
  • 数据链路层 frame 帧 交换机 MAC 物理地址长度:48bit
  • 物理层 bit 比特 集线器

OSI七层模型的各层功能

  • 应用层功能: 网络服务与最终用户的一个接口。提供方便的接口和运行程序。(提供应用程序间通信)
    协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
    FTP主动模式和被动模式
    主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口。
  • 表示层功能: 加密,处理用户信息的表示问题,如编码、数据格式转换和加密解密。(处理数据格式、数据加密)
    格式有:JPEG、ASCll、DECOIC、加密格式等
  • 会话层功能: 向两个实体的表示层提供建立和使用连接的方法(单工,半双工,全双工)。(建立、维护和管理会话)
  • 传输层功能:完成端到端差错检测和流量控制 (TCP面向连接可靠的,UDP面向无连接不可靠)
  • 网络层功能: 确定数据包从源端到目的端如何选择路由,即使用逻辑地址进行选址。(寻址和路由选择)
    协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
  • 数据链路层: 定义了在单个链路上如何传输数据,传输的数据单元称为数据帧。MAC地址寻址(提供介质访问、链路管理等)建立逻辑连接、进行硬件地址寻址、差错校验等功能。将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正
  • 物理层功能: 为数据通信提供传输设备及互连设备,为数据传输提供可靠的环境,传输的数据单元称为比特流。(比特流传输)

分组与封装:
数据以分组的形式在网络上传输,链路层限制了数据的最大长度。每个分组都是由头部(header)和载荷(playload)组成。头部指明了分组从哪里来,要去往何处。另外还包括校验和、协议特定的信息或其他处理说明。载荷就是要传输的数据。

原始数据单元的名称依赖于具体的协议层。
在链路层,它叫作帧(frame);
在网络层,它叫作分组(packet);
在传输层,它叫作段(segment);

链路层分为两部分:

  • 介质访问控制(Media Access Control,MAC)子层。
  • 逻辑链路控制(Logical Link Control,LLC)子层。
  • MAC子层处理传输介质并将分组送入线路。LLC负责成帧操作。

最大传输单元(MTU):1500字节

地址类型

  • 单播:指向单个网络接口的地址;
  • 多播:指向一组主机的地址;
  • 广播:指向本地子网中所有主机的地址;
  • 任播:指向一组主机中任意之一的地址。
  • 多播寻址有助于实现像视频会议这类应用,因为同一批分组必须发送给所有的参与者。Internet组管理协议(IGMP)能够构建并管理主机组,这组主机可以被视为一个多播目标。
  • 任播地址使得分组能够被发送到多个目标中的距离最近的那个(以网络路由的角度),从而在网络层实现负载均衡。

IPv4地址分类,第一个字节范围

  • A类:1~127
  • B类:128~191
  • C类:192~223
  • D类:224~239
  • E类:240~255

私有地址:

  • A类地址 10.0.0.0/8 :10.0.0.0 ~ 10.255.255.255
  • B类地址 172.16.0.0/12:172.16.0.0 ~ 172.31.255.255
  • C类地址 192.168.0.0/16:192.168.0.0 ~ 192.168.255.255

TCP/IP四层模型
TCP/IP模型包含以下4个层次:网络接口层、网络层、传输层、应用层

  • 应用层:直接为用户的应用进程提供服务。
  • 运输层:负责向两个主机进程之间的通信提供服务。
  • 网际层 :负责提供基本的数据封包传送功能,让每块数据包都能到达目的主机。
  • 网络接口层:接收IP数据包并进行传输,从网络上接收物理帧,抽取IP数据包转交给下一层,对实际的网络媒体的管理。

TCP包头内容

  • 序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  • 确认号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1
  • 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
    URG:紧急指针有效
    ACK:确认序号有效
    PSH:接收方应该尽快将这个报文交给应用层。
    RST:重置连接。
    SYN:发起一个新连接。
    FIN:释放一个连接。

三次握手和四次挥手
在这里插入图片描述
概念:指在发送数据的准备阶段,服务器和客户端之间需要三次交互
第一次握手:建立连接时,客户端向服务器发送一个SYN包,并进入SYN_SENT状态,等待服务器确认。
第二次握手:当服务器收到客户端的请求后,此时要给客户端给一个确认信息ACK,同时发送SYN包,此时服务器进入 SYN_RECV状态。
第三次握手:客户端收到服务器发的ACK+SYN包后,向服务器发送ACK,发送完毕之后,客户端和服务器进入 ESTABLISHED(TCP连接成功)状态,完成三次握手。

在这里插入图片描述
概念:所谓四次挥手就是说关闭TCP连接的过程,当断开一个TCP连接时,需要客户端和服务器共发送四个包确认。 
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传输,客户端进入FIN_WAIT_1状态。​  
第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序 号),服务器进入CLOSE_WAIT状态。 
第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传输,服务器进入LAST_ACK状态。
第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器,确认序号为收到序号+1,服务器进入CLOSED状态,完成四次挥手。

子网划分与CIDR(无类域间路由)
子网划分:是一种直接的扩展。
CIDR:依赖于明确的网络掩码定义地址中网络和主机部分的边界,通过简短的CIDR掩码可以聚合多个网络。因此,CIDR有时也被称为超网。
A类地址 10.0.0.0 ~ 10.255.255.255 ,它的CIDR范围是 10.0.0.0/8 :

网络地址转换NAT
NAT有三种类型:

  • 静态 NAT ( Static NAT )( 一对一 )。将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一直不变的。
  • 动态地址 NAT ( Pooled NAT )(多对多)。将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址是不确定,随机的。所有被授权访问 Internet 的私有 IP 地址可随机转换为任何指定合法的 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态 NAT 转换。动态 NAT 是在路由器上配置一个外网 IP 地址池,当内部有计算机需要和外部通信时,就从地址池里动态的取出一个外网 IP,并将他们的对应关系绑定到 NAT 表中,通信结束后,这个外网 IP 才被释放,可供其他内部 IP 地址转换使用,这个 DHCP 租约 IP 有相似之处。 当 ISP 提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
  • 网络地址端口转换 NAPT(Network Address Port Translation)(Port-Level NAT)( 多对一 )。改变外出数据包的源端口并进行端口转换,采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部 IP 地址实现对 Internet 的访问,可以最大限度地节约 IP 地址资源。同时,也可以隐藏网络内部的所有主机,有效避免来自 Internet 的攻击。因此,目前网络中应用最多的就是 PAT 规则。这是最常用的 NAT 技术,也是 IPv4 能够维持到今天的最重要的原因之一,它提供了一种多对一的方式,对多个内网 IP 地址,边界路由可以给他们分配一个外网 IP,利用这个外网 IP 的不同端口和外部进行通信。NAPT 与 动态NAT 不同,它将内部连接映射到外部网络中的一个单独的 IP 地址上,同时在该地址上加上一个由 NAT 设备选定的端口号。
      NAPT 是使用最普遍的一种转换方式,在 HomeGW 中也主要使用该方式。它又包含两种转换方式:SNAT和DNAT。
      (1) 源NAT(Source NAT,SNAT):修改数据包的源地址。源NAT改变第一个数据包的来源地址,它永远会在数据包发送到网络之前完成,数据包伪装就是一具SNAT的例子。
       (2) 目的NAT(Destination NAT,DNAT):修改数据包的目的地址。Destination NAT刚好与SNAT相反,它是改变第一个数据懈的目的地地址,如平衡负载、端口转发和透明代理就是属于DNAT。

SNAT:
内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

DNAT:
当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT

——————

路由选择
路由表

  • ip route show
  • netstat -r
  • netstat -rn 来避免DNS查询

静态路由设置

route add -net 132.236.220.64/26 gw 132.236.212.6 eth1
route add default gw 132.236.227.1 eth0

ARP协议:地址解析协议,主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

  • ARP请求:任何时候,当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个ARP请求报文,这个报文包好了发送方的MAC地址和IP地址以及接收方的IP地址。因为发送方不知道接收方的物理地址,所以这个查询分组会在网络层中进行广播。
  • ARP响应:局域网中的每一台主机都会接受并处理这个ARP请求报文,然后进行验证,查看接收方的IP地址是不是自己的地址,只有验证成功的主机才会返回一个ARP响应报文,这个响应报文包含接收方的IP地址和物理地址。这个报文利用收到的ARP请求报文中的请求方物理地址以单播的方式直接发送给ARP请求报文的请求方。

ARP欺骗:通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通。此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网络上特定计算机或所有计算机无法正常连线。
在这里插入图片描述
DHCP服务
DHCP——UDP——67/68
DHCP 采用了 Client/Server 模型;DHCP Client 需要从 DHCP Server 那里获得各种网络配置参数,这个过程是通过 DHCP Client 与 DHCP Server 之间交互各种 DHCP 消息来实现的。DHCP 消息是封装在 UDP 报文中的,DHCP Server使用端口号 67 来接收 DHCP 消息,DHCP Client 使用端口号 68 来接收 DHCP消息

这一过程包含了四个阶段:发现阶段、提供阶段、请求阶段、确认阶段
在这里插入图片描述
在这里插入图片描述
DNS服务
https://blog.csdn.net/qq_39578545/article/details/105016510

2、网络配置

IP地址、网络掩码、默认路由在/etc/sysconfig/network/中设置。

文件设置内容
network主机名、默认路由
network-scripts/ifcfg-ifname每个接口的参数:IP地址、网络掩码等
network-scripts/route-ifname每个接口的路由:ip route的参数

在/etc/sysconfig/network,可以指定DNS域及默认网关

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=kolor
DOMAINNAME=baidu
GATEWAY=192.168.1.254

特定接口的数据保存在/etc/sysconfig/network-scripts/ifcfg-ifname中,其中ifname是网络接口的名称。这些配置文件负责设置每个接口的IP地址、网络掩码、网络以及广播地址,以及还有一行用于指定该接口是否在引导期间“激活”。

DEVICE=eth0
IPADDR=192.168.1.13
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
MTU=1500
ONBOOT=yes

基于DHCP的eth0设置

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

修改过/etc/sysconfig中的配置信息之后,在相应的接口上先执行ifdown ifname,再执行ifup ifname。如果你一次配置多个接口,可以重启network服务systemctl restart network

ifconfig配置网络接口
设置接口em0的IPv4地址和网络掩码并启用了该接口
ifconfig em0 192.168.1.13/26 up

查看网络硬件信息
ethtool命令可以查询和设置网络接口的特定介质参数,例如链路速率和双工
# ethtool eth0
要想将该接口锁定100Mbit/s、全双工,可以使用命令:
# ethtool -s eth0 speed 100 duplex full

测试环境中的自动协商,可以通过ethtool -r命令强制立即重新协商链路参数。

使用ethtool做出的改动都不是永久性的,如果想要永久就需要在各个接口配置,如在/etc/sysconfig/network-scripts中加入一行ETHTOOL_OPTS=。ifup命令会将整行作为参数传给ethtool。

3、TCP/IP相关的内核参数

连网参数位于/proc/sys/net/ipv4和/proc/sys/net/ipv6目录下。

参数设置

  • echo
    $ sudo sh -c "echo 1 > icmp_echo_ignore_broadcasts"
  • sysctl
    $ sysctl net.ipv4.icmp_echo_ignore_broadcasts=1
  • /etc/sysctl.conf
    永久改变这些参数(sysctl命令会在系统引导期间会读取该文件。)
    net.ipv4.ip_forward=0 关闭主机的IP转发功能

sh -c的必要性
在Linux使用 echo 并配合命令重定向是实现向文件中写入信息的快捷方式。

比如要向 test.asc 文件中随便写入点内容,可以:
$ echo “信息” > test.asc
或者
$ echo “信息” >> test.asc
下面,如果将 test.asc 权限设置为只有 root 用户才有权限进行写操作:
$ sudo chown root.root test.asc
然后,我们使用 sudo 并配合 echo 命令再次向修改权限之后的 test.asc 文件中写入信息:
$ sudo echo “又一行信息” >> test.asc
-bash: test.asc: Permission denied
这时,可以看到 bash 拒绝这么做,说是权限不够。这是因为重定向符号 “>” 和 “>>” 也是 bash 的命令。我们使用 sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” 和 “>>” 命令也具有 root 权限,所以 bash 会认为这两个命令都没有像 test.asc 文件写入信息的权限。
解决这一问题的途径有两种。第一种是利用 “sh -c” 命令,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:
$ sudo sh -c ‘echo “又一行信息” >> test.asc’

另一种方法是利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:
$ echo “第三条信息” | sudo tee -a test.asc
注意,tee 命令的 “-a” 选项的作用等同于 “>>” 命令,如果去除该选项,那么 tee 命令的作用就等同于 “>” 命令

4、网络故障排除

ping、traceroute、tcpdump、wireshark。

当在协议栈中上下排查时,问自己一些像下面这样的问题。

  • 有没有物理线路和链路指示灯?
  • 接口是否配置正确?
  • ARP表中有没有显示其他主机?
  • 本地机器上有没有安装防火墙?
  • 你当前所在位置和目的地之间是否有防火墙?
  • 如果有防火墙,则是否能够响应ICMP ping?
  • 本地地址(127.0.0.1)能否ping通?
  • 能否ping通其他本地主机的IP地址?
  • DNS工作是否正常?
  • 能否ping通其他本地主机的主机名?
  • 像Web和SSH这种高层服务是否能够工作?
  • 检查防火墙了吗?

ping:检查主机是否存活
要探明分组丢失的原因,先执行traceroute命令,了解分组到达目标主机所途径的路线。然后按顺序ping途中的各个网关,看是哪条链路丢弃了分组。

ping命令能够发送任意大小的回显请求分组,通过使用大于网络MTU(以太网通常是1500字节)的分组,可以强制分片。这种方法有助于识别介质错误或其他如网络拥塞或VPN带来的底层问题。-s选项可以指定以字节为单位的分组大小。
$ ping -s 1500 www.baidu.com

traceroute:跟踪IP分组
traceroute能够揭示分组从源头到达目的地所经过的一系列网关,工作原理是将出站分组的存活时间(time-to-live)字段人为设置为较低的值。当分组抵达网关时,其TTL会减少。如果网关将TTL减为0,该分组会被丢弃,网关会向源主机返回ICMP “time exceeded”(超时)消息。

traceroute的星号*,造成这种情况的原因可能是拥塞,也可能是优先服务“更实际”的流量,有name几个星号并不代表碰上了麻烦

如果发现在某个网关处所有的时间字段全都变成了星号,也没有出现“time exceeded”消息,那可能纯碎是因为网关挂掉了。

如果DNS出现故障,那么使用traceroute -n输出数字形式的IP地址。该选项会禁止查找主机名。

traceroute需要root权限才能使用,如果想让普通用户也能用,必须以setuid root的形式安装。

tcpdump与wireshark:侦听网络流量
tcpdump:https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
tcpdump选项:
-i选项,指定接口
-n选项,不进行DNS名称查询
-v选项,增加信息量
-vv选项,增加更多信息量
-w选项,将结果保存到文件中,默认只保存分组头部。
除非只需要头部信息,否则最好使用-s选项指定一个位4892倍数的值来捕获整个分组。
-r选项,读取

监视指定网络接口的数据包
tcpdump -i eth1

监视来自某一子网的入站Web流量
tcpdump src net 192.168.1.0/24 and dst port 80

截获所有210.27.48.1 的主机收到的和发出的所有的数据包
tcpdump host 210.27.48.1 

想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2

截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) 

Wireshark(以前是ethereal)是Windows下非常简单易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具。
还好有Tcpdump。我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

网络监控:SmokePing、iPerf、Cacti

5、防火墙iptables

iptables
四表五链
在这里插入图片描述

在这里插入图片描述

iptables [-t 表名] 命令选项 [链名] [规则号码] [条件匹配] [-j 目标动作]
      小写 大写  大写      小写    大写

说明:
表名和链名:用于指定iptables命令所操作的表和链
命令选项:用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等)
规则号码:用于指定规则的编号
条件匹配:用于指定对符合什么样条件的数据包进行处理(比如:什么协议、出入网卡等)
目标地址:用于指定数据包的处理方式(比如:允许处理、拒绝、丢弃等)
iptables 常用的命令选项

常见的命令选项
-L                查看
-A                追加,放置在最后一条
-I                插入,默认插入成第一条
-D                删除
-F                清空flush
-P                设置默认策略policy      Chain xxx (policy ACCEPT)
-R				  覆盖

处理动作:
filter表:
-j ACCEPT     允许
-j DROP       丢弃,没有任何提示信息
-j REJECT     拒绝,有提示信息。返回ICMP错误消息
-j LOG        写日志     /var/log/messages   然后将数据包传递给下一条规则

nat表:
-j SNAT           源地址转换 POSTROUTING
-j DNAT           目标地址转换 PREROUTING

iptables防火墙,必须启用IP转发并确保各个iptables模块都已经载入内核。
iptables -F chain-name,清除链中先前的所有规则
iptables -P chain-name target,设置链的默认策略,推荐使用DROP作为默认的链目标
iptables -A chain-name -i interface -j target,将当前规则追加到链中,-i选项将规则应用于指定的interface,-j选项标识出target。

iptables过滤器的命令行选项

子网含义或可能的值
-p proto依据协议匹配:tcp、udp、icmp
-s source-ip匹配主机或源IP地址(可以使用CIDR写法)
-d dest-ip匹配主机或目标IP地址
--sport port依据源端口匹配
--dport port依据目的端口匹配
--icmp-type type依据ICMP类型匹配
!否定子句
-t table指定命令所应用的表(默认是filter)

示例:
第一组规则负责初始化filter表。

首先,清除表中所有的链,然后将INPUT和FORWARD链的默认目标设为DROP,丢弃未经许可的所有分组。

iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP

第二组规则
规则是按顺序评估的,最频繁用到的规则放在最前面。第一条规则允许所有发自受信网络的连接通过防火墙。FORWARD链中剩下的3条规则允许通过防火墙与网络服务器10.1.1.2建立连接。具体来说,允许SSH,HTTP,HTTPS通过我们的Web服务器。

iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT

第三组规则
第一条规则唯一允许进入防火墙主机(10.1.1.1)的TCP流量就是SSH,这对于管理防火墙本身很有用。第二条规则允许环回流量,这种流量始终保持在主机内部。第三条允许来自内部IP地址的ICMP ECHO_REQUEST分组。

iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT
iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT

第四组规则
禁止所有未明确允许的分组来结束INPUT和FORWARD链。尽管已经使用iptables -P命令强制了这种行为,但LOG目标可以让我们知道谁在Intern俄儿童上想要通过防火墙。

iptables -A INPUT -i eth1 -j LOG
iptables -A FORWARD -i eth1 -j LOG

第五组规则
简单的状态化FORWARD链对离开网络的流量不进行限制,但只允许与主机已发起的连接相关的流量传入。

iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables要想跟踪像FTP和IRC这种复杂的网络会话,一些内核模块必须事先载入。如果没有装载这些模块,iptables会禁止此类连接。尽管状态化分组过滤能够提高站点的安全性,但同时也增加了网络的复杂性,造成性能降低。

iptables -L -v 可能是调试iptables规则最好的方法了,可以知道链中的各条规则都匹配了多少次。

第六组规则
NAT工作,需要通过将内核变量/proc/sys/net/ipv4/ip_forward设置为1来启用内核的IP转发功能。另外,还需要插入相应的内核模块。

$ modprobe iptable_nat
$ modprobe ip_conntrack
$ modprobe ip_conntrack_ftp

使用NAT路由分组的iptables命令形式如下。

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 128.138.101.4
-j SNAT           源地址转换 POSTROUTING
-j DNAT           目标地址转换 PREROUTING

https://blog.csdn.net/qq_39578545/article/details/105068208 NAT表

6、云联网VPC

ucloud的VPC产品:https://docs.ucloud.cn/vpc/introduction/vpc

私有网络简介
私有网络 VPC(Virtual Private Cloud)是属于用户的、逻辑隔离的网络环境。在私有网络中,可以创建指定网段的VPC,在VPC中创建子网并自主管理云资源,同时通过网络ACL实现安全防护。私有网络VPC为用户提供以下能力:

自定义网段:三种网段自由组合,VPC网段随时增减
完备的网络管理:网关NAT、自定义路由表、网络ACL、内网虚拟IP、虚拟网卡,用户都可自由选择配置,并且按照需求设定规则。
子网跨可用区:子网可覆盖地域内任一可用区,实现跨可用区的灾备。
高扩展:跨地域VPC之间可通过高速通道(UDPN)打通,实现稳定的内网传输;结合专线接入,实现单点接入、全球互通的混合云架构。

VPC的路由
VPC的路由选择要比传统的硬件网络简单,因为云并没有模拟物理拓扑。所有可访问的目的地只用一个逻辑跳(one logical hop)就可以到达。
同一VPC内网络默认互通,不同VPC间网络默认不通。VPC网络互通功能可实现不同项目/不同地域的VPC间网络互通,其中不同地域间的VPC需要互通时,需要高速通道配合使用。
互通的VPC间网段不允许重叠。

私有网络组件
私有网络包含VPC、子网、NAT网关和网络ACL等组件:

  • VPC:VPC是属于用户的、逻辑隔离的网络环境。在私有网络中,可以创建指定网段的VPC,在VPC中创建子网并自主管理云资源。
  • 子网:为了科学有效地划分VPC内的地址空间,将其划分为更细粒度的网络段。这些独立的网络段叫做子网(Subnet)。
  • NAT网关:NAT网关是一款企业级的VPC公网网关,可以让子网中未绑定弹性IP的云资源访问外网,也可配置端口转发规则使云资源对外提供服务。
  • 网络ACL:是子网级别的安全策略,用于控制进出子网的数据流。用户可以通过设置出站规则和入站规则,对进出子网的流量进行精确控制。
  • 路由表:路由表是VPC级别的产品,可以控制云资源的网络流量路径。一张路由表由多条路由规则组成,通过与子网绑定,对子网内所有的资源生效。

搭建VPC网络
1、创建VPC。例如更改备注、更改业务组、添加网段等
2、创建子网。
3、添加云主机。创建主机实例,创建时选择相应的VPC和子网。创建成功后,该云主机将存在于该VPC中。
4、创建NAT网关。在NAT网关标签页中点击“创建NAT网关”按钮创建NAT网关实例,选择已创建的VPC和子网。
5、绑定网络ACL

第十四 十五章 物理联网与路由(略)

非屏蔽双绞线:UTP(如今无线网络在很多场景以及取代了UTP)
非屏蔽双绞线(英语:Unshielded Twisted Pair,UTP)是一种数据传输线,由四对不同颜色的传输线互相缠绕所组成,每对相同颜色的线传递著来回两方向的电脉冲,这样的设计是利用了电磁感应相互抵销的原理来屏蔽电磁干扰。UTP广泛用于以太网(局域网)和电话线中。

标准568A:
绿白——1,绿——2,橙白——3,蓝——4,蓝白——5,
橙——6,棕白——7,棕——8
标准568B:
橙白——1,橙——2,绿白——3,蓝——4,蓝白——5,
绿——6,棕白——7,棕——8 、

以太网工作方式(CSMA/CD)

  • 载波侦听(Carrier Sense),意思是网络上各个工作站在发送数据前,都要确认总线上有没有数据传输。若有数据传输(称总线为忙),则不发送数据;若无数据传输(称总线为空),立即发送准备好的数据。
  • 多路访问(Multiple Access),意思是网络上所有工作站收发数据,共同使用同一条总线,且发送数据是广播式。
  • “冲突检测”是指发送结点在发出信息帧的同时,还必须监听媒体,判断是否发生冲突(同一时刻,有无其他结点也在发送信息帧)。

集线器:负责在物理层连接以太网网段,现如今是用交换机。

自动协商

  • 对于速率在1Gbit/s或以上的所有接口,必须全部使用自动协商。这是标准要求的
  • 对于速率在100Mbit/s或以下的接口,要么将链路两端都配置成自动协商模式,要么手动配置两端的速率和双工模式。如果只在一端配置了自动协商,那么该段是不会学习到另一端如何配置的。结果就是两端的配置不一致,导致网络性能低下。

路由协议
OSPF:https://blog.csdn.net/qq_39578545/article/details/105397270
BGP协议:https://blog.csdn.net/qq_39578545/article/details/105424896
BGP:边界网关协议。BGP是一种外部路由协议,用于管理自治系统之间的流量。

路由协议的多播地址

描述IPv6IPv4
该子网中的所有系统ff02::1224.0.0.1
该子网中的所有路由器ff02::2224.0.0.2
未分配ff02::3224.0.0.3
DVMRP路由器ff02::4224.0.0.4
OSPF路由器ff02::5224.0.0.5
OSPF DR路由器ff02::6224.0.0.6
RIP路由器ff02::9224.0.0.9
EIGRP路由器ff02::10224.0.0.10

第十六章 DNS域名系统

1、DNS工作原理

DNS是一个分布式数据库。DNS查询由名称和记录类型组成。返回的答复包含一组响应查询的“资源记录”。

DNS查询顺序
/etc/resolv.conf
DNS服务器是按顺序查找的。只要第一个名称服务器能够答复查询,就忽略其他服务器。如果出现问题,查询超时,则尝试下一个名称服务器。每个服务器逐一尝试,最多4次。每失败一次,超时间隔就会增加。默认超时间隔是5s。

DNS名称空间
DNS名称空间是按照树的形式组织的,其中既包含正向映射,也包含反向映射。正向映射负责将主机名映射为IP地址,反向映射负责将IP地址映射为主机名。
在这里插入图片描述

没有末尾的点号有时叫作“全限定主机名”。

DNS的工作原理
名称服务器分类
在这里插入图片描述
这些分类取决于名称服务器的数据来源(权威、缓存、主、从),所保存的数据类型(存根)、查询路径(转发器)、回答的完整性(递归、非递归)以及服务器的可见性(分发)。

权威服务器与仅执行缓存的服务器
主服务器对于它们自己的区是权威的,但对于所缓存的其他区的信息就没有权威性了。

仅执行缓存的名称服务器从启动文件中获得根域服务器的地址,通过缓存已解析的查询来积累其余的数据。这种服务器没有自己的数据,不具备任何区的权威性(可能除了localhost区)
——————

递归和非递归服务器
名称服务器要么是递归,要么是非递归的。
如果非递归服务器缓存了先前事务的查询结果,或者对所有查询的域具有权威,那么它就能够提供正确的响应。否则,它不会返回真正的答案,而是引荐更优可能知道答案的其他域的权威服务器。非递归服务器的客户端必须做好准备,接受并处理这些推荐的服务器。(迭代)

权威服务器(例如,根服务器和顶级域服务器)都是非递归的,因为它们每秒钟可能要处理数万次查询,少干点别的活也是可以原谅的。

递归服务器只返回真正的答案和错误信息。它会跟随被引荐的服务器,减轻客户端的负担。
——————

授权
所有名称服务器都要通过本地配置文件才能找到根服务器,根服务器知晓com、net、fi、de以及其他顶级域的名称服务器。沿着这个链条继续往下,edu知晓colorado.edu、berkeley.edu等。每个域都可以将其子域的权威授权给其他服务器。

下面看一个真实例子,通过主机lair.cs.colorado.edu上查找主机vangogh.cs.berkeley.edu的地址。主机lair会询问本地的名称服务器ns.cs.colorado.edu,以求得到答案。
在这里插入图片描述
在这里插入图片描述

——————

使用查询工具进行调试
dig最常见的用法是确定特定名称返回的记录。

  • 如果只返回了AUTHORITY响应,则表明你被引向了其他名称服务器。
  • 如果返回的是ANSWER响应,则表明发出的查询被直接答复了(可能还包含其他信息)

从根服务器开始手动跟随授权链,以此验证是否存在问题。
示例:处理域名 www.viawest.com的例子。首先,我们查询根服务器,请求起始授权(Start-of-Authority,SOA)记录,查看谁对viawest.com是权威的。利用参数@nameserver查询指定的名称服务器。

$ dig @a.root-server.net viawest.com soa
;; xxxx,status: NOERROR, id: 7824
;; AUTHORITY SECTION:
com.	172800 IN NS c.gtld-servers.net.

注意,返回的status状态是NOERROR。这表明响应信息中没有明显的错误。其他常见的状态是NXDOMAIN和SERVFAIL,NXDOMAIN表明所请求的名称不存在(或者没有注册),SERVFAIL通常表明名称服务器本身的配置有错误。

AUTHORITY SECTION告诉我们全球顶级域(global Top-Level Domain,gTLD)服务器是指定域名的授权链中的下一环。所以,我们从中随便挑出一个,重复同样的查询。

$ dig @c.gtld-servers.net viawest.com soa
;; AUTHORITY SECTION:
viawest.com. 172800 IN NS ns1.viawest.net

这次响应的内容知道了要查询的下一个服务器是ns1.viawest.com

$ dig @ns1.viawest.net viawest.com soa
;; ANSWER SECTION:
viawest.com.	3600	IN	SOA	mvec.viawest.net.	hostmaster.

查询返回了viawest.com域的ANSWER响应。我们现在知道了权威名称服务器,可以查询所需要的www.viawest.com了

$ dig @ns1.viawest.net www.viawest.com any
;; ANSWER SECTION:
www.viawest.com.	60	IN CNAME hm-d8ebfa-via1.threatx.io.

最后这次查询显示出www.viawest.com的CNAME记录指向hm-d8ebfa-via1.threatx.io,这意味着它是threatx主机的另一个名称。如果查询的是一台递归式名称的服务器,它会代替你跟随整个授权链。但是在调试时,检查授权链的每个环节通常更优帮助,

2、DNS数据库 zone

区数据库是由系统管理员在该区的主名称服务器上维护的一组文本文件。这些文本文件通常叫作区文件(zone file)。区文件中包含了两种条目:解释器命令(例如,$ORIGIN$TTL)和资源记录。只有资源记录才是数据库真正的组成部分,解析器命令只不过是提供了输入记录的一些便捷手段。

区文件中的解释器指令
用户可以在区文件中嵌入指令,提高其可读性和可维护性。
有3个指令($ORIGININCLUDE$TTL)属于所有DNS实现的标准命令,第4个指令$GENERATE只能用于BIND。指令必须从第一列开始,独占一行。

按照自上到下的处理顺序,只用一遍就完成区文件的读取及解析。在名称服务器读取区文件的同时,它会将默认域(或 起始域)添加到尚未完全限定的名称之后。域名默认的起始域是在名称服务器的配置文件中指定的。但是你可以在区文件中使用$ORIGIN指令设置或更改起始域。
$ORIGIN domain-name
在要求使用全限定名称的地方使用相对名称省去了大量的输入工作,极大地提高了区文件的可读性。

很多站点都在区文件中使用$INCLUDE命令把有开销的记录与数据记录隔开,把区文件分成多个逻辑部分,或是把密钥保存在有受限权限的文件中。其语法为:

$INCLUDE filename [origin]

在碰到$INCLUDE指令时,指定文件会被读取到区数据库中。如果filename没有采用绝对路径,则将其解释为相对于名称服务器的主目录。
注意:执行完$INCLUDE指令之后,起始域的值就无法恢复到之前了。你可能需要在被包含文件的末尾或是$INCLUDE命令的下一行重置起始域。

$TTL指令可以设置跟随其后的资源记录中存活时间TTL字段的默认值。它必须是区文件的第一行。TTL的默认单位是s秒。例如,下面这几行都可以将$TTL设置为1天。

$TTL 86400
$TTL 24h
$TTL 1d

把TTL的值增加到1周,这样会显著降低网络流量和DNS负载。一单资源记录被外界(局域网之外)缓存,是无法强制将其丢弃的。如果你计划进行大规模的重新分配地址,而且之前的ttl为1周,至少在实施计划1周前降低$ttl的值(例如降低到1h),这一准备步骤可以确保ttl为一周资源记录已国企,被替换为ttl为1h的资源记录。于是就能肯定所有的更新会在1h内传播出去。更新完成之后,就可以把ttl改回原先的值。

资源记录
DNS层级中的每个区都有一组与之相对的资源记录,其基本格式为:
[name] [ttl] [class] type data
字段之间以空白字符(制表符或空格)分隔,字段中可以包含下标中出现的特殊字符,资源记录中的特殊字符如图所示。

字符含义
;引入注释
@当前区的名称
()允许数据跨行
*通配符(仅适用于name字段)
  • name(名称)字段标识了资源记录所描述的实体(通常是主机或域)。如果多个连续的资源记录指的都是同一个实体,第一条记录后的name字段可以忽略,只要后续记录都是以空白字符开头即可。如果存在name字段的话,则该字段必须起始于第一列。
    名称既可以采用相对形式,也可以采用绝对形式。绝对名是以点号结尾的完整域名。在内部,软件只处理绝对名,它会将当前起始域和点号添加到任何没有以点号结尾的名称之后。这种特性能够缩短名称长度,但也会引发错误。
    举例来说,如果当前域名是 cs.colorado.edu,那么名称 anchor可以被解释为anchor.cs.colorado.edu。如果漏掉了结尾的点号,把名称错写为anchor.cs.colorado.edu,该名称会被视为相对名,结果就是anchor.cs.colorado.edu.cs.colorado.edu。这是一种常见的错误。
  • class(类别)指定了网络类型,默认类型IN表示Internet
  • type(类型)
    • A (host),即是A记录,也称为主机记录,是DNS名称到IP地址的映射,用于正向解析。
    • CNAME:CNAME记录,也是别名记录,用于定义A记录的别名。
    • MX (mail exchange): 邮件交换器记录,用于告知邮件服务器进程将邮件发送到指定的另一台邮件服务器。(该服务器知道如何将邮件传送到最终目的地)。
    • NS :NS记录,用于标识区域的DNS服务器,即是说负责此DNS区域的权威名称服务器,用哪一台DNS服务器来解析该区域。一个区域有可能有多条ns记录,例如zz.com有可能有一个主服务器和多个辅助服务器。
    • PTR:是IP地址到DNS名称的映射,用于反向解析。
    • SOA:用于一个区域的开始,SOA记录后的所有信息均是用于控制这个区域的,每个区域数据库文件都必须包含一个SOA记录,并且必须是其中的第一个资源记录,用以标识DNS服务器管理的起始位置,SOA说明能解析这个区域的dns服务器中哪个是主服务器
  • data(数据)字段的内容取决于资源记录类型。针对特定域和记录类型的DNS查询会从区文件中返回所有匹配的资源记录。

SOA记录
起始授权(SOA)记录标识了一个区,也就是位于DNS名称空间中相同位置的一组资源记录。每个区都只有一条SOA记录。SOA记录包括区名、该区的主名称服务器、技术联系人以及各种超时值。注释可以通过分号引入。

; Start of authority record for atrust
atrust. 	IN SOA	ns1.atrust.com.	hostmaster.atrust.com. (
	2017110200	; Serial number
	10800		; Refresh (3 hours)  刷新
	1200		; Retry	(20 minutes) 重试
	3600000		; Expire (40+ days)  过期
	3600 )		; Minimum (1 hour)   最小

refresh字段指定了从服务器应隔多久检查一次主服务器,看看区配置文件的序列号是否发生变动。
只要有改动,从服务器就必须更新区数据的父本。从服务器会比较序列号。如果主服务器的序列号更大,则从服务器请求区传输,更新数据。

与其让从服务器被动地等待超时,安装了BIND的主服务器会在每次更新区时主动提醒从服务器。但是更新提醒
可能会因网络拥塞而丢失,所以还是应该讲refresh字段设置为一个合理的值。

expire字段决定了在缺少主服务器的情况下,域数据的权威性还能再服务器中维持多久。

minimum字段可以设置已缓存的否定答复的存活时间。肯定答复(也就是实际的资源记录)默认的存活时间是由区文件顶部的`$TTL`指令设置的。

$TTL、expire、minimum最终会强制DNS客户端丢弃旧数据。

SOA记录的name字段(在本例中是atrust.com)经常会出现符号@,这是当前区名的简写。@的值就是文件name.conf中的zone语句所指定的域名。 这个值可以在区文件中利用$ORIGIN解析器指令更改。(@符号所代表的意思可以由$ORIGIN关键字来指定)

其中上面这个例子并没有出现ttl字段,class字段的IN表示Internet,type字段是SOA,剩下的都是data字段的内容。括号中的数值参数都是超时值,不加注释的话,通常写在一行中。
ns1.atrust.com.是该区的主名称服务器。
hostmaster.atrust.com.是作为基数联系人的电子邮件地址。
括号可以使SOA记录跨多行。第1个数值参数是区配置数据的序列号。从服务器使用这个序列号决定什么时候获取新数据。序列号可以是任意的32位证书,每当区数据文件有变化时就要增加改值。很多站点会把区文件的修改日期编入序列号中。举例来说,2017110200就表示区数据在2017年11月2日的第一次更改。

序列号不要求连续,但必须单调递增。只有主服务器的序列号大于从服务器的序列号时,后者才会请求新数据。如果你不小心在主服务器上设置了一个相当大的值,并且这个值已经被传到了从服务器,那么即便是更正住服务器上的序列号也于事无补。解决这种问题的办法有两种。

常见的错误就是修改了区数据文件,但是忘了更新序列号。这样导致的结果就是无法将变更传播到从服务器。

——————————————

NS记录
NS(名称服务器)标识出了某个区的权威服务器(也就是所有的主服务器和从服务器)并将子域授权给其他组织。NS记录通常直接放置在区的SOA记录之后。
等等这些记录。具体 后面通过BIND配置文件查看

DNS结构
在这里插入图片描述
根域: .
一级域名<顶级域 | 国家域> .com .edu .gov .net .cn
二级域名:qq.com baidu.com
如果询问一次得到结果 递归查询 C-S
如果询问多次得到结果 迭代查询 S-S
在这里插入图片描述

3、BIND软件

DNS的域名解析 是 udp/53,主从之间的数据传输默认使用tcp/53
DNS软件: Bind是一款开放源码的DNS服务器软件,支持各种Unix和Windows平台

BIND包含4个主要的组成部分:

  • 名为named的名称服务器守护进程,负责回答查询;
  • 解析器库,代表用户查询DNS服务器;
  • DNS的命令行接口,即nslookup、dig、host;
  • 称为rndc的named远程控制程序

named.conf中用到的语句

语句功能
include引入文件
options设置全局配置选项/默认值
acl定义访问控制列表
key定义认证信息
server指定单个服务器选项
masters为存根区和从区定义主名称服务器
logging指定日志记录分类及其目的地
statistics-channels以XML格式输出实时统计信息
zone定义区
controls定义使用rndc控制named时用到的通道
view定义区数据视图
lwres指定named也作为解析器

地址匹配列表可用作很多语句和选项的参数。下面例子

{ ! 1.2.3.13; 1.2.3/24; };
排除了主机1.2.3.13,但包括了网络1.2.3.0/24中剩余的所有主机。

首次匹配算法使得表项的顺序显得非常重要。如果这个例子颠倒,因为1.2.3.13顺利匹配到1.2.3.0/24,否定表项根本没机会处理。

include语句
include "path";

option语句
option语句指定了全局设置,其中一些随后可能会被特定区域服务器的配置覆盖掉。该语句的一般格式为:

options {
	option;
	option;
	..
};

options {
	// 1.文件位置
	directory "path";  directory语句会使得named切换到指定目录。
	key-directory "path";
	
	// 2.名称服务器标识
	version "string";
	hostname "string";
	server-id "string";   加入hostname和server-id参数的目的在于使用任播路由复制根服务器和gTLD服务器的实例。

	// 3.区同步
	notify yes | master-only | explicit | no;	[yes]
	also-notify server-ipaddrs;		[empty]
	allow-notify address-match-list;	[empty]
	// notify和also-notify子句仅适用于主名称服务器。allow-notify仅适用于从名称服务器。
	   notify既可以作为全局选项,也可以作为特定区的选项。这可以显著提高数据出现变动之后区文件的收敛速度。
	// 只要将notify设为yes,一旦重载区数据库,主服务器上的named就会通知对方。从服务器然后同主
	   服务器碰头,看看区文件是否发生变化,变化了就更新文件副本。
	// notify设置为master-only能够限制散播行为,使其仅限于向将该服务器作为主名称服务器的那么些区中的都从名称服务器发送通知。
	   散播是指每个权威服务器都会向其他权威服务器发送更新。
	   notify设置为explicit,那么named只会通过在also-notify子句中列出的服务器。

	// 4.递归查询
	recursion yes | no;		[yes]
	allow-recursion { address-match-list };		[all hosts]
	// recursion选项指定了named是否应该代表用户处理递归查询。
	   加入allow-recursion子句,这样named就能够区分出来自站点的查询和远程的查询了。

	// 5.使用缓存
	recursive-clients number;	[1000] // 控制着服务器能够同时处理的递归查询数量,每个查询大概需要占用20KB的内存。
	max-cache-size number;	[ulimited] // 限制了服务器用于缓存查询答复的内存大小。如果缓存占用过多,则named会在记录的TTL过期之前将其删除,将缓存占用维持在限定之下。

	// 6.IP端口利用情况
	use-v4-udp-ports { range begin end; };	[range 1024 65535]
	use-v6-udp-ports { range begin end; };	[range 1024 65535]

	avoid-v4-udp-ports { port-list };	[empty]
	avoid-v6-udp-ports { port-list };	[empty]

	query-source v4-address [port]	[any]
	query-source-v6 v6-address [port]	[any]
	// query-source选项可以指定用于发出查询的IP地址。
	
	// 7.转发
	forwarders { in_addr; in_addr; ... };	[empty list]
	forward only | first;	[first]
	// 通过指派服务器作为转发器,这样就不用让所有的名称服务器都自己执行外部查询了。
	   正常的DNS查询是从根服务器开始,然后跟随引荐链,而转发器的运用则绕过了这一正常的过程。(注意别造成转发环路)
};

	// 8.权限
	allow-query { address-match-list };	[all hosts]
	allow-query-cache { address-match-list };	[all hosts]
	allow-transfer { address-match-list };	[all hosts]
	allow-update { address-match-list };	[none]
	blackhole { address-match-list };	[empty]
	// blackhole地址列表中标识出了你压根就不想与之打交道的服务器,named不接受由这些服务器发出的查询,也绝不会向其询问。

	// 9.分组大小
	edns-udp-size number;	[4096]
	max-udp-size number;	[4096]

	// 10.DNSSEC控制
    dnssec-enable yes | no; [yes]  安全扩展机制(签名认证),默认yes
    dnssec-validation yes | no;	[yes]
    dnssec-must-be-secure domain yes | no;	[none]
	// DNSSEC 域名系统安全,是DNS的安全扩展协议
		DLV DNSSEC 后备秘钥
		这些安全机制的设定,是为了保护DNS服务器与用户之间的数据安全,避免恶意数据对用户的欺骗
		
	// 11.统计
	zone-statistics yes | no	[no]
	// 该选项会使得named同时维护单个区的统计以及全局统计。运行rndc state可以把统计信息转储到文件中
    // statistics-file "/var/named/data/named_stats.txt";  统计
    // memstatistics-file "/var/named/data/named_mem_stats.txt";   内存统计

	// 12.性能调校  P379
	clients-per-query init; [10]
	.....
	tcp-clients init;	[100]
	
};

如果named.conf中没有出现options语句,则采用默认值。

 

acl语句
控制列表就是带有名字的地址匹配列表。

acl acl-name {
	address-match-list
};

any: 所有主机
localnets: 本地网络中的所有主机
localhost: 主机 (主机直接相连的所有网络,主机的网络地址和网络掩码求模)
none: 没有任何主机

acl必须是named.conf中的顶层语句(别放在其他的选项声明中),named.conf只读取一遍,所以访问控制列表一定要在使用之前定义。

—————————

server语句

master语句

logging语句

zone语句

—————————

BIND配置文件如下:

DNS-server上完成
1.关闭防火墙和selinux
#service iptables stop
#chkconfig iptables off
#getenforce
Enforcing
#setenforce 0   //临时关闭
#getenforce
Permissive
#vim /etc/sysconfig/selinux   //永久关闭
#grep ^SELINUX /etc/sysconfig/selinux
SELINUX=disabled
SELINUXTYPE=targeted

2.配置yum源

3.软件三部曲
#yum list | grep bind	 //查看并安装软件
#yum -y install bind		
#rpm -q bind			//确认成功安装
#rpm -ql bind                  //查看软件的文件列表
看到了NetwrokManager ,这个要关掉。不然会刷新配置文件
etc/named     //配置文件的主目录
/etc/named.conf      //主配置文件
/etc/named.rfc1912.zones     //zone文件,定义域
/etc/rc.d/init.d/named       //启动脚本

/usr/sbin/named      //程序的二进制命令
/usr/sbin/named-checkconf    //检查配置文件的命令  named.conf  named.rfc1912.zones
/usr/sbin/named-checkzone    //检查配置文件的命令

/var/log/named.log   //日志文件
/var/named           //数据文件的主目录,区文件
/var/named/named.ca  //根域服务器,因此DNS服务器知道根在哪
/var/named/named.localhost   //正向解析区域文件的模板
/var/named/named.loopback    //反向解析区域文件的模板
/var/named/slaves            //从dns服务器下载文件的默认路径
/var/run/named               //进程文件


4.了解配置文件
主配置文件:/etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; any; };      监听方式,any表示全网监听
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";               
        dump-file       "/var/;named/data/cache_dump.db";    DNS缓存文件
        statistics-file "/var/named/data/named_stats.txt";  统计
        memstatistics-file "/var/named/data/named_mem_stats.txt";   内存统计
        allow-query     { localhost; any; };    允许哪些人可以查询,any任何人
        recursion yes;      是否递归
 
        dnssec-enable no;   安全扩展机制(签名认证),默认yes
        dnssec-validation yes;
        dnssec-lookaside auto;
 
        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";
 
        managed-keys-directory "/var/named/dynamic";
};
说明:
DNSSEC 域名系统安全,是DNS的安全扩展协议
DLV DNSSEC 后备秘钥
这些安全机制的设定,是为了保护DNS服务器与用户之间的数据安全,避免恶意数据对用户的欺骗
 
zone "." IN {               根服务器
        type hint;
        file "named.ca";
};
 
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
 ————————————————————————————————————————————————————————
域是在子配置文件定义
子配置文件: /etc/named.rfc1912.zones
/etc/named.rfc1912.zones
//正向模板
zone "localhost.localdomain" IN {   
        type master;
        file "named.localhost";     注意下面会对引号内的文件进行修改配置
        allow-update { none; };
};
//反向模板 IP反过来写
zone "1.0.0.127.in-addr.arpa" IN {      
        type master;
        file "named.loopback";
        allow-update { none; };
};


#cd /var/named
#cat named.localhost   正向模板
@符号在这里已经有它的含义了,所以用 点 来分隔
#cat named.loopback   反向模板
cat /etc/named/named.localhost
正向
$TTL 1D                             缓存的生命周期
@   IN SOA  @ rname.invalid. (      
                    0   ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
    NS  @
    A   127.0.0.1
    AAAA    ::1
 
@ = zonename = itcast.com  当前域
IN 互联网
SOA 开始协议
NS dns服务端
A ipv4正向
AAAA ipv6
CNAME 别名
MX 邮件交互记录   5 表示优先级 数字越小越优先
 
反向
$TTL 1D
@   IN SOA  @ rname.invalid. (
                    0   ; serial            更新序列号
                    1D  ; refresh           更新间隔(从服务器下载数据)
                    1H  ; retry             失败重试
                    1W  ; expire            区域文件的过期时间
                    3H )    ; minimum       缓存的最小生命周期
    NS  @
    A   127.0.0.1
    AAAA    ::1
    PTR localhost.

5.根据需求通过修改配置文件来完成服务的搭建
需求1:www.misshou.io 解析成 192.168.1.2             (需求3已清空需求1和需求2的环境)
1.修改主配置文件 /etc/named.conf ——》监听方式和允许谁来查询
#cp /etc/named.conf  /etc/named.conf.bak
#cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.bak
#vim /etc/named.conf
options {
	listen-on port 53 { 127.0.0.1;any; };     any全网监听
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";
	dump-file 	"/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
	allow-query     { localhost;any; };   any允许所有人查询
	recursion yes;

	dnssec-enable no;          关闭
	dnssec-validation no;      关闭
	dnssec-lookaside auto;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";

	managed-keys-directory "/var/named/dynamic";
};
.......................

2.修改子配置文件 /etc/named.rfc1912.zones定义管理域 ——》定义管理域 misshou.io
www.misshou.io
[root@server 桌面]# cp /etc/named.conf /etc/named.conf.bak
[root@server 桌面]# cp /etc/named.rfc1912.zones /etc/named.rfc1912.zones.bak
[root@server 桌面]# vim /etc/named.rfc1912.zones
在该文件最后面增加以下内容:
 43 zone "misshou.io" IN {
 44         type master;
 45         file "misshou.io.zone";  //文件名没要求,但必须在 /var/name中创建一模一样的名字
 46         allow-update { none; };
 47 };

3./var/named目录里面创建相应的zone文件
/var/named/named.localhost   正向模板
!!!切记不能改变文件属性,会解析报错,因为权限问题。
通过复制来进行, -p :连同档案的属性一起复制过去,而非使用预设属性;
[root@server 桌面]# touch /var/named/misshou.io.zone
[root@server 桌面]# cp -p /var/named/named.localhost /var/named/misshou.io.zone
[root@server 桌面]# ll /var/named/misshou.io.zone
总用量 4
-rw-r----- 1 root named 152 621 2007 named.localhost

#vim /var/named/misshou.io.zone
$TTL 1D
@       IN SOA  misshou.io.  rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       NS      dns1.misshou.io. //代表dns服务器名字 //此处的dns1可以随便指定,abc都行,但是要和后面的A记录保持一致
dns1    A       10.1.1.2           //关键前两行一定是当前DNS服务器的IP地址
www     A       192.168.1.254      //这个是 域名对应的地址,DNS服务器只帮忙解析,与DNS网段无关

4.使用命令检查配置文件的语法
[root@server ~]# named-checkconf /etc/named.conf    //什么都没有代表OK
[root@server ~]# named-checkconf /etc/named.rfc1912.zones    //什么都没有代表OK 
[root@server ~]# cd /var/named  进入该目录检查.zone文件
[root@server named]# ls
data     misshou.io.zone  named.empty      named.loopback
dynamic  named.ca         named.localhost  slaves
[root@server named]# named-checkzone misshou.io.zone misshou.io.zone //区域文件名写两遍
zone misshou.io.zone/IN: loaded serial 0
OK



6.启动服务,开机自启动
[root@server named]# service named start
[root@server named]# chkconfig named on
[root@server named]# netstat -nltup|grep 53   //看端口启了没

7.测试验证
client:10.1.1.3          临时更改:#ifconfig eth0 10.1.1.3/24
www.misshou.io 192.168.1.254
先指定DNS服务器❤
[root@client ~]# echo nameserver 10.1.1.2 > /etc/resolv.conf 
[root@client ~]# cat /etc/resolv.conf 
nameserver 10.1.1.2
 
第一个命令nslookup
[root@client 桌面]# nslookup www.misshou.io
Server:		10.1.1.2
Address:	10.1.1.2#53

Name:	www.misshou.io
Address: 192.168.1.254

 —————————— ——————————
[root@client ~]# which nslookup
/usr/bin/nslookup
[root@client ~]# rpm -qf /usr/bin/nslookup
bind-utils-9.8.2-0.17.rc1.el6_4.6.x86_64
[root@client ~]# nslookup www.misshou.io
Server:     10.1.1.2
Address:    10.1.1.2#53
 
Name:   www.misshou.io
Address: 192.168.1.254
  —————————— ——————————
  
第二个命令dig
[root@client ~]# dig @10.1.1.2 www.misshou.io
 
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> @10.1.1.2 www.misshou.io
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22390
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
 
;; QUESTION SECTION:
;www.misshou.io.            IN  A
 
;; ANSWER SECTION:
www.misshou.io.     86400   IN  A   192.168.1.254
 
;; AUTHORITY SECTION:
misshou.io.     86400   IN  NS  dns1.misshou.io.
 
;; ADDITIONAL SECTION:
dns1.misshou.io.    86400   IN  A   10.1.1.2
 
;; Query time: 1 msec
;; SERVER: 10.1.1.2#53(10.1.1.2)
;; WHEN: Wed Apr 24 18:36:41 2019
;; MSG SIZE  rcvd: 83
 
第三个命令host
[root@client ~]# host www.misshou.io
www.misshou.io has address 192.168.1.254
 
结果:
1.看到以上信息说明正向解析没问题
2.不能反向解析是因为没有配置
3.如果配置文件没有错误,服务也启动了,还是不能解析,那么检查防火墙、selinux和网络

4、DNS分割与view语句

view语句中包含了数个能够控制哪些用户可以看哪些视图的访问列表、一些应用于视图中所有区的选项以及区本身。使得内外部用户可以看到不同的主机数据。
必须有match-clients子句,该子句用于过滤DNS查询的源IP地址。它通常提供了站点DNS数据的内外部视图。

view view-name {
	match-clients { address-match-list };	[any]
	match-destinations { address=match-list };	[any]
	match-recursive-only yes | no;	[no]
	view-option;	...
	zone-statement;		...
};

match-destinations子句查看DNS查询所发送到的目的地址。
match-recursive-only子句要求DNS查询是递归的,可以 recursion yes;
视图是按照顺序处理的,所有把限制最多的视图放在最前面。
如果采用了视图,那么named配置文件中的所有的zone语句就必须出现在view的上下文中。

举例:
由于中国网络目前分为两个区域—南电信北联通,2个网络上的用户,访问互相网络上的主机效率很低,所以现在一般的服务提供商都提供2个网络的相同服务,就如www.abc.com这个网站,为了提高电信和网通2个网络上的客户体验,使用户体验最快速的访问速度。决定为电信和网通分别架设2台服务器,其中一台接入电信专线,一台接入网通专线。但是要让用户透明的访问此网站,不需要让用户进行人工的网站选择。我们可以采用DNS服务器中的view功能,让不同的IP指向在不同网络上的主机。比如,让浏览www.abc.com这个网站上的网通用户浏览架设在网通线路上的主机。

实验环境如下:
解析的主机名称:www.abc.com
DNS服务器ip: 172.25.0.10
电信客户端ip:172.25.0.11 希望其解析到结果为192.168.11.1
网通客户端ip:172.25.0.12 希望其解析到结果为22.21.1.1
其余剩下其他运营商的客户端解析的结果皆为1.1.1.1

配置如下:
1)定义view字段

[root@servera ~]# vim /etc/named.conf 
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };

        /* 
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable 
recursion. 
         - If your recursive DNS server has a public IP address, you MUST enable access 
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification 
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface 
        */
        recursion yes;

        dnssec-enable yes;
		dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
view "dxclient" {
        match-clients { 172.25.0.11; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "dx.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "wtclient" {
        match-clients { 172.25.0.12; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "wt.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "other" {
        match-clients { any;};
         zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "other.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";

};

include "/etc/named.root.key";

2)生成数据文件

[root@servera named]# cp -p named.localhost dx.abc.com.zone
[root@servera named]# cp -p dx.abc.com.zone wt.abc.com.zone
[root@servera named]# cp -p dx.abc.com.zone other.abc.com.zone
[root@servera named]# vim dx.abc.com.zone 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       192.168.11.1
                           
[root@servera named]# vim wt.abc.com.zone
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       22.21.1.1                   
[root@servera named]# vim other.abc.com.zone
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       1.1.1.1

3)重启服务

[root@servera named]# chgrp named abc.com.*
检测语法:
[root@servera named]# named-checkconf
[root@servera named]# named-checkzone  abc.com /var/named/dx.abc.com.zone
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# named-checkzone  abc.com /var/named/wt.abc.com.zone
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# named-checkzone  abc.com /var/named/other.abc.com.zonee
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# service named start
[root@servera named]# chkconfig named on

4)测试

[root@serverb ~]# nslookup
> server 172.25.0.10
Default server: 172.25.0.10
Address: 172.25.0.10#53
> www.abc.com
Server: 172.25.0.10
Address: 172.25.0.10#53

Name: www.abc.com
Address: 192.168.11.1

[root@serverc ~]# nslookup
> server 172.25.0.10
Default server: 172.25.0.10
Address: 172.25.0.10#53
> www.abc.com
Server: 172.25.0.10
Address: 172.25.0.10#53

Name: www.abc.com
Address: 22.21.1.1

可以看到,解析www.abc.com的请求同时交给172.25.0.10这台服务器,然而不同的客户端解析到的结果不一致,这就是dns-view的作用。
如果请求不来自第一个视图规定的区域,那么请求就会向下选取其他视图比对,所以可以看出视图比对是自上而下的,如果请求的区域在上一个视图中,就不会向下一个视图请求,即使你在下一个视图中放入了这个区域。
————————

补充:ACL参数的配置
有些时候,我们可能匹配的IP地址范围比较广,由于matchclients可能需要定义非常多的网段,bind引入acl关键字定义变量替换,以使matchclients中仅出现最少的符号,而网段的增添可以在外部文件中进行。可以通过以下方式去完成:
acl “foosubnet” { 192.168.1/24;192.168.2/24; };

举例:
目前电信的客户端为172.25.0.11和172.25.0.12这两台服务器
目前网通的客户端为172.25.0.13和172.25.0.14这两台服务器
通过acl的方式完成相应配置,就可以通过以下写法来实现。

1)在主配置文件里定义外部文件的读取配置参数
[root@servera named]# vim /etc/named.conf 
# 变更如下参数,其余参数不变
include "/etc/dx.cfg";
include "/etc/wt.cfg";
view "dxclient" {
        match-clients { "dx"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "dx.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "wtclient" {
        match-clients { "wt"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "wt.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};

view "other" {
        match-clients { any;};
         zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "other.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";

};
2)生成外部文件
[root@servera named]# cd /var/named/chroot/
[root@servera chroot]# ls
dev  etc  run  usr  var
[root@servera chroot]# cd etc/
[root@servera etc]# ls
localtime  named.conf        named.rfc1912.zones  pki
named      named.iscdlv.key  named.root.key       rndc.key
[root@servera etc]# pwd
/var/named/chroot/etc
[root@servera etc]# vim dx.cfg
acl "dx" {
        172.25.0.11;
        172.25.0.12;
};

[root@servera etc]# vim wt.cfg
acl "wt" {
        172.25.0.13;
        172.25.0.14;
};
3)重启服务
[root@servera etc]# systemctl restart named-chroot
4)访问测试略

 

5、BIND配置示例

DNS服务:https://blog.csdn.net/qq_39578545/article/details/105016510

(1)localhost区
以下是/etc/named.conf中localhost的配置行

zone "localhost" IN {   
        type master;
        file "localhost";     注意下面会对引号内的文件进行修改配置
        allow-update { none; };
};
//反向模板 IP反过来写
zone "0.0.127.in-addr.arpa" IN {      
        type master;
        file "127.0.0";
        allow-update { none; };
};

以下是正向区文件/var/named/localhost中的配置行

$TTL 30D                             缓存的生命周期
; localhost.
@   IN SOA  @ rname.invalid. (      
                    0   ; serial
                    1D  ; refresh
                    1H  ; retry
                    1W  ; expire
                    3H )    ; minimum
    NS  @
    A   127.0.0.1
    AAAA    ::1
 
@ = zonename = localhost  当前域
IN 互联网
SOA 开始协议
NS dns服务端
A ipv4正向
AAAA ipv6
CNAME 别名
MX 邮件交互记录   5 表示优先级 数字越小越优先

以下是反向区文件/var/named/

$TTL 1D
@   IN SOA  @ localhost. (
                    0   ; serial            更新序列号
                    1D  ; refresh           更新间隔(从服务器下载数据)
                    1H  ; retry             失败重试
                    1W  ; expire            区域文件的过期时间
                    3H )    ; minimum       缓存的最小生命周期
    NS  @
    A   127.0.0.1
    AAAA    ::1
    PTR localhost.

@在这里表示“0.0.127.in-addr.apra”

6、DNS安全问题

P393描述很详细。具体不写了。

 

第十七章 单点登录(略)

用户和系统管理员都想要账户信息神奇般地扩散到整个环境中的所有计算机,这样就可以使用同样的凭证登录任意系统了。这种特性通常称为“单点登录”(Single Sign-On,SSO)。

SSO涉及两个核心的安全概念:身份和认证。

  • 用户身份是对那些需要访问系统或应用程序的个体的抽象表述。它通常包括各种属性,例如用户名、密码、用户ID、电子邮件地址。
  • 认证是一种行为,证明个体是某个身份的合法所有者。

尽管设置SSO的方法不止一种,但是在所有场景中,通常有4个要素是必不可少的。

  • 包含用户身份和认证信息的集中式目录存储。最常见的解决方案是基于轻量目录访问协议(Lightweight Directory Access Protocol,LDAP)的目录服务。
  • 管理目录内用户信息的工具。对于原生的LDAP实现,推荐Apache Directory Studio,可用于导入、添加、修改、删除目录条目。还可以使用Windows原生的MMC单元“Active Directory Users and Computers”来管理用户信息。
  • 用户身份认证机制。虽然可以直接针对LDAP存储进行用户认证,但是使用基于票据的Kerberos认证系统也很常见。在Windows环境中,Active Directory提供了对于用户身份的LDAP访问,在认证方面,采用的是Kerberos的定制版本。
  • 理解集中式身份及认证的C库例程会去查找用户属性。例程(如getpwent)读取平面文件(flat file)(如/etc/passwd和/etc/group),答复有关这些文件内容的查询。

第十八章 电子邮件(略)

SMTP协议 —— 端口号25
简单邮件传输协议(Simple Mail Transport Protocol,SMTP):从客户端发送到邮局服务器。

POP协议 —— 端口号 110
邮局协议(Post Office Protocol):用于电子邮件的接收。常用的是第三版 ,所以简称为POP3。

第十九章 Web服务器

1、HTTP:超文本传输协议

HTTP协议的主要特点可概括如下:

  1. 支持客户/服务器模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http 1.0 和 http 1.1下有何区别?http 2.0的主要变化或优势有哪些?
区别:

  1. HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,;
  2. HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象!

http 2.0的优势:

  1. 采用二进制格式传输数据,而非http1.1文本格式,二进制格式在协议的解析和优化扩展上带来了跟多的优势和可能
  2. 对消息头采用Hpack进行压缩传输,能够节省消息头占用的网络流量,http1.1每次请求,都会携带大量冗余的头信息,浪费了很多宽带资源。
  3. 异步连接多路复用
  4. Server Push,服务器端能够更快的把资源推送到客户端。
  5. 保持与HTTP 1.1语义的向后兼容性也是该版本的一个关键

https和http的区别主要如下:

  1. http是超文本传输协议,信息是明文传输,不提供任何方式的数据加密;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,https协议需要用到ca申请证书。
  2. http和https使用的是完全不同的连接方式,http的连接很简单,是无状态的,用的端口也不一样,前者是80,后者是443。

HTTP状态码是五个不同的类别:
1xx:信息,服务器收到请求,需要请求者继续执行操作
2xx:成功,操作被成功接收并处理
3xx:重定向,需要进一步的操作以完成请求
4xx:客户端错误,请求包含语法错误或无法完成请求。
5xx:服务器错误,服务器在处理请求的过程中发生了错误。

五个类别的响应状态代码的第一个数字是唯一代表。

200 OK 服务器成功处理了请求

300 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 重定向,资源(网页等)被永久转移到其他URL
302 Found
304 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。

400 客户端请求的语法错误,服务器无法理解
403 Forbidden 请求资源禁止访问
404 Not Found 未找到资源,请求的资源(网页等)不存在

500 内部服务器错误,服务器遇到一个错误,使其无法为请求提供服务
502 网关错误。作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求
504 网关超时 (Gateway timeout),是指服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 HTTP版本不对

数据链路层和运输层的差错检测的区别
数据链路层的差错检测的目的是做到"无比特差错"。仅仅使用循环冗余检验CRC差错检测技术。
运输层的差错检测的目的是做到"无传输差错"。即弥补帧丢失、帧重复、帧失序。

GET 客户端的请求指定资源信息,服务器返回指定资源。
HEAD 只请求响应报文中的 HTTP 首部内容。
POST 将客户端的数据提交到服务器端。
PUT 用从客户端向服务器传送的数据取代指定文档的文档内容。
DELETE 请求服务器删除 request-URI 所标识的资源。
MOVE 请求服务器将指定的页面移动至另一个网络地址。

在这里插入图片描述

常见的HTTP头部
头部指定了和请求或响应相关的元数据,比如,是否允许压缩;接受、期望或提供什么类型的数据;中间缓存应该如何处理数据。
在这里插入图片描述

curl:命令行上的HTTP
一个命令行HTTP客户端。
响应的有效载荷是curl自身的一些提示性信息可以通过-o /dev/null和-s选项隐藏,另外我们还加入了-v选项,要求curl显示包括头部在内的详细输出。

$ curl -s -v -o /dev/null http://admin.com

以<和>起始的行分别表示HTTP响应和请求。在请求中,客户端告诉服务器,用户代理是curl。

curl -H选项明确设置头部
curl -O(大写英文字母o)选项可以下载文件。下面例子是将curl的源代码压缩归档文件下载到当前目录。

$ curl -O http://curl.haxx.se/snapshots/curl-7.46.tar.gz

curl用法指南http://www.ruanyifeng.com/blog/2019/09/curl-reference.html

2、负载均衡

在这里插入图片描述

3、Apache httpd

Linux APACHE构建服务器 https://blog.csdn.net/qq_39578545/article/details/105043444

虚拟主机配置
当HTTP请求到达时,httpd通过查询HTTP Host头部和网络端口来决定要选择的虚拟主机。然后将所请求的URL的路径部分与Files、Directory或Location指令进行匹配,以确定如何提供需要的内容。这个映射过程称为请求路由(request routing)。

下面的例子展示了admin网站的HTTP和HTTPS配置。

<VirtualHost *:80>
	ServerName admin.com
	ServerAlias	www.admin.com
	ServerAlias	ulsah.admin.com
	Redirect / https://admin.com/
</VirtualHost>

<VirtualHost *:443>
	ServerName admin.com
	ServerAlias	www.admin.com
	ServerAlias	ulsah.admin.com
	DocumentRoot /var/www/admin.com/
	CustomLog /var/log/apache2/admin_com_access combined
	ErrorLog /var/log/apache2/admin_com_error
	SSLEngine on
	SSLCertificateFile "/etc/ssl/certs/admin.com.crt"
	SSLCertificateKeyFile "/etc/ssl/private/admin.com.key"
	<Directory "/var/www/admin.com">
	  Require all granted
	</Directory>
	<Directory "/var/www/admin.com/photos">
	  Options +Indexes
	</Directory>
	<IfModule mod_rewrite.c>
	  RewriteEngine on
	  RewriteRule ^/(usah|lsah)$ /ulsah
	</IfModule>
	ExtendedStatus On
	<Location /server-status>
	  SetHandler server-status
	  Require ip 10.0.10.10/32
	</Location>
</VirtualHost>
  • 第一个VirtualHost在端口80应答,将 HTTP请求重定向到HTTPS;
  • 对admin.com/photos的请求会接收到该目录中所有文件的索引;
  • 对/usah或/lsah的请求会被重写至/ulsah。

服务器状态(在该配置中可以通过www.admin.com/server-status访问)是一个能够显示有用的运行期性能信息的模块,其中包括守护进程的CPU和内存使用情况统计、请求状态、每秒的平均请求数量等。监控系统可以利用该功能收集Web服务器的相关数据,用于预警、报告、可视化HTTP流量。在这里,只有IP地址10.0.10.10才能访问服务器状态。

HTTP基本认证
https://blog.csdn.net/qq_39578545/article/details/105043444

4、Nginx

https://blog.csdn.net/qq_39578545/article/details/105945481

虚拟主机,通过结合使用listen和server_name指令,

server {
	listen 10.0.10.10:80
	server_name admin.com www.admin.com;
	root /var/www/admin.com/site1;
}
server {
	listen 10.0.10.11:80
	server_name admin.com www.admin.com;
	root /var/www/admin.com/site2;
}

proxy_pass指示Nginx充作代理并将客户的请求中继到另一个下游服务器。
下面的例子使用location配合proxy_pass指令,指示Nginx处理来自Web根目录的大部分请求,但是将对http://www.admin.com/nginx的请求转发到Nginx官网。

server {
	server_name admin.com www.admin.com;
	root /var/www/admin.com;
	location /nginx/ {
		proxy_pass http://nginx.org/;
	}
}

案例:
(1)为Nginx配置TLS
启用TLS并指向证书和私钥文件。
https://www.cnblogs.com/Garnett-Boy/p/11076210.html

server {
	listen 443;
	ssl on;
	ssl_certificate /etc/ssl/certs/admin.com.crt;
	ssl_certificate_key /etc/ssl/private/admin.com.crt;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE...
	ssl_prefer_server_ciphers on;

	server_name admin.com www.admin.com;
	root /var/www/admin.com/site1;
}
注意:一般生成的目录,应该放在nginx/conf/ssl目录
1.创建服务器证书密钥文件 server.key:
openssl genrsa -des3 -out server.key 1024
输入密码,确认密码,自己随便定义,但是要记住,后面会用到。
2.创建服务器证书的申请文件 server.csr
openssl req -new -key server.key -out server.csr
输出内容为:
Enter pass phrase for root.key: ← 输入前面创建的密码 
Country Name (2 letter code) [AU]:CN ← 国家代号,中国输入CN 
State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音 
Locality Name (eg, city) []:BeiJing ← 市的全名,拼音 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名 
Organizational Unit Name (eg, section) []: ← 可以不输入 
Common Name (eg, YOUR name) []: ← 此时不输入 
Email Address []:admin@mycompany.com ← 电子邮箱,可随意填
Please enter the following ‘extra’ attributes 
to be sent with your certificate request 
A challenge password []: ← 可以不输入 
An optional company name []: ← 可以不输入
4.备份一份服务器密钥文件
cp server.key server.key.org
5.去除文件口令
openssl rsa -in server.key.org -out server.key
6.生成证书文件server.crt
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

(2)使用Nginx实现负载均衡

1.在http节点下,添加upstream节点。
upstream admin-servers{ 
      server web1.admin.com:8080 max_fails=2; 
      server web2.admin.com:8080 max_fails=2; 
}

2.将server节点下的location节点中的proxy_pass配置为:http:// + upstream名称,即“
http://admin-servers”.
http {
	server {
		server_name admin.com www.admin.com;
		location / { 
		    proxy_pass http://admin-servers; 
		    health_check interval=30 fails=3 passes=1 uri=/health_check match=admin-health
		}		
	}
	match admin-health {
		status 200;
		header Content-Type = text/html;
		body ~ "Red Leader,Standing By";
	}
}

在这里,admin.com和www.admin.com的流量以循环的方式(默认)分配给web1和web2服务器。该配置还设置了后端服务器健康检查,每隔30s(interval=30)就对/health_check端点上的服务器检查一次,如果连续3次(fails=3)没有通过,Nginx就会标记出该服务器,但只要之后通过了一次检查(passes=1),就将其冲洗年加入轮替行列。

match关键字是Nginx特有的。它指定了在哪种情况下算是通过了健康检查。

upstream上下文加入了另一个条件,将连接尝试失败的最大次数设置为2。也就是说,如果Nginx在两次尝试中均无法连接到服务器,则放弃,并将该服务器从服务器池中移除。这是一种额外的连通性检查,完善了health_check子句。

5、HAProxy

HAproxy是应用最为广泛的开源负载均衡软件。它能够代理HTTP和TCP、支持使用粘滞会话将制定的客户端固定在特定的Web服务器、提供了先进的健康检查功能。

HAProxy的配置通常包含在单个文件/etc/haproxy/haproxy.cfg中。

示例:使HAProxy侦听端口80,并在端口8080上采用循环的方式在Web服务器web1和web2之间分发请求。

global
	daemon
	maxconn 5000
defaults
	mode http
	timeout connect 5000
	timeout client 10000
	timeout server 10000
frontend http-in
	bind *:80
	default_backend webservers
backend webservers
	balance			roundrobin
	server	web1	10.0.0.10:8080
	server	web2	10.0.0.11:8080

客户端发起请求,HAProxy监听到端口80的请求,然后将请求在端口8080上被代理到Web服务器

frontend指定了HAProxy如何接收来自客户端的请求:使用哪些地址和端口、处理什么类型的流量以及其他针对客户端的考量。backend负责配置处理需求的一组服务器。

在单个配置文件中可以出现多对frontend/backend,使得HAProxy能够为多个站点提供服务

(1)健康检查
如果服务器没能通过状态检查(返回的响应代码不是200),HAProxy就将有问题的服务器从服务器池中移除。但是,HAProxy会继续检查该服务器。如果发现又能正常响应,就把它重新放回服务器池。

健康检查的具体内容,例如所使用的请求方法、两次检查之间的间隔、请求路径等,都可以调整。在这个例子中,HAProxy每隔30s就对各个服务器发起GET请求。

backend webservers
	balance roundrobin
	option httpchk GET /
	server web1 10.0.0.10:8080 check inter 30000
	server web2 10.0.0.11:8080 check inter 30000

(2)服务器统计信息
该软件提供了一个方便的Web界面,可以显示出服务器的状态,在页面上根据需要手动启用或禁用这些服务器。

listen stats :8000
	mode http
	stats eman;e
	stats hide-version
	stats realm HAProxy\ Statistics
	stats uri /
	stats auth myuser:mypass
	stats admin if TRUE

可以在特定的侦听器(listener)或backend/frontend块中配置服务器状态,以便将功能显示在该配置中。

(3)粘滞会话
HTTP是一种无状态协议,每个事务都是一次独立的会话。在协议看来,来自同一客户端的多个请求之间并没有什么联系。

大部分Web应用需要使用状态来跟踪用户在一段时期内的行为,如提交支付信息。多数Web应用是用cookie跟踪状态。Web应用为用户生成会话,将会话ID放入cookie,然后再把cookie放入响应头部中传给用户。每次客户端向服务器发出请求时都会带上这个cookie,服务器用它来恢复客户端的上下文。

理想情况下,Web应用应该将其状态信息保存在持久性的共享存储中(如数据库)。但是,有些实现比较差劲的Web应用会选择在本地保存会话数据,要么是在服务器内存中,要么是在本地磁盘。如果这种应用置于负载均衡器之后,这些应用就要出问题了,因为取决于负载均衡器多变的调度算法,某个客户端的请求可能会被路由到多个不同的服务器。

为了解决这个问题,HAProxy将自己的cookie插入到响应中,这种特性叫作粘滞会话。同一客户端随后发出的请求都会包含这个cookie。HAProxya利用它将请求路由到相同的服务器。

backend webservers
	balance roundrobin
	option httpchk GET /
	cookie SERVERNAME insert httponly secure
	server web1 10.0.0.10:8080 cookie web1 check inter 30000
	server web2 10.0.0.11:8080 cookie web2 check inter 30000

在该配置中,HAProxy维护了一个名为SERVERNAME的cookie,用以跟踪正在和客户端打交道的服务器。secure关键字指定其只能通过TLS连接发送,httponly告知浏览器只在HTTP上使用该cookie。

(4)TLS终止
https://www.cnblogs.com/zhanmeiliang/p/6232245.html

一种常见配置是在HAproxy服务器处终止TLS连接,然后使用普通的HTTP与后端服务器通信。这种方法从后端服务器上卸下了加密操作的开销,减少了需要私钥的系统数量。

对于特别注重安全性的站点,也可以在HAProxy到后端服务器上这一段使用HTTPS。可以使用相同的TLS证书或其他证书。

无论哪种方式,你仍然需要在代理处终止并重新发起TLS。

由于HAProxy终止了来自客户端的TLS连接,因此需要将相关配置添加到frontend配置快。

frontend https-in
	bind *:443 ssl crt /etc/ssl/private/admin.com.pem
	default_backend webservers

Apache和Nginx要求将私钥和证书各自保存为PEM格式的文件,但HAProxy要求两者存在于同一文件中。下列命令可以很方便地把单独的文件组合成一个复合文件。

# cat /etc/ssl{private/admin.com.key,certs/admin.com.crt} > /etc/ssl/private/admin.com.pem
# chmod 400 /etc/ssl/private/admin.com.pem
# ls -l /etc/ssl/private/admin.com.pem

请确保密钥文件的所有权与HAProxy运行时的用户身份相匹配。

Logo

更多推荐