- โค้ด: เลือกทั้งหมด
yum -y install dhcp
ก๊อบปี้ไฟล์คอนฟิกตัวอย่าง
- โค้ด: เลือกทั้งหมด
cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf.example
เปิดไฟล์ /etc/dhcp/dhcpd.conf
เพิ่มบรรทัดต่อไปนี้
- โค้ด: เลือกทั้งหมด
default-lease-time 86400;
max-lease-time 172800;
option time-offset 25200;
# Configuring Subnet eth0 and IP Range
subnet 192.168.100.0 netmask 255.255.255.0 {
range 192.168.100.100 192.168.100.200;
option domain-name-servers 8.8.8.8, 8.8.4.4;
option domain-name "abcd.com";
option routers 192.168.100.1;
option tftp-server-name cisco;
#default-lease-time 600;
#max-lease-time 7200;
}
#Static for eth0
host eth0 {
hardware ethernet 00:15:5d:64:16:09;
fixed-address 192.168.100.31;
}
#Static DHCP
host nuiz-pc {
hardware ethernet 00:0C:29:05:A7:CB;
fixed-address 192.168.100.110;
}
บรรทัด default-lease-time กำหนดระยะเวลาที่ Clients ต้องส่งมาขอ IP ใหม่ หน่วยเป็นวินาทีครับ ในตัวอย่างคือ 24 ชั่วโมง (24x60x60=86400)
บรรทัด max-lease-time กำหนดระยะเวลา lease time สูงสุดที่ DHCP server จะยอมให้ ใช้กับกรณีที่ Client ส่งค่า lease time ที่อยากได้มาด้วย
บรรทัด "option option tftp-server-name cisco;" เอาไว้เผื่อ DHCP Clients ที่เป็นพวก Cisco IP Phone ซึ่งทั่วไปไม่ต้องมีบรรทัดนี้ก็ได้ครับ แต่ถ้ามีต้องสามารถ resolve ชื่อ cisco เป็น IP Address ได้ เพิ่มชื่อในไฟล์ /etc/hosts ใส่ IP Address ของ TFTP server
- โค้ด: เลือกทั้งหมด
192.168.88.10 cisco
บรรทัด "option time-offset 25200;" ไม่ต้องใส่ก็ได้ บรรทัดนี้ไว้ตั้งเวลาในเครื่องให้แก่ DHCP Clients วิธีคำนวณหาค่า time-offset
ประเทศไทย เร็วกว่า GMT 7 ชั่วโมง ดังนั้น 7x3600 = 25200 วินาที
สตาร์ท dhcp service และทำให้สตาร์ทอัตโนมัติ
- โค้ด: เลือกทั้งหมด
systemctl restart dhcpd
systemctl enable dhcpd
ถ้า DHCP สตาร์ทไม่ได้ อาจเป็นเพราะว่าใส่ Subnet ผิดครับ ไม่มี Interfaces ไหนเครื่องที่มี Subnet นี้
ตรวจสอบโพรเซส dhcpd
- โค้ด: เลือกทั้งหมด
[root@freepbx dhcp]# ps -ef | grep dhcpd
dhcpd 10760 1 0 13:24 ? 00:00:00 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
- โค้ด: เลือกทั้งหมด
[root@freepbx dhcp]# ps -Awl | grep dhcpd
4 S 177 10760 1 0 80 0 - 27716 poll_s ? 00:00:00 dhcpd
- โค้ด: เลือกทั้งหมด
[root@freepbx dhcp]# netstat -alnp | grep dhcpd
udp 0 0 0.0.0.0:67 0.0.0.0:* 10760/dhcpd
raw 0 0 0.0.0.0:1 0.0.0.0:* 7 10760/dhcpd
unix 3 [ ] STREAM CONNECTED 18627204 10760/dhcpd
unix 2 [ ] DGRAM 18628663 10760/dhcpd
ดูไอพีที่จ่ายให้แก่ Cliens
- โค้ด: เลือกทั้งหมด
more /var/lib/dhcpd/dhcpd.leases
ไฟล์ dhcpd.service
/usr/lib/systemd/system/dhcpd.service
- โค้ด: เลือกทั้งหมด
[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
Wants=network-online.target
After=network-online.target
After=time-sync.target
[Service]
Type=notify
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
[Install]
WantedBy=multi-user.target
ไฟล์ /etc/sysconfig/dhcp
ไฟล์นี้จะกำหนดว่าในกรณีที่เรามีหลายๆ Interface ในเครื่อง จะให้ DHCP Server รันที่ Interface ไหน ยกตัวอย่างเช่นในเครื่องมี Interface eth0, eth1, eth2 แต่ต้องการให้ DHCP รันบน eth0 เท่านั้น ก็ให้ตั้งค่าในไฟล์แบบนี้ครับ
- โค้ด: เลือกทั้งหมด
DHCPDARGS="eth0";
หรือให้รันทั้ง eth0 และ eth1 ก็ตั้งค่าแบบนี้
- โค้ด: เลือกทั้งหมด
DHCPDARGS="eth0 eth1";
หรือให้รันทุก Interface เลย ก็ไม่ต้องทำอะไรในไฟล์นี้
ไฟล์ /var/lib/dhcpd/dhcpd.leases
ไฟล์นี้เก็บข้อมูลว่าตอนนี้ DHCP Server จ่ายไอพีอะไรออกไปให้เครื่องไหนบ้าง ดูตัวอย่างครับ
- โค้ด: เลือกทั้งหมด
lease 192.168.100.162 {
starts 5 2018/08/31 16:07:13;
ends 6 2018/09/01 16:07:13;
cltt 5 2018/08/31 16:07:13;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 50:68:0a:f9:f9:81;
client-hostname "android-8f57407d45c6fae7";
}
แต่ผมสังเกตุว่าเวลามันไม่ตรงครับ ช้าไป 7 ชั่วโมง ซึ่งเป็นค่าดีฟอลท์ของมันครับที่มันจะแสดงเวลา UTC แต่เราสามารถแก้ไขให้แสดงเวลาตามเวลาบ้านเราได้ ให้เพิ่มบรรทัดต่อไปนี้ในไฟล์ /etc/dhcp/dhcpd.conf
- โค้ด: เลือกทั้งหมด
db-time-format local;
จะแสดงแบบนี้
- โค้ด: เลือกทั้งหมด
lease 192.168.100.162 {
starts epoch 1535732219; # Fri Aug 31 23:16:59 2018
ends epoch 1535818619; # Sat Sep 01 23:16:59 2018
cltt epoch 1535732219; # Fri Aug 31 23:16:59 2018
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 50:68:0a:f9:f9:81;
client-hostname "android-8f57407d45c6fae7";
}
แต่ถ้าเซ็ตแบบนี้ (ค่าดีฟอลท์)
- โค้ด: เลือกทั้งหมด
db-time-format default;
ก็จะแสดงแบบนี้ (ค่าดีฟอลท์) แต่เวลาจะแสดงเป็น UTC
- โค้ด: เลือกทั้งหมด
lease 192.168.100.165 {
starts 5 2018/08/31 16:23:53;
ends 6 2018/09/01 16:23:53;
cltt 5 2018/08/31 16:23:53;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:15:5d:64:16:05;
}