0%

ansible简介:

ansible is Simple IT Automation。

ansible是一个简单的自动化运维工具,能够轻松实现配置、命令管理等常见运维工作。另外,它是一种Python语言开发的agentless工具,通过ssh服务连接被管理端,不需要在被管理端额外安装监管程序。这也意味着ansible主机的安全至关重要。

阅读全文 »

DHCP服务及相关介绍:

DHCP服务实现将主机的网络参数进行动态分配,实现同一地址重复使用。

  • bootp:boot protocol(早期用在无盘工作站),在主机开机时分配IP地址信息,以便连接网络存储;主机开机后会一直拥有此地址。
  • dhcp:可理解为引入了“租约”的bootp。当某主机关机或主动释放地址后,可将此地址分配给其他主机使用。实现同一地址的反复使用。也可实现为特定主机保留固定地址。
  • arp:address resolving protocol,实现局域网内将IP解析为MAC。
  • rarp:reverse adress resolving protocol,实现局域网内将MAC解析为IP。

DHCP请求流程:

整个过程都是基于广播进行的。

  1. DHCP discover:客户端发送广播请求dhcp服务;
  2. DHCP offer:DHCP服务器响应客户端,并发送分配给此客户端的网络参数,包括IP、MASK、GW等。(当局域网有多台DHCP服务器时,客户端会使用最先收到的offer,收到offer广播的其他DHCP服务器将不再广播offer)
  3. DHCP request:客户端发送请求广播。
  4. DHCP ack:DHCP服务器发送确认信息。

DHCP续租流程:

整个过程都是基于单播/广播进行的。

  • 当客户端发现租约期限到50%时,向DHCP服务器发送续租请求。

  • 客户端得不到DHCP服务器响应,在租约期限到75%时,再次向DHCP服务器发送续租请求。

  • 客户端仍然得到不到DHCP服务器响应,在租约期限到87.5时,继续向DHCP服务器发送续租请求。

  • 客户端还是得不到DHCP服务器响应,广播请求(DHCP请求流程),寻找新的DHCP服务器。

  • 当客户端发现租约期限到50%时,向DHCP服务器发送续租请求。

  • DHCP服务器拒绝(DHCP nak),直接广播请求(DHCP请求流程),寻找新的DHCP服务器。

CentOS上DHCP安装配置:

CentOS上有两个软件包可以提供DHCP服务:

  • dhcp包:(ISC,named)
    dhcpd:dhcp服务
    dhcrelay:dhcp中继服务

  • dnsmasq包:同时提供dhcp和dns服务,轻量级软件,仅适用于少量客户机的。

监听端口:

  • Server端:67/udp
  • Client端:68/udp #仅在网卡在dhcp获取地址时自动启动并以守护进程运行。
安装与使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@dhcp ~]# yum -y install dhcp
[root@dhcp ~]# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
#配置文件:/etc/dhcp/dhcpd.conf(注意以”;”结尾)
option domain-name "DOMAIN-NAME"; #指定域
option domain-name-servers IP,[IP],[IP]; #指定全局DNS(linux系统最多配置3个dns,windows最多2个)
option routers IP; #全局指定网关
default-lease-time 43200; #租期
max-lease-time 86400; #最长租期
filename “filename” ; #指明引导文件名称
next-server IP|FQDN;
subnet NET netmask MASK { #定义子网,可定义多个
range 开始IP 结束IP; #地址范围
option #仅本子网有效的选项
}
host HOST_ID { #定义mac绑定,可定义多个,建议使用主机名作为HOST_ID
hardware ethernet MAC;
fixed-address IP; #这里的绑定IP不要出现在subnet内
}
group {
filename "FILENAME"; #指明引导文件名称
next-server IP|FQDN; #指明引导文件所在的服务器主机IP
host HOST_ID1 {hardware ethernet MAC1;}
host HOST_ID2 {hardware ethernet MAC2;}
...
}

客户端使用:
dhclient -d #请求dhcp服务并在前端显示

查看已分配的地址:
/var/lib/dhcpd/dhcpd.leases

tftp server

监听在69/udp
安装:yum -y install tftp-server

以守护进程启动方式:
CentOS6:
chkconfig tftp on
service xinetd restart

CentOS7:
systemctl start tftp.socket
默认共享文件根目录:/var/lib/tftpboot/

PXE服务器配置

preboot excution environment,Intel主导开发
dhcp + tftp + http|ftp + kickstart来实现。

工作流程:

