1. 程式人生 > >dhcp、tftp及pxe簡介

dhcp、tftp及pxe簡介

DHCP:

全稱:Dynamic Host Configuration Protocol  動態主機配置協議

DHCP配置內容:

IP/Netmask

Gateway

DNS Server

 

bootp: boot protocol --> dhcp  動態指派IP,永久有效

租約:即使用期限,DHCP伺服器為客戶端分配IP後,客戶端使用IP地址是有期限的

2hours:假如租約期限為2小時

50%: 1hours --> 2hours        過了一個小時之後就要續租

50%1hours --> 2hours   續租後又過了一個小時,就再續租,如果不用的時候,地址會自動被釋放

75%: 0.5hours --> 2hours

87.5%: 0.25hours --> 2hours

dhcp discover   如果租約快要到期一直無法續租就要提前廣播尋找DHCP伺服器

RARP:(Reverse Address Resolution Protocol),是一種網路協議網際網路工程任務組(IETF)在RFC903中描述了RARP。RARP使用與ARP相同的報頭結構,作用與ARP相反。                            RARP用於將

MAC地址轉換為IP地址。其因為較限於IP地址的運用以及其他的一些缺點,因此漸為更新的BOOTPDHCP所取代。

RARP工作原理  

  1. 傳送主機發送一個本地的RARP廣播,在此廣播包中,宣告自己的MAC地址並且請求任何收到此請求的RARP伺服器分配一個IP地址;
  2. 本地網段上的RARP伺服器收到此請求後,檢查其RARP列表,查詢該MAC地址對應的IP地址;
  3. 如果存在,RARP伺服器就給源主機發送一個響應資料包並將此IP地址提供給對方主機使用;
  4. 如果不存在,RARP伺服器對此不做任何的響應;
  5. 源主機收到從RARP伺服器的響應資訊,就利用得到的IP地址進行通訊;如果一直沒有收到RARP伺服器的響應資訊,表示初始化失敗。

DHCP的工作流程:

比如客戶端剛開機,那麼客戶端關機的時候地址是被釋放的了。所以客戶端開機後要重新做地址獲取。地址獲取是通過RARP協議獲取的,所以客戶端廣播請求DHCP服務為其分配一個IP地址。分以一下4個步驟,都是以廣播的方式進行的

1Client: dhcp discover客戶端傳送廣播尋找DHCP伺服器

2Server: dhcp offer(IP/netmask, gw)  DHCP伺服器端收到廣播報文後會做出響應,提供與客戶端MAC匹配的IP/network,gw

3Clientdhcp request  客戶端選擇DHCP伺服器提供的IP後,要發出一個廣播說採用了哪個IP。假如採用了DHCP伺服器1的提供的IP,那麼這臺伺服器就要在地址池中刪除這次被採用的地                                                 址。而沒有被採用的IP,DHCP伺服器會回收過來 

                                             (有兩種情況:1:多臺DHCP伺服器同時響應客戶端的廣播請求為客戶端提供IP,2:客戶端MAC相匹配的IP已經被佔用)

4Server: dhcp ack DHCP  被選定地址的伺服器確認

 

續租:是以單播的方式

Client: dhcp request   客戶端直接給DHCP伺服器傳送請求採用續租的地址

Server: dhcp ack        伺服器端響應,

       Server: dhcp nak       DHCP伺服器拒絕續租,如果DHCP伺服器拒絕續租,有可能DHCP伺服器上的地址範圍被修改了,客戶端請求續租的地址不在此範圍內

 

