欢迎各位兄弟 发布技术文章
这里的技术是共享的
DNS: 域名解析服务,是一个基础服务,是众多其它服务的一个基础性的工具,也是现代互联网的基础
DNS服务的本身的核心,DNS服务的标准都是基于一个软件来构建的,基于BIND
BIND (Berkeley Internet(Information) Name domain) ( Berkeley 伯克利(美国加利福尼亚州西部城市))
互联网上几乎所有的dns服务器都是用bind来构建的,尽管又出现了许多其它的dns服务器,比如powerdns,ng,或者windows上的dns服务器等等,它们或多或少提出的构建标准或使用语法,都跟bind 非常接近,它们的工作机制是完全一样的
最关键的是搞清楚dns是怎么样的一种结构,如何进行工作的,接下来很多其它服务学习起来会轻松很多
SSL/TLS:http--->https协议, OpenSSL,CA,Digital Certificate (数字证书),PKI,对称加密,单向加密,公钥加密
HTTP服务器:HTTP协议,Apache,LAMP,Nginx(Engine X),LNMP(LEMP linux+Engine X+Mysql+Php),MySQL,PHP,varnish
重点中的重点,重点中的重点,重点中的重点,
我们将来有一半以上的任务都是去管理web服务器的
Apache(最简单的配置,机主机?虚拟主机,ssl)
LAMP(linux + apache + mysql + php)
varnish:缓存,是实现缓存httpd ftp等尤其是httpd协议对象(web对象)一种非常重要的轻量级的高性能的缓存服务器,
CDN: 内容分发网络(内容分发服务)(content delivery network),就是DNS(基于 view 的 智能dns,分地区来搜集客户端来源,看客户端ip地地址是属于哪个省哪个网的)+varnish来构建的
(无论多少人taobao,baidu速度非常快,实际上并不是一台服务器给我们服务的,而且是分布式的,也不是一个集群,而是分布式的多个集群分别进行工作的,全中很可能划分五个地域,比如华东,华中,华北等,来自于不同的客户端,它们访问的是离自己最近的同网的那台服务器)
(缓存通常只能缓存静态内容,所以构建过程很复杂)
File Server: 文件服务器, NFS,SMB/CIFS,FTP
Netfilter:网络过滤器,iptables,(如何将linux通过添加规则的方式实现网络安全,构建属于自己的防火墙) iptables是用来生成防火墙规则)(互联网上绝大多数防火墙都是类似于这种形式来实现的)(TCP/IP协议是在一个操作系统的内核中实现的,因此数据包的过滤也在内核中来实现,Netfilter就是内核中的一个框架,能够让我们生成过滤数据包的框架,)(iptables或者说Netfilter能实现许多功能,比如(filter nat mangle raw ))(可以根据时间来控制大家访问网络的法则,控制某种协议等很多功能) 另一个安全工具 (tcp wrapper) 第四层的一个简单的工具,很简单,很好用,在iptables规则不是特别熟练的情况下使用,但它的功能远不如iptables强大
NSSwitch:网络服务转换,主要是为了实现名称解析的,或者叫网络服务转换,都行,它是定义一个软件在实现名称解析的时候到什么地方来实现查找用户的名称的,,,就是有个数据库,库中有它的名称和数字,格式的名称对应关系,名称解析就是到这个数据库中去找名称对应关系的,NSSwitch 就提供了这样一种框架 NSSwitch本身并不提供任何有意义的服务(有点像淘宝),它也不实现真正的解析,它只是提供了一个真正的平台,可以让我们借助于它来完成名称解析,所以我们说它要借助于很多的库,比如(nibnss,nibfiles,nibldap 这才是真正的淘宝上的店主) 而我们的各种工具,各种客户端工具像login,这种就类似于淘宝上的消费者,,还有PAM (可插入式认证模块)(pluggaram)
有时叫框架framework ,有时叫平台platform
SMTP/POP3/IMAP4,邮件服务器 Mail Server,是一个非常复杂的服务器,它所涉及到的组件非常的多,从一个完整意义上的邮件服务器来讲,它比我们的http服务器可能更为麻烦,但是邮件服务器是一个非常重要的基础性的服务,互联网上的有效流量当中,早期80-90%是邮件产生的80-90%中的80-90%是垃圾邮件,所以邮件服务器是一个基础性的服务,而且,占据了巨多的网络带宽,对我们来讲,很多地方都要用到邮件服务,虽然即时通信很便捷,但是邮件仍然是不可替代的,甚至在企业内部的很多交流都是通过邮件来完成异步协作的,马哥讲的会是完全意义上的具有类似于smtp server , pop3 server , mf server 以及能够实现安全的邮件通信这么一种框架,并能还能提供web mail,通过web页面像访问163 126的邮箱 搜狐的,雅虎的邮箱一样,能基于 web 的应用使用它, (SSL协议对smtp来讲,用处不大,但是对于pop3来讲,用到很大的)(因为smtp要结合gpg来实现)
SELinux: Securitry Enhanced (安全的加强的linux),( Enhanced 增强的,提高的,放大的 提高 )系统的安全程度是有评级的,
从 A B B1 B2 C C1 C2 C3 D 有四个级别,D级别是最低级别,A级是安全级别最高的,军方使用的,一般来讲,肯定至少要A级别的,或者B1级,
linux 的和 windows server 一般是C2级别的
linux 比 windows 运行方式要稳定
linux 运行个3-5年,只要机器不坏,我们是不需要重启的,它可以像刚开机一样运行,只要你的服务器支持长时间在线,但 windows绝对不行,一般来进,至少要(最长最长)要一周重启一次服务器
所以服务器领域,要么是linux,要么是unix,指的是machine critical ( critical 关键性的,严重的,极重要的 )的场景,或者是比较关键性业务的场景,对于IDC的机房来说,是无所谓的,因为都是些小站长,网站3,5分钟不在线,无所谓,所以没事就重启了,所以IDC机房的很多服务器是windows的,这就是windwos服务器市场占有率仍然那么高的原因,不关键的小型的不怎么靠谱的IDC机房带来了这么大的市场占有率
C2-->SELinux-->B1,所以这样子可以让linux运行起来更加安全,但是SELinux要工作于内核当中,而且其配置过程非常复杂,
马哥不打算讲SElinux的安全规则的开发,因为没有意义,没有必要,但是可能会用到SElinux,尤其是别人定制好的SElinux框架,
SELinux是什么,SELinux框架是怎么工作的,如何使用现有的SElinux来控制某个服务能够工作在安全框架下,
MySQL,关系型数据库的基本理论,mysql的基本框架,关系型数据库里面所具有的一些基本概念:表,索引,视图,用户,权限,备份,恢复等,MySQL要花4-5天的时间去讲,这是重点,因为Web服务器管理员的重要工作是管理数据,其实服务器坏了也没关系,只要数据不丢失,mysql就是让我们存放数据的重要的服务器,所以管理mysql框架下的数据,对我们而言,是至关重要的,数据能够被高效访问,也很关键,我们如何去构建索引,如何去设计一个良好的方案(scheme 方案 ? schemer 计划者? ),能够让它尽可能的适应我们的工作场景,这也是很关键的.
mysql讲完之后,就讲集群了,到时候,彼此间怎么工作,
上面搞定了之后,后面的高级的东西,什么集群啊,所谓什么变形处理,像hadoop,变形处理平台,虚拟化,云计算等,理解起来很轻松
今天主要讲的是DNS和BIND
DNS: Domain Name Service (域名服务) ,也有人叫 Domain Name Server (域名服务器)
域名:www.magedu.com (主机名, FQDN (Full Qualified Domain Name)完全合格域名,完全限定域名 )(Qualified 有资格的,限定的,合格的)这不是域名,这是主机名, 域是一个范围,不可能指的是某一个特定对象的,
www.magedu.com肯定是一个主机,不然的话是没法进行访问,跟它进行联系的,
一般来讲,要想交流,要想通信,在某一时刻,应该是一对一,我们才能来回进行交流,所以主机间的通信一般来讲是这样子的,它们必须要一对一的进行通信, 既然能用www.magedu.com能访问它,说明这是一个主机,不是一个范围,
什么是域名,magedu.com才算是域名,com也是一个域名,因为在com中也含magedu这样一个域,同样com也可以包含一个其它名字的域,(比如 baidu,163等等,)magedu.com 也是一个域,因为在这个域内,有许多主机,有的主机用 www,有的主机用 ftp , mail,正是这些主机揉合起来,(综合起来),构成了一个范围,叫做是一个域,
DNS:(名称解析 Name Resolving),也叫名称转换,因为转换过程背后涉及到查询的过程,所以叫解析.(查询过程依赖的是数据库)(这里不是指mysql,mysql只是一种数据库管理软件)(文本文档也可以算是数据库啊,只不过数据不规则而已,只不过文本文档不是一个容易实现格式化里面相关内容的数据库)
FQDN<-->IP (FQDN到IP地址的转换)这种转换是双向的(但是有些服务是单向的),双向是由完全两种不同的机制来实现的
有个数据库,比如数据有
172.16.0.1 www.magedu.com
172.16.0.2 mail.magedu.com
当我们去访问www.magedu.com 的时候,我们找一下数据库,最终对应的 172.16.0.1 IP地址就找到了,这个过程就叫做名称解析的过程,
要想实现名称解析,不仅仅有DNS,
用户名: root <--> 1 用户名与 uid的关系算名称解析, 根据字符中找数字,或根据数字找字符串,都称作名称解析
端口: sshd <-->22 端口与服务的对应关系,也算名称解析
要完成名称解析的机制有很多,为了能够有统一的框架,就出现了nsswitch
nsswitch:就是为实现多种需要实现名称解析的机制,提供名称解析的平台的,它仅仅提供平台,并不负责实际意义上的名称解析,
[root@localhost ~]# cat /etc/passwd
这也算一个数据库,这个其实相当规范了,每一行有7个字段组成,
每个字段标识有特殊的意义
主机名转换为IP地址的手法有很多,主要就是三种
libnss_files.so的机制
libnss_dns.so的机制
niss的机制
/etc/nsswitch.conf
中有一行
hosts: files dns
files: 就是靠 libnss_files 去找 /etc/hosts 文件,通过这个文件来完成主机名称到IP地址的对应关系
dns: 就是指 dns 服务了,
当我们去访问主机名的时候,主机名没法建立真正的联系,这时它会调用一个库文件,完成从主机名到IP地址的转换
这个完成机制在本机上叫做 stub resolver (最基本的,最根初的,最原始的解析器)名称解析器,是个软件,是个程序
这个名称解析器通过某个库的调用来完成首先去找 /etc/nsswitch.conf 指定的 hosts: files dns 的配置,,根据次序,先去找/etc/hosts
从这里面看有没有我们访问的域名(主机名) 有没有对应的ip地址,如果有,解的成功
ping www.magedu.com 这是一个主机名没法进行联系,所以我们要转换成ip地址,此时ping命令借助于本地的stub resolver来完成命令的解析(stub resolver第一步是根据/etc/nsswitch.conf files 指定的 hosts: files dns 的配置 找 /etc/hosts 里面 有没有 www.magedu.com 对应的ip地址,如果没有就去找dns来解析了 )
为什么要用到 /etc/hosts 文件呢? 在互联网诞生之初的时候,互联网还不叫互联网,互联网是美国军方的一个项目,当时的通信靠的是电话网络,电话的通信是靠一个始终在线的连接线路来实现的,他们期望设计这样一个网络,从源到目的地有很多线路可以走,其中某一部分线路坏了,它会自动的找另外一条线路过去,而且通信过程本身不是一直处于在线状态的数据报文,而是分组报文来实现的,数据包是一个一个的发送的,炸断以后,没有发送出去的数据包会基于其它协议重新基于其它项目再发送一次,它能够自动找可用线路,(这就是所谓的路由,),(它的可靠程度,数据包发送出去之后,到底有没有发送到对方,我们期望对方给我们返回一个确认码的,如果没有确认码,我们重新再发送一次,)
(这种设计机制,就是保证我们的通信线路在某个地方遭到破坏后,仍然可以继续通信下去,而且没有传送到目的地的数据报文可以重新传送一次,这样一种网络)(这样一种网络,叫数据交换网络)(或者说叫按报文交换网络)(它就不叫电话交换网络了) ( 这是互联网诞生的一个最主要的原因,)(它是一个军方的项目),早期叫 dark net,那个时候,刚接入网络中的主机很少,而且还没有pc机出现,那时最早接入的只有4台主机,美国几个大学的计算机接入网络,只有几个计算机,单独标识一下就可以了,那时候的ip地址可能已经出现了(用几个ip地址来标识就OK了),但是后来加入计算机的研究机构越来越多,军方的机构越来越多,识别某台机器的时候比较困难,人易记的是字符串,而不是数字,记10个ip地址很吃力,记几十个域名很容易,(当时固然有ip地址能够实现在各主机之间进行通信,但是用户不便于记这些ip地址,因此出现了给主机命名的机制,给每一个主机都起个名字) 但是主机本身无法通过名字进行通信,主机通信要么靠ip地址,要么靠端口,(ip最终转换成mac地址来进行通信的,)(主机名人易记,但计算机识别不了,)(真正通信的时候,人只需要输入主机名,背后的转换过程由主机自己来实现,)(因为早期主机很少,因此就通过一个hosts文件来实现)
每一台主机上都维护有一个hosts文件,windows有,linux有,unix也有
hosts文件中,记录了每一个主机的ip地址和名称的对应关系
hosts:
ip地址 主机名 别名
IPADDR FQDN Aliases
172.16.0.1 www.magedu.com www
A -->D (D是新加入的主机) (D主机通过各种宣传手段,我们加入到网络了,我们有一个名称,你来访问吧,这就叫推广)
IANA 知道 D 的主机名与IP的对应关系,但是A不知道
A 只需要更新hosts文件,到IANA 服务器上,下载hosts文件并覆盖本地的,那么D的记录就有了,这样A访问D的时候,查找本地的hosts文件就完成名称解析了,但后来由于互联网上无数个主机,无数个网络,当IANA更新时,世界上每个客户机都要更新自己的hosts文件
1,早期 周期性任务,比如每1个小时(每半个小时)去 IANA上下载hosts文件覆盖本地(但是半小时之内,可能有错误,有时,IANA已更新,但是我们没有下载,)
2,为了避免每次更新,IANA就建一个 Server ,以后每个客户机不需要更新自己的hosts文件了,不需要从hosts文件中查找,当需要访问主机名的时候,只需要向Server提交请求,我来帮你解析,因为Server是实时更新的,所以向Server请求的结果都是最新的,这种方式大大简化了客户端的复杂程度,将复杂度移向到了服务器端,移向了IANA,在一定程度内,在一定的时间之内,Server 有效的实现了这种功能,从而避免了客户端频繁的周期性任务的更新.但是随着互联网规模的增长,一个Server不堪重负了,集群,加Server(哪怕一百个Server),
假如放了1KW个条目,每一次有客户端查询的时候,都要从这1kw中查一次,速度可能比较慢(这是可能,马哥假设是这样的,事实上1kw个,现代计算机依然非常的快),但是管理起来就很不快了,管理起来极为不便,因为我们的所有管理工作,(假如客户端经常换主机名,INAN会很忙,)
3,分布式数据库,为了解决很忙的问题,IANA设置了全新的结构,将名称组织成所谓的分布式结构,把DNS从一个集中式的数据库转换成一个分布式数据库,可以授权子级,子级层次当然过多了也不行,
IANA
早期 ftp: hosts文件,(就像在线文档,随时是最新的)
访问的时候,直接查找hosts文件,按照主机名www.magedu.com 查找 (查找标准)到 ip地址,
hosts里面有上百条,问题不大,在小规模的网络中,hosts文件的确有效工作了很长一段时间,能够完成名称解析,但是后来网络发展速度越来越快,加到网络里面的主机越来越多,如果每个主机都随便起名字的话,彼此之间通信很困难,因此出现了名称地址管理机构 IANA : (互联网地址名称分配机构(分配属) 最后一个A 是angent(机构属))(这是一个每国正负机构背景的一个组织机构),但是由于有政府背景,后来人们发现 DNS已经成为互联网一种资源,而且是一种基础性互联网资源,因此不应该为每国正负所维护,而且大家不放心,(我们国内使用通信的时候,都使用主机名通信,意味着所有东西都被每国 正夫 或 均方 控制,所以后来把这种机构,把这种名称分配的功能,转交给另外一个民间组织叫ICANN)
ICANN 目前来讲,名称分配,地址分配,靠 ICANN 来实现的,ICANN是用来管理最顶级的名称(最顶级的域)(它现在有很多子级,各地驻地,机构,比如北美,亚太,非洲都有一个机构)
某一个组织想加入到网络里面来,它得有一个地址才能和别人通信,它得向IANA申请一个IP地址,再申请一个域名 FQDN,
因此 IANA 就负责维护 IP 和 主机名 FQDN之间的对应关系了,
因此 IANA 就维护了一个数据库,这个数据库里面建立了有互联网中每一台主机的IP和主机名的对应关系
www.magedu.com. 最后一个点表示全局,平时的时候,我们省略了,事实上它就是我们的根查找的最上级结构,就是根域, 根域下面的一级就是顶级域
层次关系是自顶向下的,下级不知道上级,
下级要知道上级的话,要本地维护一个数据库,
下级要知道上上级的话,还是要本地维护一个数据库,
如果都是要本地维护数据库的话,DNS就没有作用了
每个人都知道根在什么地方,我们只需要保存一个数据库,只要保存根的数据就可以了
自顶向下,只管儿子,不管孙子
顶级域是根域的下一层,早期顶级域只有7个 .com .cn .edu 等等
顶级域 (TLD : top level domain)
TLD: 主要是三类
组织域: .com .org .net .cc (ICANN或它下放给某个组织管理的)
国家域: .cn (授权给中国的域名管理机构管理) .jp .hk .tw .iq(伊拉克) .ir(伊郎)
反向域: IP-->FQDN (借助于其它机制,指针机制) (但正向与反向不是同一个数据库)
反向: IP-->FQDN
正向: FQDN -->IP
递归: 根非常忙 ,再说为了安全而言,根是不跟任何人递归的
我们的互联网上 不是递归的
迭代
我们的互联网上是通过迭代来查找网上的域名的
对于ns来说是迭代的,对dns服务器来说是迭代的
对于st1是递归的,对客户端来讲是递归的
缓存中的结果(ns ( name server )中的缓存的结果)不是最权威的,只有 magedu的结果才是最权威的
magedu把结果给别人的时候,有个 ttl 值,就是缓存时间
假如 ttl 是 60秒,那就是 60秒后重新发起请求
DNS 既处理 内部查询外部主机,又处理外部查询内部主机,还有内部查询内部的
DNS就是通过这种分布式机制,将查询的需求转驿层层的划分给一个更小的机构,使得每一个片上的管理,只需要有一个独立的服务器就可以了
一个服务器可以管理多个域的解析
ns (name server ) dns server
上海片片长兼任浙江片片长兼任福建片片长
一个IP-->多个 FQDN:
一个FQDN-->多个IP
www.magedu.com. DNS的高级机制,虽然有两个ip,但是只指定给你一个,是轮流返回的
IP1
IP2
两个是两个不同的主机,负载均衡,这是一种高级功能
当然负载均衡的效果比较差,讲到集群的时候再说
查询:
递归:查询只发生一次请求
迭代:查询可能发出多次请求
解析:
正向:FQDN-->IP
反向:IP-->FQDN
两段式 : 递归,迭代 前半段递归,后半段迭代
DNS: 分布式数据库
上级仅知道与其直接相连的下级,但是下级不知道上级 (想知道上级,得自己配置) 但是一般不会配置
每个下级只知道根的位置: (事实上不知道,想知道还得配置) 但是一般会配置
DNS服务器:
接受本地客户端的查询请求(递归)
外部客户端的请求,请求权威答案的
肯定答案: TTL
否定答案: TTL
外部客户端请求,非权威答案
否定答案也是有缓存的哦 ttl 的哦
st1 没找自己的dns 找了 kernel的dns
外部客户端就是请求了非权威答案
给递归的 都算内部
所以一般情况下 不要分成外部客户端和内部客户端
而应该分成 递归客户端和非递归客户端(迭代客户端)
为了让自己的服务器不要太忙,只给自己允许的客户端递归,(自己内部的或兄弟公司)
stub resolver 发起请求方,一般都是要求递归的
到我dns服务器这儿请求权威答案,我返回给你,(我不需要找其它人了)这就是递归的,其它的就让它迭代
互联网上的根 com 等等全都是迭代的,不允许给任何人递归,它们不负责查询任何主机,所以不允许给任何人递归,这是为了安全
# vim /etc/resolv.conf
填 nameserver
不能指向.com的主机地址,因为.com的主机永远不递归,而这里是要求一定允许给你递归的服务器
因为我这里主机是stub resolver,发出请求后 对方一定要给我答案的
我们通过adsl上网之后,运营商给我们提供dns服务器,这个服务器一定要给自己内部的客户端递归的,
我们的dns 服务器都指向它了,它不给我们递归,我们就上不了网