Client –> dhcp Server(获取网络参数、tftp文件服务器地址和网络引导文件目录)
Client –> tftp文件服务器(获取网络引导文件,一般为pxelinux.0),此处的pxelinux.0等同于grub引导程序
Client –>tftp文件服务器获取Kernel、initrd以及kickstart文件,内核启动
Client –> 安装程序(boot.msg,第一进程)启动。根据kickstart定义使用固定IP或再次向dhcp Server发送请求,获取网络参数。(前一次是引导程序获取的,在内核接管所有工作时就无效了;本次是内核获取,用以访问网络上的repo源)
Client –> 安装程序根据kickstart文件中的定义,进行自动化安装

CentOS6配置过程:

dhcp服务器

在正常工作的dhcp服务的基础上添加:

1
2
filename ”pxelinux.0”;
next-server tftp服务IP;
tftp服务器

安装syslinux软件以提供pxelinux.0等文件:

1
2
3
4
5
6
7
8
9
10
11
12
yum -y install syslinux
cp /media/cdrom/image/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/ #复制光盘内vmlinuz和initrd.img(务必于欲安装的系统版本一致):
cp /media/cdrom/isolinux/{boot.msg,vesamenu.c32,splash.png} /var/lib/tftpboot #复制安装框架
mkdir /var/lib/tftpboot/pxelinux.cfg/
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default #创建安装控制文件
vim /var/lib/tftpboot/pxelinux.cfg/default #修改控制文件自定义菜单
timeout 600 #默认菜单超时时间为60秒,建议修改
label linux
menu label ^Auto Install CentOS system
menu default
kernel vmlinuz
append initrd=initrd.img ks=http://192.168.31.42/ks.cfg #指明kickstart文件所在位置,可以是http、ftp
制作ks.cfg文件
1
2
3
4
5
6
yum -y install system-config-kickstart
system-config-kickstart运行程序并自行配置(需要图形化界面),完成后保存在/root/ks.cfg
注意:Basic Configuration --> Perform installation in interactive mode表示交互式安装,自动化安装不要勾选。
Installation Method -- Installation source选择http,填入
HTTP Server:192.168.31.42
HTTP Directory:/cdrom
构建repo源以及ks.cfg文件(这里用httpd来提供)
1
2
3
ln -sv /media/cdrom /var/www/html/cdrom
cp /root/ks.cfg /var/www/html/
service httpd start

CentOS 7配置过程:

与CentOS6配置过程一致,但需要注意在创建/var/lib/tftpboot/pxelinux.cfg/default文件是,需要指定为
menu default

自动安装小技巧:

上面的安装方法有一个最最让人苦恼的地方:不管是谁,只要在开机时使用了PXE启动,就会被自动化安装上新系统!太不安全了。

PXE实现为特定主机安装系统:

原理:仅为特定mac地址的设备指定filename,next-server。
将filename和next-server条目放入group{}内,而不是放到subnet或全局。

1
2
3
4
5
group {
filename "pxelinux.0";
next-server 192.168.31.42;
host test { hardware ethernet 00:0c:29:b0:a8:13; } #可以有多个
}

此时,不再列表中的主机,即使PXE启动,也不会获取到网络引导文件,自然不会被误伤了。

相关概念介绍:

http是应用层协议,依赖于传输层tcp协议进行传输。
互联网数字分配机构(IANA,The Internet Assigned Numbers Authority)规定了不同应用的端口使用范围:
0-1023:永久分配给固定应用使用,特权端口,只有管理员能够启动应用进行监听;
1024-41951: 注册端口,分配给某应用使用。
41952+: 客户端程序随机使用的端口,称之为动态端口或私有端口。其范围定义在/proc/sys/net/ipv4/ip_local_port_range文件中

BSD Socket:


BSD Socket是IPC(Inter-Process Communication,进程间通信)的一种实现,允许位于不同主机(或同一台主机)上的进程之间进行通信。

按照Socket API分类:(Socket API:封装了内核中socket通信相关的系统调用)

SOCK_STREAM:流式套接字,tcp套接字
SOCK_DGRAM:数据包式套接字,udp套接字
SOCK_RAW:原始套接字(实现于系统核心,除了处理普通的网络报文之外,还可以处理一些特殊协议报文以及操作IP层以及其以上的数据。)其有以下特征:
⇒ 可以处理ICMP、IGMP等网络报报文
端口对SOCK_RAW而言没有任何意义
⇒ 设置IP_HDRINCL选项后,SOCK_RAW可以操作IP头数据,以完成数据传输。接收报文也一样,内核不识别的IP报文会传递给SOCK_RAWW

根据Socket Domain分类:(Socket Domain:套接字所使用的格式)

AF_INET:Address Family,监听在IPv4地址上
AF_INET6:监听在IPv6地址上
AF_UNIX:用于同一主机上不同进程基于socket套接字通讯(如mysql就是通过这种方式,效率比前两者高),这样的socket叫做Unix_SOCK,其监听在”localhost”或”127.0.0.1”地址上。