假如公司的網路做了兩個區域,一個區域是財務,另一個區域是技術部門,彼此之間使用路由器連結。在財務部門的網路區域中提供了一臺DHCP伺服器,所以財務部門獲取IP地址是沒有問題。但技術部門如何獲取IP地址?由於路由器是廣播報文的屏障,所以財務部門這邊的DHCP伺服器是無法收到技術部門的客戶端傳送的廣播。那麼如何才能讓DHCP伺服器為技術部門的客戶端分配地址呢?由於DHCP協議是可以被中繼的,但是需要路由器開啟中繼功能,即路由器在右側網路介面上安裝一個提供DHCP服務的程式,這裡成為A,監聽在某個介面上接收技術部門客戶端的請求並分配地址。所以技術部門的客戶端廣播的時候是路由器的A是可以接收到廣播報文的。但路由器是沒有DHCP功能的,所以路由器在收到報文後會定向單播給財務部門的DHCP伺服器,DHCP伺服器收到路由器的報文後,會定向把響應報文定向單播給路由器,路由器接收響應報文後再有A把此報文廣播給技術部門的客戶端。技術部門的客戶端接收到IP地址後會再廣播一個request,路由器接會把這個廣播報文封裝後再次單播給DHCO伺服器。DHCP伺服器接收到報文後再次單播給路由器,路由器A再次廣播給技術部門的客戶端。

問題:

1、DHCP伺服器本身有地址,同時DHCP伺服器自己的地址是不能動態分配的。

2、DHCP伺服器應該跟財務部門一體。首先先滿足財務部門客戶端的需求,才能提供其他網路提供DHCP服務。

為每一個網路提供地址服務的功能稱為作用域。所謂作用域就是能夠為哪些網路提供地址池列表,從而能夠完成地址分配。首先保證本地作用域,才能為其他網路提供。

 

Linux DHCP協議的實現程式:dhcp, dnsmasq

dnsmasq既可以配置成DNS轉發器又可以作為DHCP server使用

# yum info dnsmasq

 

Dnsmasq is lightweight, easy to configure DNS forwarder and DHCP server.
: It is designed to provide DNS and, optionally, DHCP, to a small network.
: It can serve the names of local machines which are not in the global
: DNS. The DHCP server integrates with the DNS server and allows machines
: with DHCP-allocated addresses to appear in the DNS with names configured
: either in each host or in a central configuration file. Dnsmasq supports
: static and dynamic DHCP leases and BOOTP for network booting of diskless
: machines.

 

 

Linux也可以充當DHCP中繼器

# yum install dhcp     //提供了兩個守護程序,dhcp伺服器和dhcp中繼器,且二者取其一

 

/etc/dhcp/dhcpd.conf      //配置檔案
/etc/dhcp/dhcpd6.conf
/etc/dhcp/scripts
/etc/dhcp/scripts/README.scripts
/etc/openldap/schema/dhcp.schema
/etc/sysconfig/dhcpd
/usr/bin/omshell
/usr/lib/systemd/system/dhcpd.service 
/usr/lib/systemd/system/dhcpd6.service
/usr/lib/systemd/system/dhcrelay.service
/usr/sbin/dhcpd      -->   /etc/rc.d/init.d/dhcpd(centos6)   //啟動程序
/usr/sbin/dhcrelay  -->   /etc/rc.d/init.d/dhcrelay     //中繼器不需要配置檔案

 

如何配置使用DHCP

# cat /etc/dhcp/dhcpd.conf   //是一個空檔案

#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example   //這裡有一個模板
# see dhcpd.conf(5) man page
#

# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf    //把模板copy過來用

# vim /etc/dhcp/dhcpd.conf

在dhcpd.conf配置檔案中:如果定義了多個option,那麼範圍最小的option優先順序最高

subnet {   //每一個subnet用來定義一個子網,在windows中叫作用域,所以地址池就是在子網中定義的,每一個地址再分配是,額外的屬性如閘道器、DNS伺服器等都

    ...    //通過option指定,而option既可以放在subnet之外也可以放在subnet之內,如果option放在subnet之外,則全域性有效,對每一個subnet都有效。

}

host {     //固定分配給某一個主機的保留地址,有些主機來請求IP地址,都期望使用固定地址,這個地址不在地址池中,而是額外保留給某個主機使用

    ...

}

