help-header

روش تنظیم اینترفیس و تنظیمات شبکه در توزیع‌های مختلف لینوکس

روش تنظیم اینترفیس و تنظیمات شبکه در توزیع‌های مختلف لینوکس می‌تواند کمی متفاوت باشد. در این مقاله سعی می‌کنیم تنظیمات اولیه‌ی شبکه را در اکثر توزیع‌های لینوکس توضیح دهیم. بیش‌تر وقت‌ها برای این‌که ابرک‌تان به اینترنت یا شبکه‌ای وصل باشد، نیازی به تنظیم خاصی بعد از ساخت ابرک نیست، چون پس از ساخت ابرک و بالاآمدن، سیستم عامل با استفاده از DHCP و تنظیماتی که با Cloud-init انجام شده، اطلاعات درست و لازم را دارد. اما گاهی پیش می‌آید که می‌خواهیم چند اینترفیس داشته باشیم و یا IP را به‌صورت دستی روی اینترفیس‌ها قرار دهیم، یا تغییراتی را بسته به محیطی که می‌خواهیم داشته باشیم.
مواردی که در این مقاله پوشش داده شده است:

  • تنظیم DNS
  • دستورهای اولیه‌ی بررسی و تنظیم شبکه با IPROUTE2
  • دریافت مجدد مشخصات شبکه با DHCP
  • پیکربندی دستی اینترفیس‌ها در توزیع‌های مختلف لینوکس

نکته: در فرایند آماده‌شدن ایمیج‌ها با آروان یا Cloud Ready کردن سیستم عامل‌ها، بسته‌ای (package) به اسم cloud-init روی سیستم عامل نصب شده که به‌طورکلی وظیفه‌ی فراهم‌کردن مجموعه‌ای از متادیتا برای ابرک را دارد. این بسته می‌تواندssh key شما، اسم ابرک و بسیاری داده‌ی دیگر را هنگام بوت به ابرک تزریق بکند. نکته‌ای که باید به آن توجه کنید، هنگام پیکربندی دستی برخی کامپوننت‌های سیستم عامل‌تان است، که این بسته می‌تواند کانفیگ‌های استاندارد شبکه را هم علاوه بر بسیاری موارد دیگر، تنظیم کند. اگر قرار است اینترفیس ابرک یا تنظیمات شبکه‌ی ابرک را دستی تنظیم کنید و بعد از ری‌بوت، این تنظیمات دایمی باشد، حتمن با دستورهای زیر cloud-init را کانفیگ کنید:

$ sudo nano /etc/cloud/cloud.cfg.d/99-custom-networking.cfg

و محتوای فایل را برابر فرمان زیر قرار دهید:

network: {config: disabled}


تنظیم DNS

اگر قرار است ماشین‌تان به‌عنوان یک کلاینت DNS باشد، لازم است سوال‌های DNS ای از یک سرور پرسیده شود. برای تنظیم این‌که از چه سروری سوال شود، در همه‌ی توزیع‌ها به فایل /etc/resolv.conf مراجعه می‌شود. در برخی توزیع‌های جدیدتر ممکن است این فایل خود یک لینک به فایلی دیگر باشد و محتوای این فایل از ابزارهای جانبی مدیریت شبکه کم یا زیاد شود. برای مثال ممکن است در نسخه‌های جدیدDebian و Ubuntu این فایل به‌طور غیرمستقیم با system-resolved مدیریت شود، یا گاه با initscripts، یا NetworkManager. در چنین حالتی تغییر دستی فایل بعد از ری‌بوت ماندگار نیست.

1.png

نکته: دقت کنید حتا اگر موارد بالا در توزیعی وجود نداشته باشد، ممکن است سیستم عامل‌تان اطلاعات DNS را از DHCP دریافت کند و باعث overwrite شدن تنظیم قبلی شود.
یک راه حل ساده برای اکثر توزیع‌ها می‌تواند جایگزین‌کردن symbolic link با یک فایل جدید باشد؛ با محتوای مورد نظرمان و در آخر read-only کردن آن فایل. برای این کار می‌توانید از دستور زیر استفاده کنید:

$ sudo rm -f /etc/resolv.conf
$ sudo nano /etc/resolv.conf

در این مرحله باید محتوای فایل را با nameserver های موردنظر پر کنید، مثلن:

nameserver 8.8.8.8
nameserver 4.2.2.4
$ sudo chattr +i /etc/resolv.conf