TCP FSM:TCP有限状态机

TCP Finite State Machine,TCP有限状态机,3次握手 –已建立连接–> 4次断开的详细过程

TCP协议特征:

  • 面向连接的、可靠的传输层协议;
  • TCP协议建立在不可靠的网络层IP协议上,IP不能提供任何可靠机制,TCP的可靠性完全由自己实现;
  • 端到端的通信;
  • 全双工方式传输;(两条虚连接线路)

TCP采用的最基本的可靠性技术:

  • 将数据打包成段,计算校验和(CRC32)
  • 确认与超时重传
  • 排序,将完整数据包打包成段写入逻辑序号,以便恢复
  • 流量控制(即头部滑动窗口大小,window)
  • 拥塞控制,慢启动和拥塞避免算法

HTTP协议介绍:

http全称为hyper text transfer protocol,是一种应用层协议,默认80/tcp。
html:hyper text mark language,超文本标记语言

1
2
3
4
5
6
7
8
9
<html>
<head>
<title>
</title>
</head>
<body>
<a href="http://....">...</a>
</body>
</html>

css:Cascading Style Sheet,层叠样式表,能够控制html的输出样式
js:JavaScript,客户端脚本,通过客户端浏览器进行解析运行,可以实现动态功能

http协议版本:

http/0.9
http/1.0:引入了cache,MIME,method
MIME:Multipurpose Internet Mail Extesion,是一种邮件协议,引入到http协议后使http能够传输非文本数据
method:数据传输的请求方法(如提交表单用到的post方法,获取资源使用的get方法,其他还有head、put、delete、trace、options等)
http/1.1:增强了缓存功能
http/2.0:

http工作模式:

C/S架构,Server/Client
Client端发送http request(http请求报文)
Server端发送http response(http响应报文)
一次http request与http response的过程叫做一次http事务。

web resource(web 资源)分类:

静态资源
无需服务端做额外处理,如:.jpg .png .gif .html .txt .js .css .mp3 .avi等等

动态资源
服务端需要通过执行程序进行处理,发送给客户端程序的执行结果,如:.php .jsp等等

注意!一个页面中展示的资源一般有多个,而默认情况下,每一个资源的获取都需要单独请求,需要单独建立连接、断开连接,这也是为什么需要keepalived的原因。

保持连接(长连接):keepalived
保持客户端与服务器之间的连接,不是每个资源都进行tcp的三次握手四次断开。

非保持连接(短连接):
每个资源的都需要tcp的三次握手四次断开的步骤。(注意四次断开第3步服务器回应客户端断开请求后,不会立即请求与客户端断开,而是等待一段时间,而如果这段时间客户端再次请求了与服务端连接,则会继续使用此虚连接)

URL,资源标识符

Uniform Resource Locator,用于描述服务器某资源的位置
格式:Scheme://Server_IP[:Port][/PATH]
基本语法
<scheme>://<user>:<password>@<host>:<port>/<path><params>?<query>#<frag>
<params>:参数值传递。如:http://www.grub2.com/bbs/hello;gender=f
?<query>:查询语句使用到的变量值传递。如:http://www.grub2.com/bbs/search?username=tom&title=abc
#<frag>:传递本页锚定标识

类型
相对URL,一般在本地站点资源 的引用时使用,避免由于站点域名改变等而导致资源无法访问;
绝对URL,一般在其他站点资源的引用时使用。

HTTP协议特征 :

stateless:无状态追踪
在未设置”KeepAlive On”时,由于每个资源都需要经过tcp的”三次握手四次断开”,所以服务器无法持续追踪访问者来源,即不能判断不同请求是否由同一客户端发出。即使设置了”KeepAlive On”之后,由于”KeepAliveTimeout 15”的设置,服务器也不可能花费太多时间与一个客户端保持持久连接,而连接一旦断开,依旧无法分辨客户端是谁。而假如是需要登录才能访问的资源,这种情况将反复提示用户输入账号信息。

使用cookie识别客户端:
为了使服务器识别不同的客户端,服务端会在客户端留下一些记录信息,后续访问时,客户端将cookie信息发给服务端,服务器便能够识别了。

另外cookie还有胖cookie与瘦cookie的分别,胖cookie记录了用户的浏览记录等大量信息,而瘦cookie仅记录客户端标识信息,配合客户端的session来 保存用户信息。

服务端session:
关联至客户端cookie。动态网站用于保存客户端状态信息的。

HTTP事务:

http协议的一次请求与响应的过程。理解http事务及http报文语法格式,以便对报文进行分析后,进行不同的操作。
http request报文格式