share-network {  //超級作用域,把多個對應的地址網段在同一個池中進行同一分配

#option指明除了地址和掩碼以外分配的其他屬性,既可以定義在全域性位置,也可以定義在subnet中

option domain-name "example.org";   //搜尋域,比如在主機上#ping www,這時候是不通的,如果在此處定義了搜尋域,他會在www後面自動補全的
option domain-name-servers ns1.example.org, ns2.example.org;   //域名伺服器,如果是域名,則需要先把域名轉換成IP地址,再分配給客戶端,因為客戶端本來就沒有域名伺服器指向,沒辦法解析

#全域性配置選項

default-lease-time 600; //預設租約期限,單位是秒鐘,比如改為1天86400,後面必須是分號結尾

max-lease-time 7200; //最大租約期限

log-facility local7;  //日誌

 

subnet 10.152.187.0 netmask 255.255.255.0 {  //先滿足本子網,在服務其他網段。這裡是為10.152.187.0分配IP地址,注意:這裡的這裡定義的網路一定是配置檔案的當前主機所在的網路

range  10.152.187.120 10.152.187.130; //指明起始地址和結束地址,叫地址池,這裡一共定義了10個地址

}

 

對本機的dhcpd.conf進行修改

option domain-name "dongshi.com";
option domain-name-servers 8.8.8.8;

default-lease-time 86400;
max-lease-time 86400;

log-facility local7;

  subnet 192.168.184.0 netmask 255.255.255.0 {
     range 192.168.184.130 192.168.184.160;
  }

 

:.,$s/^[^#]/#/g     //然後把後面的不以#開頭的內容加上#號

# systemctl start dhcpd   //  啟動

監聽在udp的67號埠

在另外一個主機上進行測試

# dhclient -d  //用另一個主機以工作於前臺的方式動態獲取地址,dhclient程序只能啟動一次

此時繫結的192.168.184.130是可以登入的,監聽在68號埠上

如何知道DHCP伺服器把地址分配給哪個主機?

# cat /var/lib/dhcpd/dhcpd.leases   //記錄了DHCP的租約位置

# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.2.5

server-duid "\000\001\000\001#\260\371l\000\014)\316\370\004";

lease 192.168.184.130 {             //130地址被分配到MAC地址是最下面一行的主機
  starts 6 2018/12/22 13:41:57;     //租約的起始時間
  ends 0 2018/12/23 13:41:57;       //租約的到期時間
  cltt 6 2018/12/22 13:41:57;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:0c:29:67:09:fe;    //被分到IP地址的主機的MAC地址
}
lease 192.168.184.145 {
  starts 6 2018/12/22 13:47:32;
  ends 0 2018/12/23 13:47:32;
  cltt 6 2018/12/22 13:47:32;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:0c:29:cf:00:6b;
}

 在node2上檢視繫結的地址

在node3上檢視繫結的地址

如何分配閘道器呢?

# vim dhcpd.conf   //編輯配置檔案指定閘道器

option domain-name "dongshi.com";
option domain-name-servers 8.8.8.8;
option routers 192.168.184.141;        //新增此行,放在這裡是全域性使用,如果有subnet的話,也可以把option放在指定的subnet中,一般routers都是定義在subnet中

# systemctl restart dhcpd

再在node2上檢視閘道器,依然沒有,因為dhclient功能有限,所以在設定node2網路採用內部閘道器通道,自定義下的VMnet2

 

 

其它配置選項:

filename: 指明引導檔名稱;

next-server:提供引導檔案的伺服器IP地址;

 

filename "pxelinux.0";

next-server 172.16.100.67;

 

PXEpreboot execute environment, Intel

dhcp, tftp, file server(yum repository)

 

CentOS 6 PXE:

yum -y install syslinux tftp-server

 

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

cp /media/cdrom/images/pxelinux/{vmlinuz,initrd.img} /var/lib/tftp/boot/

cp /media/cdrom/isolinux/{boot.cfg,vesamenu.c32,splash.png} /var/lib/tftp/boot/

mkdir /var/lib/tftpboot/pxelinux.cfg/

cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default/

 

 

CentOS 7 PXE:

yum -y install syslinux tftp-server

 

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

cp /media/cdrom/images/pxelinux/{vmlinuz,initrd.img} /var/lib/tftp/boot/

cp /usr/share/syslinux/{chain.c32,mboot.c32,menu.c32,memdisk} /var/lib/tftpboot/

mkdir /var/lib/tftpboot/pxelinux.cfg/

 

建立/var/lib/tftpboot/pxelinux.cfg/default

內容類似如下:

 

default menu.c32

prompt 5

timeout 30

MENU TITLE CentOS 7 PXE Menu

 

LABEL linux

MENU LABEL Install CentOS 7 x86_64

KERNEL vmlinuz

APPEND initrd=initrd.img inst.repo=http://172.16.100.67/centos7 ks=http://172.16.100.67/centos7.cfg

 

Ansible

 

運維工作:系統安裝(物理機、虛擬機器)--> 程式包安裝、配置、服務啟動 --> 批量操作 --> 程式釋出  --> 監控

 

OS Provisioning

物理機:PXECobbler

虛擬機器:Image Templates

Configration:

puppet (ruby)

saltstack (python)

chef

cfengine

Command and Control:

fabric

 

預釋出驗正:

新版本的程式碼先發布到伺服器(跟線上環境配置完全相同,只是未接入到排程器);

 

程式釋出:

不能影響使用者體驗;

系統不能停機;

不能導致系統故障或造成系統完全不可用;

 

灰度釋出:

釋出路徑:

/webapp/tuangou-1.1

/web/app/tuangou

/webapp/tuangou-1.2

 

在排程器上下線一批主機(maintanance) --> 關閉服務 --> 部署新版本的應用程式 --> 啟動服務 --> 在排程器上啟用這一批伺服器;

 

自動化灰度釋出:指令碼、釋出平臺;

 

運維工具的分類:

agent: puppet, func

agentless: ansible, fabric

ssh

 

ansible:

模組化,呼叫特定的模組,完成特定的任務;

基於Python語言實現,由ParamikoPyYAMLJinja2三個關鍵模組;

部署簡單,agentless

主從模式

支援自定義模組

支援Playbook

 

冪等性:

 

配置檔案:

/etc/ansible/ansible.cfg

/etc/ansible/hosts

 

http://172.16.0.1/centos7.cfg

 

回顧:pxe, ansible

 

pxe:

網絡卡支援網路引導;

dhcp, filename, next-server

tftp-server

pxelinux.0

vmlinuz, initrd.img

menu.c32

pxelinux.cfg/default

 

system-config-kickstart

ksvalidator

 

ansible:

os provision:

物理機:pxe, cobbler

虛擬機器:image file template

configuration:

程式包管理、使用者管理、配置檔案、服務管理、cron任務等等;

puppet, saltstack, chef, cfengine

task exec

command and control

func, fabric

 

程式釋出:灰度模型

 

agent

agentless:

ssh服務;

 

ansible

 

ansible <host-pattern> [-f forks] [-m module_name] [-a args]

args:

key=value

 

注意:command模組要執行命令無須為key=value格式,而是直接給出要執行的命令即可;

 

常用模組:

command

-a 'COMMAND'

user

-a 'name= state={present|absent} system= uid='

 

group

-a 'name= gid= state= system='

 

cron

-a 'name= minute= hour= day= month= weekday= job= user= state='

 

copy

-a 'dest= src= mode= owner= group='

 

file

-a 'path= mode= owner= group= state={directory|link|present|absent} src='

 

ping

沒有引數

 

yum

-a 'name= state={present|latest|absent}'

 

service

-a 'name= state={started|stopped|restarted} enabled='

 

shell

-a 'COMMAND'

 

script

-a '/path/to/script'

 

setup

 

playbook的核心元素:

tasks: 任務

variables: 變數

templates: 模板

handlers: 處理器

roles: 角色

 

變數:

facts

--extra-vars "name=value name=value"

role定義

Inventory中的變數:

主機變數

hostname name=value name=value

組變數

[groupname:vars]

name=value

name=value

 

Inventory的高階用法:

 

Playbook

 

- host:

vars:

remote_user:

tasks:

-

-

-

variables:

-

-

-

handlers:

-

-

 

- host:

 

- host:

 

"ansible_distribution_major_version": "7",

 

nginx.conf

worker_processes {{ ansible_processor_cores * ansible_processor_count - 1 }};

 

實戰:用ansible playbook完成配置keepalived的叢集;

部落格:ansible的用法;