برای تغییرات در آینده حتمن ابتدا فایل را از حالت read-only خارج کنید، با دستور:

$ sudo chattr -i /etc/resolve.conf

Ubuntu / Debian

در اوبونتو و دبیان افزون بر راه حلی که ابتدا گفتیم، می‌توانید از بسته‌ی resolvconf نیز برای تنظیم استفاده کنید. اگر نصب نبود می‌توانید با دستور های زیر، آن را نصب کنید:

$ sudo apt update
$ sudo apt install resolvconf

اگر در مرحله‌ی نصب نیز با خطای name resolution روبه‌رو شدید، می‌توانید موقتن فایل را به یک nameserver درست که پاسخ‌گو است ویرایش کنید و سپس بسته را نصب کنید.

2.png

برای تنظیم nameserver های خود نیز می‌توانید فایل زیر را ویرایش کنید:

$ sudo nano /etc/resolvconf/resolv.conf.d/head

سپس آن را با دستورهای زیر فعال کنید:

$ sudo systemctl start resolvconf.service
$ sudo systemctl enable resolvconf.service

حال می‌توانید وضعیت سرویس را بررسی کنید تا مطمئن شوید فعال است:

$ sudo systemctl status resolvconf.service

3.png

در پایان فایل را save کنید.

Centos / RHEL

4.png

در توزیع‌های مبتنی بر ردهت، با هر بار ری‌بوت یا ری‌استارت سرویس network ممکن است محتوای فایل resolv.conf از طریق NetworkManager وDHCP با اجرای اسکریپت‌های زیر overwrite شود.

/etc/sysconfig/network-scripts/ifup-post
/etc/sysconfig/network-scripts/ifdown-post

راه حل اول می‌تواند مشکل‌تان را حل کند، اما اگر می‌خواهید NetworkManager این فایل را overwrite نکند، می‌توانید مراحل زیر را انجام دهید:

$ sudo nano /etc/NetworkManager/conf.d/90-dns-none.conf

محتوای فایل را با مقادیر زیر پر کنید:

[main]
dns=none

در ادامهNetworkManager را reload کنید:

$ sudo systemctl reload NetworkManager

دقت کنید ممکن است از طریق cloud-init، این فایل یا فایلی با محتوای مشابه از پیش در دایرکتوری یادشده وجود داشته باشد که برای اطمینان می‌توانید ابتدا این مورد را بررسی کنید و بعد آن فایل را بسازید.
در پایان می‌توانید فایل resolv.conf را ویرایش کنید و برای اطمینان بیش‌تر، با دستور chattr که بالاتر گفته شد، آن را read-only کنید.

دستورهای اولیه‌ی بررسی و تنظیم شبکه با IPROUTE2

در توزیع‌های مختلف لینوکس با استفاده از بسته‌ی پیش‌فرضiproute2 می‌توانید تنظیمات مربوط به اینترفیس‌ها را بررسی کنید و حتا تغییراتی در آن‌ها ایجاد کنید، اما تغییرات ایجادشده دایمی نیستند و هر بار بعد از ری‌بوت، پاک می‌شوند.
برخی دستورهای پر کاربرد را در ادامه بررسی می‌کنیم:

۱. دیدن وضعیت کلی اینترفیس‌ها

$ ip addr show

5.png

۲. اضافه و پاک‌کردن IP به اینترفیس

$ sudo ip addr add 192.168.50.5/24 dev eth0 

به جای eth0 اسم اینترفیس مورد نظر ، و به جای IP و subnet هم اطلاعات مورد نظر خودتان را وارد کنید. دقت کنید که این اطلاعاتIP قبلی را پاک نمی‌کند و به‌عنوان IP دوم به اینترفیس مورد نظر اضافه می‌شود.
برای حذف آن، دستور زیر را می‌توان استفاده کرد:

$ sudo ip addr del 192.168.50.5/24 dev eth0
$ sudo ip addr flush dev eth0

۳. نمایش وضعیت اینترفیس‌ها

$ ip link show

6.png
۴. غیرفعال یا فعال‌کردن لینک‌ها

$ ip link set eth0 down
$ ip link set eth0 up

۵. نمایش جدول روت پیش‌فرض سیستم عامل

$ ip route show 

7.png

۶. اضافه یا کم‌کردن روت

