چرا ؟ 🤔

شاید همین اول کار براتون سوال پیش بیاد که اصلا چرا باید چنین کاری انجام بدیم ؟ خب تمام روتر ها - مودم ها و سوییچ های لایه ۳ چنین کاری برای ما انجام میدن. پس چرا باید به طور نرم افزاری یه سرور DHCP راه اندازی کنیم ؟

خیلی وقت ها پیش میاد که دسترسی به سخت افزار خودمون نداریم یا نمیتونیم/نمیخوایم تنظیمات روتر خودمون رو عوض کنیم. یا مثال خیلی بهتر ! دستگاه های ما به صورت Cross به همدیگه متصل شدن و فقط یه Hub در اختیار داریم.

یا خیلی مثال های دیگه ...

در چنین سناریو هایی به راحتی میشه با تبدیل یکی از سیستم ها به سرور DHCP مشکل رو برطرف کرد و مدیریت ساده ای روی این موضوع داشت. 👨🏻‍🔧

DHCP چطور کار میکنه ؟

اینجا قصد نداریم پروتکل DHCP رو بررسی کنیم ولی خیلی کلی روند کاریش رو براتون شرح می دم.

  • وقتی یه کلاینت توی شبکه فعال میشه در اولین مراحل کاری خودش یه بسته DHCPDISCOVER به سرور میفرسته.
  • وقتی سرور بسته DHCPDISCOVER رو دریافت کرد در پاسخ به اون یه بسته DHCPOFFER به کلاینت میفرسته.
  • وقتی کلاینت بسته DHCPOFFER رو دریافت می کنه با ارسال بسته DHCPREQUEST به سرور اعلام میکنه که آماده است تنظیمات شبکه ای که در بسته DHCPOFFER به اون ارایه شده رو دریافت کنه.
  • در نهایت وقتی سرور بسته DHCPREQUEST رو از سمت کلاینت دریافت کنه بسته DHCPACK رو به کلاینت ارسال میکنه و بهش تنظیمات تعیین شده در قبل رو تخصیص میده. در نتیجه کلاینت یه آدرس IP پیدا میکنه و توی شبکه تعریف میشه.

شروع به کار

در حال حاضر از چنین سیستم عامل هایی استفاده شده :

DHCP Server - Ubuntu 20.04
DHCP Clients - CentOS 7

1- نصب سرور

برای تنظیم یک سیستم به عنوان سرور از برنامه ای که قبلا با عنوان dhcp3-server شناخته میشد استفاده می کنیم. جهت نصب دستور زیر را اجرا کنید :

sudo apt install isc-dhcp-server

زمانی که نصب به اتمام رسید فایل etc/default/isc-dhcp-server/ را باز کنید تا interface مورد نظر برای مدیریت درخواست های DHCP را تعریف کنید. برای مثال اگر میخواهید از eth0 استفاده کنید به این صورت باید تنظیم کنید :

INTERFACES="eth0"

2- تنظیم سرور

تمامی تنظیمات مربوط به سرور DHCP شما در فایل به آدرس etc/dhcp/dhcpd.conf/ قرار دارند و باید همه اطلاعات شبکه ای که به کلاینت ها ارسال می شوند را اینجا قرار دهید.

در این فایل دو چیز را تعریف می کنیم :

  • پارامتر ها : شامل اینکه چگونه وظایف دریافت یا تقسیم شوند یا اینکه چه تنظیماتی به کلاینت ها ارسال شود
  • تعاریف : شامل پیکربندی توپولوژی شبکه - وضعیت کلاینت ها - تنظیمات پیشنهاد آدرس برای کلاینت ها و همچنین اعمال دسته ای پارامتر ها

برای شروع فایل مربوطه را باز کنید :

sudo nano /etc/dhcp/dhcpd.conf

حالا پارامتر های عمومی زیر را در بالاترین سطر فایل قرار دهید ( مقادیر را با توجه به نیاز/سناریو خودتان تغییر دهید ):

option domain-name "arash-hatami.ir";
option domain-name-servers ns1.arash-hatami.ir, ns2.arash-hatami.ir;
default-lease-time 3600;
max-lease-time 7200;
authoritative;

حالا یک زیرشبکه ( Subnetwork ) تعریف می کنیم. در اینجا DHCP را برای شبکه 192.168.10.0/24 تنظیم می کنیم :

subnet 192.168.10.0 netmask 255.255.255.0 {
  option routers              192.168.10.1;
  option subnet-mask          255.255.255.0;
  option domain-search        "arash-hatami.ir";
  option domain-name-servers  192.168.10.1;
  range   192.168.10.10    192.168.10.100;
  range   192.168.10.120   192.168.10.210;
}

3- تخصیص آدرس ثابت

جهت تخصیص یک Static IP به کلاینتی خاص به این شکل عمل می کنیم :

host node1 {
    hardware ethernet 00:f2:m3:6y:45:05;
    fixed-address 192.168.10.101;
}

host node2 {
    hardware ethernet 00:4h:5g:24:8f:3b;
    fixed-address 192.168.10.102;
}

4- اجرای سرویس

حالا که تنظیمات مربوطه را انجام دادید فایل را ذخیره کرده و ببندید.

سپس سرویس مربوطه را برای بار اول اجرا کرده و آن را فعال می کنیم تا در بوت های بعدی به صورت خودکار اجرا شود :

sudo service isc-dhcp-server.service start
sudo service isc-dhcp-server.service enable

همچنین پورت 67 را که مربوط به DHCPD daemon می باشد در فایروال سیستم مجاز می کنیم :

sudo ufw allow  67/udp
sudo ufw reload

5- تنظیم کلاینت ها

اکنون که همه تنظیمات سرور اصلی انجام شده میتونیم کلاینت های خودمون رو هم تنظیم کنیم تا به صورت خودکار آدرس IP خودشون رو از سرور دریافت کنن. پس فایل etc/network/interfaces/ رو ویرایش می کنیم :

auto  eth0
iface eth0 inet dhcp

سپس سرویس شبکه را مجدد راه اندازی می کنیم :

sudo service networking restart

اگه هم از نسخه های دسکتاپ استفاده می کنین که دیگه خیلی راحت از طریق GUI این کار رو انجام بدید 😉