روش تنظیم اینترفیس و تنظیمات شبکه در توزیعهای مختلف لینوکس
روش تنظیم اینترفیس و تنظیمات شبکه در توزیعهای مختلف لینوکس میتواند کمی متفاوت باشد. در این مقاله سعی میکنیم تنظیمات اولیهی شبکه را در اکثر توزیعهای لینوکس توضیح دهیم. بیشتر وقتها برای اینکه ابرکتان به اینترنت یا شبکهای وصل باشد، نیازی به تنظیم خاصی بعد از ساخت ابرک نیست، چون پس از ساخت ابرک و بالاآمدن، سیستم عامل با استفاده از DHCP و تنظیماتی که با Cloud-init انجام شده، اطلاعات درست و لازم را دارد. اما گاهی پیش میآید که میخواهیم چند اینترفیس داشته باشیم و یا IP را بهصورت دستی روی اینترفیسها قرار دهیم، یا تغییراتی را بسته به محیطی که میخواهیم داشته باشیم.
مواردی که در این مقاله پوشش داده شده است:
- تنظیم DNS
- دستورهای اولیهی بررسی و تنظیم شبکه با IPROUTE2
- دریافت مجدد مشخصات شبکه با DHCP
- پیکربندی دستی اینترفیسها در توزیعهای مختلف لینوکس
نکته: در فرایند آمادهشدن ایمیجها با آروان یا Cloud Ready کردن سیستم عاملها، بستهای (package) به اسم cloud-init روی سیستم عامل نصب شده که بهطورکلی وظیفهی فراهمکردن مجموعهای از متادیتا برای ابرک را دارد. این بسته میتواندssh key شما، اسم ابرک و بسیاری دادهی دیگر را هنگام بوت به ابرک تزریق بکند. نکتهای که باید به آن توجه کنید، هنگام پیکربندی دستی برخی کامپوننتهای سیستم عاملتان است، که این بسته میتواند کانفیگهای استاندارد شبکه را هم علاوه بر بسیاری موارد دیگر، تنظیم کند. اگر قرار است اینترفیس ابرک یا تنظیمات شبکهی ابرک را دستی تنظیم کنید و بعد از ریبوت، این تنظیمات دایمی باشد، حتمن با دستورهای زیر فایل 99-custom-networking.cfg را ایجاد و آن را با 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. در چنین حالتی تغییر دستی فایل بعد از ریبوت ماندگار نیست.
نکته: دقت کنید حتا اگر موارد بالا در توزیعی وجود نداشته باشد، ممکن است سیستم عاملتان اطلاعات 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 درست که پاسخگو است ویرایش کنید و سپس بسته را نصب کنید.
برای تنظیم nameserver های خود نیز میتوانید فایل زیر را ویرایش کنید:
$ sudo nano /etc/resolvconf/resolv.conf.d/head
سپس آن را با دستورهای زیر فعال کنید:
$ sudo systemctl start resolvconf.service
$ sudo systemctl enable resolvconf.service
حال میتوانید وضعیت سرویس را بررسی کنید تا مطمئن شوید فعال است:
$ sudo systemctl status resolvconf.service
در پایان فایل را save کنید.
Centos و RHEL
در توزیعهای مبتنی بر ردهت، با هر بار ریبوت یا ریاستارت سرویس 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
۲. اضافه و پاککردن 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
۴. غیرفعال یا فعالکردن لینکها
$ ip link set eth0 down
$ ip link set eth0 up
۵. نمایش جدول روت پیشفرض سیستم عامل
$ ip route show
۶. اضافه یا کمکردن روت
برای مثال ما برای شبکهی 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
برای ابرکهای با سیستم عامل مبتنی بر ردهت، میتوانید این فایلها را ویرایش کنید:
- تنظیمات Global
/etc/sysconfig/network
- تنظیمات هر اینترفیس
/etc/sysconfig/network-scripts/ifcfg-[interfacename]
- تنظیمات روت تیبل و روت مربوط به هر اینترفیس
/etc/sysconfig/network-scripts/route-[interface-name]
فایل اول تعدادی تنظیمات global دارد که بهطور پیشفرض دارای مقادیر زیر است:
همانطور که در تصویر میبینید، پس از آنکه 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]
در این فایل نام اینترفیس در انتهای هر فایل قرار دارد. برای مثال اگر اینترفیس دومی برای شبکهی خصوصی به ابرک اضافه شده، میتوانید فایل جداگانهای برایش بسازید و تنظیماتش را در آن قرار دهید.
این فایل هم برای مثال روی یک ابرک بهطور پیشفرض دارای مقادیر بالا است. هر یک از عبارتها موارد مختلفی را کنترل میکنند. برای مثال:
- عبارت 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 است و محتوای تنظیمات بهشکل زیر است:
در نهایت بعد از تنظیم میتوانید با ریبوتکردن یا 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
فایل ساختاری شبیه به زیر دارد:
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 است.
نمونهی تنظیم یک ابرک متصل به شبکهی پابلیک و یک شبکهی خصوصی بهصورت زیر است:
پارامتر mtu برای تنظیم mtu لینک است که حتمن باید همراه با پارامتر macaddress تنظیم شود. پارامتر macaddress ، مکآدرس device ای است که قرار است تنظیم شود، و اگر مکآدرس اشتباه باشد، تنظیمات روی device اعمال نخواهد شد؛ در واقع پارامتری برای مشخصکردن دقیق اینترفیس در حال تنظیم است.
پس از وارد کردن، برای اعمال تنظیمات کافی است دستور:
$ sudo netplan apply -d
وارد کنید. در صورت وجود خطا در syntax ساختار yaml به دلیل وجود سوییچ -d توضیحی خواهید دید. در صورتی که فایل درست باشد، تنظیمات بدون خطا اعمال میشوند. در پایان، میتوانید سرویس network را ریاستارت کنید:
$ sudo systemctl restart systemd-networkd.service