برای مثال ما برای شبکه‌ی 10.10.20.0/24 از اینترفیس eth0 استفاده می‌کنیم، و next-hop یا اینترفیسی که ترافیک قرار است به آن تحویل داده شود، آدرس192.168.50.100 را دارد. برای حذفش کافی است range را وارد کنید. اگر برای یک range چند روت ثبت شده، می‌توانید با دادن جزییات بیش‌تر، مثل اسم اینترفیس، فقط همان را پاک کنید.

sudo ip route add 10.10.20.0/24 via 192.168.50.100 dev eth0 
sudo ip route del 10.10.20.0/24
sudo ip route del 10.10.20.0/24 dev eth0

گرفتن اطلاعات از DHCP در زمان اجرا

گاه در زمان اجرای سیستم عامل، نیاز داریم اطلاعات مربوط به IP و GATEWAY و ... را از طریقDHCP دریافت کنیم. ساده‌ترین کار استفاده از ابزار dhclient است. پیش از استفاده از این ابزار باید مطمئن شویم اینترفیسی که مورد نظرمان است وضعیت فعال دارد. روش بررسی این مورد را پیش‌تر خواندیم. می‌توانیم از ابزاری که معرفی کردیم به‌صورت زیر استفاده کنیم:

$ sudo ip link set dev ethX up
$ sudo ip addr flush dev ethX
$ sudo ip route flush dev ethX
$ sudo dhclient ethX -v

دقت کنید که به جای ethX باید اسم اینترفیس مورد نظر را قرار دهید.

تنظیم اینترفیس‌های ابرک در توزیع‌های مختلف لینوکس

در هر توزیعی، پیکربندی فایل‌های مربوط به اینترفیس می‌تواند در جای متفاوتی از سیستم عامل قرار داشته باشد. در این مقاله موارد مربوط به تنظیم اینترفیس در توزیع‌های مبتنی بر ردهت و دبیان را بررسی می‌کنیم. هم‌چنین نگاهی به تنظیماتnetplan در اوبونتوهای نسخه‌ی 18.04 به بالاتر می‌اندازیم، چون در این نسخه‌ها، تنظیمات تغییر کرده و باید با استفاده از نوشتن تنظیمات در قالب yaml فایل کانفیگ دل‌خواه را اضافه کنیم.

نکته: اگر قرار است کانفیگ اینترفیس عمومی را از حالتDHCP به حالتstatic یاmanual تغییر دهید، حتمن ابتدا اطلاعات دریافت‌شده‌یDHCP را برای استفاده‌ی مجدد یاداشت کنید.

RHEL/Centos

برای ابرک‌های با سیستم عامل مبتنی بر ردهت، می‌توانید این فایل‌ها را ویرایش کنید:

/etc/sysconfig/network - تنظیمات global
/etc/sysconfig/network-scripts/ifcfg-[interfacename] - تنظیمات هر اینترفیس
/etc/sysconfig/network-scripts/route-[interface-name] تنظیمات روت تیبل و روت مربوط به هر اینترفیس

فایل اول تعدادی تنظیمات global دارد که به‌طور پیش‌فرض دارای مقادیر زیر است:

8.png

همان‌طور که در تصویر می‌بینید، پس از آن‌که cloud-init ابرک این فایل‌ها را ساخت، تغییر آن‌ها بدون غیرفعال‌کردن تنظیمات cloud-init در خصوص شبکه بی‌فایده است و بعد از ری‌بوت پاک می‌شود. مطمئن شوید اگر قرار است تنظیمات را دستی انجام دهید cloud-init برای این بخش غیرفعال باشد.
مطمئن شوید در این فایل مقادیر:

NETWORKING=yes
NETWORKING_IPV6=no
IPV6INIT=no
NOZEROCONF=yes

وجود داشته باشد. عبارت NETWORKING فعال یا غیرفعال بودن شبکه را مشخص می‌کند و می‌تواند مقدارهای yes یاno داشته باشد. دو عبارت بعدی برای غیرفعال کردن ipv6 است، و عبارت nozeroconf برای فعال‌کردن تکنیکی است که به صورت خودکار یک روت 169.254.0.0/255.255.0.0 در روت یبل سیستم ایجاد می‌کند.

فایل بعدی برای تنظیم هر اینترفیس روی ابرک است:

/etc/sysconfig/network-scripts/ifcfg-[interfacename]

که انتهای هر فایل اسم اینترفیس است. برای مثال اگر اینترفیس دومی برای شبکه‌ی خصوصی به ابرک اضافه شده، می‌توانید فایل جداگانه‌ای برایش بسازید و تنظیماتش را در آن قرار دهید.