1
2
3
4
<method><request-URL><version>
<headers> ...
空行
<entity-body>

常见method

1
2
3
4
5
6
7
8
#method   #请求方法,标明客户端希望服务器端对资源的执行动作
GET #从服务器获取一个资源;这时<entity-body>部分通常为空
HEAD #请求只从服务器获取资源响应首部,而不需要服务器端发送<entity-body>
POST #向服务器发送要处理的数据,而这些数据都是存放在<entity-body>中的
PUT #将请求的主体部分直接存储在服务器上,而不是交给服务器处理,数据在<entity-body>中。这时客户端应该对服务器有存取权限才行。
DELETE #请求删除服务器上的指定资源
TRACE #追踪请求报文到达服务器过程中经过的代理服务器
OPTIONS #请求服务器返回对指定资源支持使用的请求方法

可以使用telnet命令来模拟http request请求:

1
2
3
4
telnet IP Port
method /URL Version
Host:IP/FQDN
回车

http response报文格式

1
2
3
4
<version><status code><reason-phrase>
<headers> ...
空行
<entity-body>

version格式:
HTTP/<major>.<minor> #如:HTTP/1.1

status code:以三位数字标记请求过程状态码
1xx:
100-101:信息提示
2xx:
200-206:成功
3xx:
300-305:资源重定向
4xx:
400-415:客户端错误
5xx:
500-505:服务端错误


#常见状态码
200 #成功(OK)。请求数据已通过响应报文的entity-body发出。
301 #永久重定向(Moved Permanently)。请求的URL指定资源已被删除;但会通过响应报文的首部指明Location的值,以标明资源现在所处的新位置。
302 #临时重定向。与301类似,但通过响应报文首部指明的Location的值指明的是资源的临时新位置。
304 #客户端发出条件式请求请求获取资源是否发生过修改,而服务器上的资源未发生改变的响应。
401 #需要认证(Unauthorized)。资源存在,需要客户端提供认证信息。
403 #请求被禁止(Forbidden)。权限不足
404 #资源找不到(Not Found)。
500 #服务器内部错误(Internal Server Error)。
502 #代理服务器从后端服务器收到了一条伪响应(Bad Gateway)。

reason-phrase:状态码所标记状态的简短描述

如:200 –> OK 404 –> NOT FOUND

headers:

每个请求/响应报文可包含0或多个headers。每个headers都有名称,后跟冒号 可选空格 值。(多个值空格隔开)

常见首部:

#通用首部
#可以用在请求/相应报文首部
Date #报文创建时间
Connection #连接状态,如keep-alive、close
Via #报文经过的中间节点
Cache-Control #控制缓存
Pragma #与http1.0兼容的控制缓存相关

#请求首部
#仅可以用在请求报文首部
Accept #可接收媒体类型
Accept-Charset #可接收编码格式
Accept-Encoding #可接收编码格式,如gzip
Accept-Language #可接收的语言
Client-IP #客户端IP
Host #请求的服务器名称和端口号
Referer #当前请求资源的上级资源,常用来分析网站入口来源
User-Agent #客户端代理,即浏览器类型,可通过此条显示不同网页给客户端

#条件式请求首部   #
  Expect   #期望发送的信息
  If-Modified-Since   #指定时间至今,请求的资源是否发生过修改。
  If-Unmodified-Since   #
  If-None-Match   #本地缓存中存储的资源Etag标签是否不匹配服务器中的资源Etag标签。
  If-Match   #

#安全请求首部   #
  Authorization   #向服务器发送认证信息,如账号密码
  Cookie   #客户端向服务器发送cookie
  Cookie2   #

#代理请求首部   #
  Proxy-Authorization   #向代理服务器认证

#响应首部
#信息类 #
Age #相应持续时长
Server #服务程序名称及版本

#协商首部 #
当某资源有多种表示方法时使用
Accept-Ranges #服务器可接收的请求类型范围
Vary #服务器查看的其他首部列表

#安全响应首部 #
Set-Cookie #向客户端设置cookie
Set-Cookie2 #
WWW-Authenticate #服务端对客户端的质询认证表单

#实体首部
#描述<entity-body>部分
Allow #列出对此资源可使用的请求方法
Location #回应客户端真正的实体位置
Content-Encoding #资源编码格式
Content-Language #
Content-Length #
Content-Location #资源真正的实体位置,与Location一样
Content-Type #返回格式为 major/minor

#缓存相关 #
Etag #资源扩展标签
Expires #资源过期时间
Last-Modified #最后修改时间

#扩展首部

entity-body:

真正的数据部分,可能为空。如请求方法为GAT时,通常都为空。