本節所講內容:
•DHCP服務器工作原理
•使用DHCP為局域網中的機器分配IP地址
•使用DHCP為服務器分配固定IP地址
•ntpdate加計划任務同步服務器時間
--------------------------------------------------------
擴展:查看默認的服務監聽端口
cat /etc/services #所有服務默認端口都保存在這個文件中
cat /etc/services | grep ssh
route -n #查看路由表信息
[root@xiaogan120 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.31.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.171.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
0.0.0.0 192.168.31.1 0.0.0.0 UG 0 0 0 eth1
--------------------------------------------------------
DHCP Server (推薦使用Windows)
一些小的服務 windows做的比linux好
DHCP服務概述:
名稱:DHCP (Dynamic Host Configuration Protocol --動態主機配置協議)
功能:是一個局域網協議,動態的給局域網內的客戶端分派IP地址
它有兩個用途--->
1. 給內部網絡或網絡服務供應商自動分配IP地址,主機名,DNS服務器,域名
2. 配合其他服務使用,實現集成化管理功能. 如:無人值守安裝服務器
特點:C/S模式
自動分配IP地址,方便管理
DHCP不會同時租借相同的IP地址給兩台主機(避免IP沖突)
DHCP管理員可以約束特定的計算機使用特定的IP地址(規定分配的IP池)
可以為每個DHCP作用域設置很多選項(綁定IP地址)
客戶機在不同子網間移動時,不需要重新設置IP地址.每次都自動獲取IP地址就可以了.
缺點:
當網絡中存在多台DHCP服務器時,一個DHCP服務器,不知道其他服務器租借出去的IP地址(可能造成IP沖突);
DHCP服務器不能跨服務器與客戶機通信,除非路由器允許BOOTP協議轉發.
DHCP 服務端口:默認監聽 67 68端口
vim /etc/services
運行原理:(經常問到,面試)(下面是我自己的理解描述)
DHCP Client ---> DHCP客戶端
DHCP Server ---> DHCP服務器
請求分配IP過程:
1. DHCP Client --discover--> DHCP Server
在DHCP Client啟動后,會發送一個discover包的廣播,用來尋找DHCP Server.
2. DHCP Server --offer--> DHCP Client
DHCP Server當收到discover包后,會對DHCP Client 發送一個offer包,告訴DHCP Client,已經收到他的請求,offer包中含有(一個在尚未使用的IP地址和其他信息).
3. DHCP Client --request--> DHCP Server
DHCP Client在收到DHCP Server的應答包后,會再次發送一個request包的廣播,這個request包中含有第一個發來信息的DHCP Server為發來的信息.意思是告知所有DHCP Server,他已經使用某個DHCP Server分配的IP信息.
4. DHCP Server --ack--> DHCP Client
DHCP Server收到DHCP Client發送的request包后,會為DHCP Client發送一個確認收到的信息,告知其可以使用這個IP地址.而其他的DHCP Server會收回為其分配的IP地址信息.
DHCP Client重新登錄網絡:
1. DHCP Client --request--> DHCP Server
當DHCP Client重新登錄網絡后,會對上次的DHCP Server服務器發送request請求原來使用過的IP地址.
2. DHCP Server --ack--> DHCP Client
DHCP Server判斷這個地址尚未被分配以后,會對DHCP Client發送一個確認信息,確認其可以繼續使用這個地址.
若DHCP Server判斷這個地址已被其他Client使用時,會回復其不能使用這個地址,這是DHCP Client會再次發送discovery廣播,獲取IP地址.
請求IP續期過程:
1. DHCP Client --request--> DHCP Server
DHCP Client獲取的IP信息,都有一個租約.
當DHCP Client的IP地址還有一半時間就要過期時,會再次對DHCP Server服務器發送續期請求renew.
2. DHCP Server --ack--> DHCP Client
DHCP Server收到續期請求后,確認可以繼續讓其使用后,會回復應答包,重新為DHCP Client續期.
--------------------------------------------------
安裝DHCP
[root@xiaogan120 ~]# rpm -qa | grep dhcp
dhcp-common-4.1.1-51.P1.el6.centos.x86_64
[root@xiaogan120 ~]# rpm -qa | grep dhc
dhclient-4.1.1-51.P1.el6.centos.x86_64
dhcp-common-4.1.1-51.P1.el6.centos.x86_64
[root@xiaogan120 ~]# ls /mnt/Packages/dhc*
/mnt/Packages/dhclient-4.1.1-51.P1.el6.centos.x86_64.rpm
/mnt/Packages/dhcp-4.1.1-51.P1.el6.centos.x86_64.rpm
/mnt/Packages/dhcp-common-4.1.1-51.P1.el6.centos.x86_64.rpm
軟件包:
/mnt/Packages/dhclient-4.1.1-51.P1.el6.centos.x86_64.rpm
/mnt/Packages/dhcp-4.1.1-51.P1.el6.centos.x86_64.rpm
/mnt/Packages/dhcp-common-4.1.1-51.P1.el6.centos.x86_64.rpm
安裝方法:
Way 1:
rpm -ivh /mnt/Packages/dhcp*
Way 2:
yum -y install dhcp
查看生成文件:
rpm -ql dhcp
主要配置文件路徑:
/etc/dhcp/dhcpd.conf
配置文件:
1. 主配置文件: /etc/dhcp/dhcpd.conf
2. DHCP 主程序包安裝好后會自動生成主配置文件的范本文件
/usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample
安裝好dhcp服務后,dhcp的配置文件默認是空的,需要我們按照.sample模版文件來修改進行配置
注意:1. .sample 模版樣例文件
2. 尚未配置的DHCP服務,是啟動不了的!啟動時,會失敗!!!
#啟動失敗的原因是dhcp服務器配置的IP地址和默認配置文件里定義的地址段不相同。
#在啟動DHCP服務之前,需要給DHCP Server配置一個靜態的IP地址
配置網卡IP地址命令:
Usage: ifconfig <EthernetName> <IPADDR>[/<prefixlen>]
例如:ifconfig eth2 192.168.1.1/24
DHCP服務,添加開機自啟動:
chkconfig dhcpd on #添加開機自啟動
chkconfig --list dhcpd #檢查
主配置文件參數說明:
可以看出整個配置文件分成全局和局部兩個部分。但是並不容易看出哪些屬於參數,哪些屬於聲明和選項。
注釋信息 以#開頭
配置信息 每行以;結束,大括號所在行除外
--- /usr/share/doc/dhcp/dhcpd.conf ---
# 定義全局配置,通用於所有支持的網絡選項.
option domain-name "example.org"; #定義客戶端所屬域
option domain-name-servers ns1.example.org, ns2.example.org;#為客戶端指定DHS服務器地址,有多個dns服務器時,使用,間隔
default-lease-time 600; #定義默認租約時長
當租約時長過去50%時:發送續約請求。(續不上繼續用)
當租約時長過去87.5%:再次發送續約請求。(續不上找別人)
DHCP工作站除了在開機的時候發出 DHCPrequest 請求之外,在租約期限一半的時候也會發出 DHCPrequest ,如果此時得不到 DHCP服務器的確認的話,工作站還可以繼續使用該IP;當租約期過了87.5%時,如果客戶機仍然無法與當初的DHCP服務器聯系上,它將與其它 DHCP服務器通信。如果網絡上再沒有任何DHCP協議服務器在運行時,該客戶機必須停止使用該IP地址,並從發送一個Dhcpdiscover數據包開始,再一次重復整個過程。要是您想退租,可以隨時送出 DHCPRELEASE 命令解約,就算您的租約在前一秒鍾才獲得的。
max-lease-time 7200; #定義最大時長(當客戶端沒有想DHCP Server續約成功時,客戶機可以使用這個IP的最大時間)
作用:定義客戶端IP租約時間的最大值,當客戶端超過租約時間,卻尚未更新IP 時,最長可以使用該IP 的時間;
比如,機器在開機獲得IP地址后,然后關機了。這時,當時間過了default-lease-time 600秒后,沒有機器向DHCP續約,DHCP會保留7200秒,保留此IP地址不用於分配給其它機器。 當超過7200秒后,將不再保留此IP地址給此機器。
注意:default-lease-time 和 max-lease-time都是以秒為單位的租約時間,該項參數可以作用在全局配置中,也可以作用在局部配置中。
# 使用如下設置啟動/關閉全面的動態域名更新
#ddns-update-style none; #dns更新樣式none --> 不更新
#authoritative; #當DHCP服務器是本地局域網唯一時,需取消此行備注
log-facility local7; #日志類型local7
# 沒有服務將在這個子網,但宣稱它幫助DHCP服務器理解網絡拓撲。
subnet 10.152.187.0 netmask 255.255.255.0 {
}
# This is a very basic subnet declaration.
# 基本的作用域聲明
subnet 10.254.239.0 netmask 255.255.255.224 {
range 10.254.239.10 10.254.239.20;
option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
}
# A slightly different configuration for an internal subnet.
# 配置內部子網 通用模塊
subnet 10.5.5.0 netmask 255.255.255.224 { #定義作用域
range 10.5.5.26 10.5.5.30; #地址池
option domain-name-servers ns1.internal.example.org; #dns地址
option domain-name "internal.example.org"; #域名
option routers 10.5.5.1; #網關
option broadcast-address 10.5.5.31; #廣播地址
default-lease-time 600; #租約時長
max-lease-time 7200; #租約最大時長
}
Sub net:
聲明一般用來指定IP 作用域、定義為客戶端分配的IP 地址池等等
聲明格式如下:
subnet 網絡號 netmask 子網掩碼 {
選項或參數
}
注意:網絡號必須與DHCP 服務器的網絡號相同
range 起始IP 地址 結束IP 地址
作用:指定動態IP 地址范圍
注意:可以在subnet(子網) 聲明中指定多個range,但多個range 所定義IP 范圍不能重復
option routers IP 地址
作用:為客戶端指定默認網關
如:option routers 10.5.5.1;
option domain-name
作用:為客戶端指定默認的域
option domain-name-servers IP 地址
作用:為客戶端指定DNS 服務器地址
注意:option routers、option domain-name、option domain-name-servers選項可以用在全局配置中,也可以用在局部配置中。
# 為特定的主機分配專一的描述信息
host passacaglia {
hardware ethernet 0:0:c0:5d:bd:95;
filename "vmunix.passacaglia";
server-name "toccata.fugue.com";
}
# 為特定主機綁定固定IP
host fantasia { #定義作用的主機名是fantasia
hardware ethernet 08:00:07:26:c0:a5;#主機網卡mac地址
fixed-address fantasia.fugue.com; #綁定的IP地址或域名
}
# 為foo的組分配IP地址10.17.224.0網段,為其他的組分配10.0.29.0網段
class "foo" {
match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
} #這行,沒看懂!!!substring (option vendor-class-identifier, 0, 4)
shared-network 224-29 {
subnet 10.17.224.0 netmask 255.255.255.0 {
option routers rtr-224.example.org;
}
subnet 10.0.29.0 netmask 255.255.255.0 {
option routers rtr-29.example.org;
}
pool {
allow members of "foo";
range 10.17.224.10 10.17.224.250;
}
pool {
deny members of "foo";
range 10.0.29.10 10.0.29.230;
}
}
實戰:使用DHCP服務,為客戶端分配IP地址,並實現IP綁定
注釋:在實驗過程中,使用xshell進行實驗,為了避免xshell斷開連接,對兩台虛擬機分別添加了一塊新的網卡,並保證兩塊網卡在一個局域網中.
xiaogan120.cn ---> ifconfig eth1 192.168.1.1/24
xiaogan121.cn ---> 添加一塊網卡后,需要對新的網卡建立一個配置文件,修改mac地址等信息
案例:公司有60台計算機,
IP地址段為192.168.1.1-192.168.1.254,
子網掩碼是255.255.255.0,
網關為192.168.1.1,
客戶端可以使用IP范圍:192.168.1.100-192.168.1.200,
剩余IP地址保留.
實驗環境:虛擬機中原本的網卡不能使用橋接模式(因為局域網中可能已經存在DHCP服務器,這樣,就很難讓新添加的DHCP服務區獲取到該服務器的IP地址.)
另外,可能造成公司局域網中,其他極其因為獲得了新添加的DHCP服務器上的IP地址,而不能上網.
服務端:xiaogan120.cn 虛擬機網卡:vmnet6
客戶端:xiaogan121.cn 虛擬機網卡:vmnet6
Start :
環境搭建:
在VMware中,對兩台虛擬機添加網卡,並進行設置,如下圖:
服務端:xiaogan120.cn:
1. 安裝DHCP服務
yum -y install dhcp
2. 配置DHCP服務器
DHCP服務安裝完成后,默認是沒有進行配置的,需要拷貝樣例進行修改.
2.1 拷貝樣例文件到配置目錄
cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
2.2 配置DHCP服務器
vim /etc/dhcp/dhcpd.conf
進行如下修改,其他配置信息刪除:
log-facility local7; #日志類型
subnet 192.168.1.0 netmask 255.255.255.0 { #作用域
range 192.168.1.100 192.168.1.200; # IP范圍段
option domain-name-servers 192.168.1.1; # DNS服務器地址
option domain-name "xiaogan.org"; # 域名
option routers 192.168.1.1; # 網關
option broadcast-address 255.255.255.255; #廣播地址
default-lease-time 600; # 租約時長
max-lease-time 7200; #最大租約時長
}
2.3 配置服務器IP地址
ifconfig eth1 192.168.1.1/24
並編寫eth1的配置文件,如下:
vim /etc/sysconfig/network-scripts/ifcfg-eth1
--- ifcfg-eth1 start ---
DEVICE=eth1
HWADDR=00:0C:29:A1:20:70
TYPE=Ethernet
NM_CONTROLLED=yes
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1
--- ifcfg-eth1 end ---
這樣做,是為了便於在下次重啟時,配置服務器的IP,不然,開機啟動會失敗!!
2.3 開啟自動開機啟動
chkconfig --add dhcpd #添加 dhcpd 開機啟動
chkconfig --list dhcpd #查看 dhcpd服務開機啟動狀態
2.3 啟動網絡服務
/etc/init.d/dhcpd start #啟動DHCP服務
netstat -anlpu | grep dhcpd #檢查DHCP服務監聽端口,看其是否已經啟動
客戶端xiaogan121.cn:
3. 為新添加的網卡,修改配置文件:
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth1
刪除mac地址等與eth0有關的信息,並修改成eth1的信息,詳情如下:
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
4.重啟網絡服務,並查看eth1網絡信息:
ifconfig eth1
OK,由此可知,DHCP服務器已經成功了!
5. 查看DNS服務器信息:
cat /etc/resolv.conf
6. 查看網關信息:
route -n | grep eth1
7. 查看DHCP租約數據庫文件
cat /var/lib/dhcpd/dhcpd.leases
DHCP服務器,IP地址和mac地址綁定:
在DHCP 中的IP 地址綁定用於給客戶端分配固定IP 地址。比如服務器需要使用固定IP 地址就可以使用IP 地址綁定,通過MAC 地址與IP 地址的對應關系為指定的物理地址計算機分配固定IP地址。
整個配置過程需要用到 host 聲明和hardware、fixed-address 參數。
(1)host 主機名 {......}
作用:用於定義保留地址
(2)hardware 類型 硬件地址
作用:定義網絡接口類型和硬件地址。常用類型為以太網(ethernet),地址為MAC 地址。
(3)fixed-address IP 地址
作用:定義DHCP 客戶端指定的IP 地址。
Usage:
host [hostname]{
hardware ethernet [mac address];
fixed-address [IPADDR];
}
上一個實驗成功后!!
客戶端xiaogan121.cn:
1. 查看新添加網卡的mac地址和主機名稱:
ifconfig eth1 | grep HWaddr
cat /etc/hosts
服務端xiaogan120.cn:
2. 編輯DHCP服務配置文件/etc/dhcp/dhcpd.conf
vim /etc/dhcp/dhcpd.conf
修改配置文件如下:
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option domain-name-servers 192.168.1.1;
option domain-name "xiaogan.org";
option routers 192.168.1.1;
option broadcast-address 192.168.1.255;
default-lease-time 600;
max-lease-time 7200;
host xiaogan121.cn {
hardware ethernet 00:0C:29:0E:47:77;
fixed-address 192.168.1.123;
}
}
保存退出!!!
3. 重啟服務器的DHCP服務
/etc/init.d/dhcpd restart
客戶端xiaogan121.cn:
4.重啟網絡服務
/etc/init.d/network restart
或
service restart dhcpd
查看eth1網絡信息:
ifconfig eth1
補 充:
其他的理解方式1:
DHCP Client發現階段:即DHCP客戶端尋找DHCP服務端的過程
客戶端發送DHCP Discovery,因為DHCP Server對應於DHCP客戶端是未知的,所以DHCP 客戶端發出的DHCP Discovery報文是廣播包,源地址為0.0.0.0目的地址為255.255.255.255。網絡上的所有支持TCP/IP的主機都會收到該DHCP Discovery報文,但是只有DHCP Server會響應該報文。
注意:客戶端執行DHCP DISCOVER 后,如果沒有DHCP 服務器響應客戶端的請求,客戶端會隨機使用169.254.0.0/16 網段中的一個IP 地址配置本機地址。
169.254.0.0/16是windows的自動專有IP尋址范圍,也就是在無法通過DHCP獲取IP地址時,由系統自動分配的IP地址段。
早先的Linux上並不會產生這條路由,現在有這條路由大概是為了和windows兼容。
[root@xiaogan121 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.31.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.171.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
0.0.0.0 192.168.31.1 0.0.0.0 UG 0 0 0 eth1
DHCP Server 提供階段:即為DHCP Server響應DHCP Discovery所發的DHCP Offer階段
即DHCP服務器提供IP地址的階段。在網絡中接收到DHCPdiscover發現信息的DHCP服務器都會做出響應,它從尚未出租的IP地址中挑選一個分配給DHCP客戶機,向DHCP客戶機發送一個包含出租的IP地址和其他設置的DHCPoffer提供信息
DHCP Client 確認階段:即DHCP客戶機選擇某台DHCP服務器提供的IP地址的階段。
如果有多台DHCP服務器向DHCP客戶機發來的DHCPoffer提供信息,則DHCP客戶機只接受第一個收到的DHCPoffer提供信息,然后它就以廣播方式回答一個DHCPrequest請求信息,該信息中包含向它所選定的DHCP服務器請求IP地址的內容。之所以要以廣播方式回答,是為了通知所有的DHCP服務器,他將選擇某台DHCP服務器所提供的IP地址
DHCP Server確認階段:即DHCP服務器確認所提供的IP地址的階段。
當DHCP服務器收到DHCP客戶機回答的DHCPrequest請求信息之后,它便向DHCP客戶機發送一個包含它所提供的IP地址和其他設置的DHCPack確認信息,告訴DHCP客戶機可以使用它所提供的IP地址。然后DHCP客戶機便將其TCP/IP協議與網卡綁定,另外,除DHCP客戶機選中的服務器外,其他的DHCP服務器都將收回曾提供的IP地址
DHCP Client重新登錄網絡:
當DHCP Client重新登錄后,就不需要再發送DHCP discover發現信息了,而是直接發送包含前一次所分配的IP地址的DHCP request請求信息。當DHCP服務器收到這一信息后,它會嘗試讓DHCP客戶機繼續使用原來的IP地址,並回答一個DHCP ack確認信息。如果此IP地址已無法再分配給原來的DHCP客戶機使用時(比如此IP地址已分配給其它DHCP客戶機使用),則DHCP服務器給DHCP客戶機回答一個DHCP nack否認信息。當原來的DHCP客戶機收到此DHCP nack否認信息后,它就必須重新發送DHCP discover發現信息來請求新的IP地址。
DHCP Client更新租約:
DHCP獲取到的IP地址都有一個租約,租約過期后,DHCP Server將回收該IP地址,所以如果DHCP Client如果想繼續使用該IP地址,則必須更新租約。更新的方式就是,當當前租約期限過了一半后,DHCP Client都會發送DHCP Renew報文來續約租期。
其他的理解方式2:
為了便於理解,我們把DHCP客戶機比做餐館里的客人,DHCP服務器工作原理當中,服務器比做服務員(一個餐館里也可以有多個服務員),IP地址比做客戶需要的食物。那么可以這樣描述整個過程:客人走進餐館,問:“有沒有服務員啊?”(DHCP discover),多個服務員同時回答:“有,我這有雞翅”“有,我這有漢堡”(DHCP offer)。客人說:“好吧,我要一份漢堡”(DHCP request,這個客人比較死板,總是選擇第一次聽到的食物),端着漢堡的服務員回應了一聲:“來啦”(DHCP ack),並把食物端到客人面前,供其享用(將網卡和IP地址綁定)。客人下次來的時候,就直接找上次那個服務員點自己喜歡的漢堡了(DHCP request),如果還有漢堡,服務員會再次確認並上菜(DHCP ack),而如果已經賣完了,服務員則會告訴客人:“不好意思,已經賣完了”(DHCP nack)。當然,服務員隔一段時間會來收拾一次桌子,除非客人特別說明這菜還要繼續吃的,服務員會將剩菜端走。
NTP 服務---時間同步服務(ntpdate命令 ntpd服務)
不同機器之間的時間同步
為了避免主機時間因為長期運作下所導致的時間偏差,進行時間同步(synchronize)的工作是非常必要的。Linux系統下,一般使用ntp服務器來同步不同機器的時間。一台機器,可以同時是ntp服務器和ntp客戶機。在網絡中,推薦使用像DNS服務器一樣分層的時間服務器來同步時間。
同步時間,可以使用ntpdate命令,也可以使用ntpd服務。
ntpdate命令同步時間
Usage:
ntpdate [ipaddr]
ntpdate [域名]
ntp服務:
簡介:局域網中的客戶機,添加計划任務,定時同步ntp服務器的時間,讓局域網內所有機器時間保持一致!!!
作用:同步時間的服務器,客戶端可以從ntp服務器中同步時間到本機
端口: 123
安裝:yum -y install ntp
配置文件:/etc/ntp.conf
使用方法:安裝完成后,直接啟動即可.在配置文件中,可查看ntp服務器域名
客戶端同步命令如下:
ntpdate 192.168.171.121
或
ntpdate 0.centos.pool.ntp.org
方法一:
ntpdate time.windows.com #同步windows時間服務器的時間
同步公網時間:
echo "0 3 * * * ntpdate time.windows.com" >> /var/spool/cron/root
方法二:
Server端:
安裝ntpd服務
yum -y install ntp
啟動ntp服務並添加開機自啟動
/etc/init.d/ntpd start
chkconfig --add ntpd
客戶端:
ntpdate 192.168.171.121 # NTP服務器的IP地址
或
ntpdate 0.centos.pool.ntp.org #這里的域名,在/etc/ntpd.conf 中設置
添加計划任務:
echo "0 3 * * * ntpdate 192.168.171.121" >> /var/spool/cron/root
擴展:
Linux系統存在兩個時間,系統時間,bios時間
他們可能不同步!
查看系統時間:
date
查看BIOS時間:
hwclcok -r #-r讀
用系統時間設置BIOS時間
hwclock -w #寫入
想要使用ntp服務來同步BIOS時間,需修改配置文件如下:
#/etc/sysconfig/ntpd
SYNC_HWCLOCK = yes