9.png

این فایل هم برای مثال روی یک ابرک به‌طور پیش‌فرض دارای مقادیر بالا است. هر یک از عبارت‌ها موارد مختلفی را کنترل می‌کنند. برای مثال:

  • عبارت BOOTPRO می‌تواند حاوی مقادیر dhcp ،bootp،none باشد.
  • عبارت DEVICE مشخص‌کننده‌ی اینترفیسی است که قرار است پیکربندی شود.
  • عبارت HWADDR مشخص‌کننده‌ی مک‌آدرس اینترفیسی است که قرار است تنظیم شود.
  • عبارت MTU هم دارای مقداری عددی است که برای اینترفیس‌های پابلیک، 1500 و برای اینترفیس‌های شبکه‌ی خصوصی، مقدار 1450 مناسبند.
  • عبارت ONBOOT باعث فعال‌شدن یا نشدن اینترفیس هنگام بوت است.
  • عبارت TYPE نوع اینترفیس را مشخص می‌کند.
  • عبارت USERCTL مشخص می‌کند آیا یوزرهای غیر روت اجازه‌ی تغییر این اینترفیس را دارند یا خیر .
  • عبارت GATEWAY مشخص می‌کند که قرار است روی این اینترفیسgateway داشته باشیم، و مقدارهایش برابر با IP، default gateway است.
  • عبارت IPADDR آدرس IP اینترفیس را مشخص می‌کند.
  • عبارت NETMASK برای مشخص‌کردن subnetmask شبکه است.

لزومن نیازی به داشتن همه‌ی عبارت‌های بالا در کانفیگ فایل نیست اما به‌طور پیش‌فرض می‌توانید برای اینترفیسی که قرار است به‌صورت دستی پیکربندی شود، موارد بالا را در نظر بگیرید. مقادیر بیش‌تر را می‌توانید از مستندات مربوط به توزیع مربوطه مطالعه کنید.
برای مثال، فرض می‌کنیم ابرک ما دو اینترفیس خصوصی و عمومی (Public) دارد و می‌خواهیم اینترفیس پابلیک از DHCP و زیرساخت آروان، مشخصات را دریافت کند، اما اینترفیس خصوصی به‌صورت دستی کانفیگ شده باشد.
نکته: دقت کنید در صورت نیاز، اول فایل مربوط به اینترفیس را بسازید و حتمن اگر اسم اینترفیسی را نمی‌دانید، ابتدا با دستوری مثل IP link اسم اینترفیس را به دست آورید و بعد برای ساخت فایل مطابق با آن اسم اقدام کنید.


Public interface:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0

محتواهای فایل

BOOTPROTO=dhcp
DEVICE=eth0
MTU=1500
ONBOOT=yes
TYPE=Ethernet
USERCTL=no

Private Interface:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1

محتواهای فایل

BOOTPROTO="none"
DEVICE=eth1
MTU=1450
IPADDR="192.68.0.100"
NETMASK="255.255.255.0"
ONBOOT=yes
TYPE=Ethernet
USERCTL=no

نکته: اگر ابرک float ip ندارد و برای اینترنت از اینترفیس پابلیک استفاده می‌کنید، لزومی به کانفیگ GATEWAY نیست.

در نهایت می‌توانیم بعد از تعریف کانفیگ با دستورهای زیر، اینترفیس را با تنظیمات جدید فعال کنیم:

$ sudo ifdown eth0
$ sudo ifup eth0
یا سرویس network را ری‌استارت کنیم:
$ sudo systemctl restart network

Debian/Ubuntu

برای کانفیگ ایستای (static) اینترفیس توزیع‌های مبتنی بر دبیان کافی است فایل زیر را ویرایش کنید:

/etc/network/interfaces

روی ابرک به‌طور پیش‌فرض ممکن است این فایل حاوی محتوای خاصی نباشد و فایل‌های کانفیگ اینترفیس، به‌شکل جداگانه از دایرکتوری زیر خوانده شود:

/etc/network/interfaces.d

برای تنظیم دستی، این مرحله را می‌توانید انجام دهید:

$ sudo rm -f /etc/network/interfaces.d/*
$ sudo nano /etc/network/interfaces

و برای تنظیم روی حالت DHCP محتوای فایل را برابر دستور زیر  قرار دهید:

auto ens3
iface ens3 inet dhcp

یا:

auto ens3
iface ens3 inet static
address 194.5.193.25
netmask 255.255.254.0
gateway 194.5.192.1

برای حالت استاتیک بگذارید. برای مثال، ابرکی با دو اینترفیس پابلیک و خصوصی داریم که کانفیگ شبکه‌ی خصوصی به‌صورت STATIC است و محتوای تنظیمات به‌شکل زیر است:

10.png

در نهایت بعد از تنظیم می‌توانید با ری‌بوت‌کردن یا ifdown و ifup اینترفیس را با کانفیگی که انجام شد فعال کنید.

$ sudo ifdown ens3
$ sudo ifup ens3

Ubuntu 18.04 / Netplan configuration

اوبونتو از نسخه‌ی 18.04 شروع به استفاده از netplan برای پیکربندی کارت شبکه و تنظیمات مربوط به آن کرد. درnetplan تنظیمات در قالب یک فایلyaml نوشته می‌شود. با نوشتن تنظیمات در این فایل netplan با استفاده از یکrenderer ، تنظیمات مناسب را با توجه به این‌که سیستم عامل از چه سیستمی برای تنظیمات شبکه استفاده می‌کند، تولید می‌کند.
فایل‌های کانفیگ netplan در دایرکتوری /etc/netplan/*.yml قرار دارند. در ابرک‌های ubuntu که از آروان تهیه می‌کنید، همان‌طور که قبل‌تر گفتیم، تنظیمات پیش‌فرض وجود دارد، اما برای تنظیم دستی می‌توانید به‌صورت زیر اقدام کنید:

نکته: دقت کنید اول باید cloud-init را تنظیم کنید که تنظیمات شبکه در آن تغییری ایجاد نکند و تنظیمات بعد از ری‌بوت ثابت بماند.
نکته: فایل yaml ساختاری آبشاری دارد و ارتباط بین پارامترها با space مشخص می‌شود. پس در نوشتن این فایل دقت کنید که از tab برای جدا کردن پارامترها استفاده نکنید، که با خطا مواجه خواهید شد.
وارد دایرکتوری /etc/netplan شوید و فایلی را که وجود دارد برای تنظیم شخصی با یک ادیتور باز کنید، یا فایل قبلی را پاک کنید و فایلی جدید بسازید:

$ sudo nano /etc/netplan/*.yml

فایل ساختاری شبیه به زیر دارد:

11.png

network:
version: 2
renderer: networkd
ethernets:
DEVICE_NAME:
dhcp4: yes/no
addresses: [IP_ADDRESS/NETMASK]
gateway4: GATEWAY

کانفیگ بالا یک نمونه قالب ساده از تنظیم کارت شبکه را نشان می‌دهد، که به توضیح برخی موارد و پارامترها می‌پردازیم. دقت کنید DEVICE_NAME اسم اینترفیسی است که قرار است تنظیم شود. این اسم را می‌توانید با دستور ip link پیدا کنید.
پارامتر dhcp4 باعث فعال‌بودن یا نبودن dhcp ورژن ۴ برای اینترفیس می‌شود.
پارامتر address برای تنظیم IP روی اینترفیس است، که می‌توان یک یا چند IP این‌جا وارد کرد.
پارامتر gateway برای تنظیم یک gateway روی این اینترفیس است که برای اینترفیس‌های پابلیک ابرک‌ها ضروری است.
پارامتر renderer مشخص‌کننده‌ی backend شماست که در سرور اوبونتو systemd-networkd است.
نمونه‌ی تنظیم یک ابرک متصل به شبکه‌ی پابلیک و یک شبکه‌ی خصوصی به‌صورت زیر است:

12.png

پارامتر mtu برای تنظیم mtu لینک است که حتمن باید همراه با پارامتر macaddress تنظیم شود. پارامتر macaddress ، مک‌آدرس device ای است که قرار است تنظیم شود، و اگر مک‌آدرس اشتباه باشد، تنظیمات روی device اعمال نخواهد شد؛ در واقع پارامتری برای مشخص‌کردن دقیق اینترفیس در حال تنظیم است.
پس از وارد کردن، برای اعمال تنظیمات کافی است دستور:

$ sudo netplan apply -d 

وارد کنید. در صورت وجود خطا در syntax ساختار yaml به دلیل وجود سوییچ -d توضیحی خواهید دید. در صورتی که فایل درست باشد، تنظیمات بدون خطا اعمال می‌شوند. در پایان، می‌توانید سرویس network را ری‌استارت کنید:

$ sudo systemctl restart systemd-networkd.service