第二部分(连网)描述了UNIX系统上所使用的协议和用于设置、扩展、维护网络及面向Internet的服务器的技术。另外还介绍了上层网络软件,包括域名系统、电子邮件、单点登录和Web托管。
OSI七层模型结构
OSI七层模型的各层功能
分组与封装:
数据以分组的形式在网络上传输,链路层限制了数据的最大长度。每个分组都是由头部(header)和载荷(playload)组成。头部指明了分组从哪里来,要去往何处。另外还包括校验和、协议特定的信息或其他处理说明。载荷就是要传输的数据。
原始数据单元的名称依赖于具体的协议层。
在链路层,它叫作帧(frame);
在网络层,它叫作分组(packet);
在传输层,它叫作段(segment);
链路层分为两部分:
最大传输单元(MTU):1500字节
地址类型
IPv4地址分类,第一个字节范围
私有地址:
TCP/IP四层模型
TCP/IP模型包含以下4个层次:网络接口层、网络层、传输层、应用层
TCP包头内容
三次握手和四次挥手
概念:指在发送数据的准备阶段,服务器和客户端之间需要三次交互
第一次握手:建立连接时,客户端向服务器发送一个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有三种类型:
SNAT:
内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
DNAT:
当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT
——————
路由选择
路由表
静态路由设置
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欺骗:通过欺骗局域网内访问者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
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。
连网参数位于/proc/sys/net/ipv4和/proc/sys/net/ipv6目录下。
参数设置
$ sudo sh -c "echo 1 > icmp_echo_ignore_broadcasts"
$ sysctl net.ipv4.icmp_echo_ignore_broadcasts=1
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 命令的作用就等同于 “>” 命令
ping、traceroute、tcpdump、wireshark。
当在协议栈中上下排查时,问自己一些像下面这样的问题。
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
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表
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网络
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)
集线器:负责在物理层连接以太网网段,现如今是用交换机。
自动协商
路由协议
OSPF:https://blog.csdn.net/qq_39578545/article/details/105397270
BGP协议:https://blog.csdn.net/qq_39578545/article/details/105424896
BGP:边界网关协议。BGP是一种外部路由协议,用于管理自治系统之间的流量。
路由协议的多播地址
描述 | IPv6 | IPv4 |
---|---|---|
该子网中的所有系统 | ff02::1 | 224.0.0.1 |
该子网中的所有路由器 | ff02::2 | 224.0.0.2 |
未分配 | ff02::3 | 224.0.0.3 |
DVMRP路由器 | ff02::4 | 224.0.0.4 |
OSPF路由器 | ff02::5 | 224.0.0.5 |
OSPF DR路由器 | ff02::6 | 224.0.0.6 |
RIP路由器 | ff02::9 | 224.0.0.9 |
EIGRP路由器 | ff02::10 | 224.0.0.10 |
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最常见的用法是确定特定名称返回的记录。
从根服务器开始手动跟随授权链,以此验证是否存在问题。
示例:处理域名 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主机的另一个名称。如果查询的是一台递归式名称的服务器,它会代替你跟随整个授权链。但是在调试时,检查授权链的每个环节通常更优帮助,
区数据库是由系统管理员在该区的主名称服务器上维护的一组文本文件。这些文本文件通常叫作区文件(zone file)。区文件中包含了两种条目:解释器命令(例如,$ORIGIN
和$TTL
)和资源记录。只有资源记录才是数据库真正的组成部分,解析器命令只不过是提供了输入记录的一些便捷手段。
区文件中的解释器指令
用户可以在区文件中嵌入指令,提高其可读性和可维护性。
有3个指令($ORIGIN
、INCLUDE
、$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字段) |
cs.colorado.edu
,那么名称 anchor
可以被解释为anchor.cs.colorado.edu
。如果漏掉了结尾的点号,把名称错写为anchor.cs.colorado.edu
,该名称会被视为相对名,结果就是anchor.cs.colorado.edu.cs.colorado.edu
。这是一种常见的错误。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
DNS的域名解析 是 udp/53,主从之间的数据传输默认使用tcp/53
DNS软件: Bind是一款开放源码的DNS服务器软件,支持各种Unix和Windows平台
BIND包含4个主要的组成部分:
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 6月 21 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和网络
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)访问测试略
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”
P393描述很详细。具体不写了。
用户和系统管理员都想要账户信息神奇般地扩散到整个环境中的所有计算机,这样就可以使用同样的凭证登录任意系统了。这种特性通常称为“单点登录”(Single Sign-On,SSO)。
SSO涉及两个核心的安全概念:身份和认证。
尽管设置SSO的方法不止一种,但是在所有场景中,通常有4个要素是必不可少的。
SMTP协议 —— 端口号25
简单邮件传输协议(Simple Mail Transport Protocol,SMTP):从客户端发送到邮局服务器。
POP协议 —— 端口号 110
邮局协议(Post Office Protocol):用于电子邮件的接收。常用的是第三版 ,所以简称为POP3。
HTTP协议的主要特点可概括如下:
http 1.0 和 http 1.1下有何区别?http 2.0的主要变化或优势有哪些?
区别:
http 2.0的优势:
https和http的区别主要如下:
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
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>
服务器状态(在该配置中可以通过www.admin.com/server-status访问)是一个能够显示有用的运行期性能信息的模块,其中包括守护进程的CPU和内存使用情况统计、请求状态、每秒的平均请求数量等。监控系统可以利用该功能收集Web服务器的相关数据,用于预警、报告、可视化HTTP流量。在这里,只有IP地址10.0.10.10才能访问服务器状态。
HTTP基本认证
https://blog.csdn.net/qq_39578545/article/details/105043444
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子句。
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运行时的用户身份相匹配。