امیرحسین کریم پور
مدیر ارشد توسینسو و متخصص سرویس های مایکروسافت

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

مشکلات مربوط به شبکه در سیستم عامل گنو لینوکس در برخی اوقات به سختی قابل برطرف کردن است و نیازمند داشتن تجربه و تخصص در زمینه شبکه است و محدود به تنظیمات و پیکربندی های سرویس های شبکه در سیستم عامل گنو لینوکس نمی شود . اما شما به عنوان یک SysAdmin می توانید به ادمین شبکه سازمان کمک کنید تا مشکل را برطرف کند . تشخیص اینکه مشکل مربوط به شبکه است بسیار آسان است زیرا اگر سیستم نتواند با یک سیستم دیگر ارتباط برقرار کند و یا به اینترنت متصل شود و سایر موارد دیگر براحتی می توان تشخیص داد که مشکل از شبکه می باشد . در این آموزش تا حدودی می آموزید که چگونه می توانید از پس مشکلات مربوط به شبکه در سیستم عامل گنو لینوکس بر بیایید . در حالت کلی اگر یک کامپیوتر بخواهد با یک کامپیوتر دیگر در شبکه به برقراری ارتباط و تبادل اطلاعات بپردازد موارد زیر بایستی فراهم و رعایت شود :

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
  1. کارت شبکه بایستی بصورت صحیح در سیستم نصب شود و درایور آن نیز در سیستم عامل بایستی بصورت صحیح نصب شود .
  2. کارت شبکه باید آدرس IP صحیح دریافت کند .
  3. کامپیوتر باید بتواند در Subnet ای که در آن قرار دارد با کامپیوتر های دیگر در همان Subnet ارتباط برقرار کند .
  4. و ....

خب همانطور که پیشتر نیز به شما گفتیم یک کامپیوتر در شبکه برای برقراری ارتباط با سایر کامپیوتر ها دست کم نیاز به یک کارت شبکه دارد . در طی Boot شدن سیستم کرنل لینوکس کارت شبکه هایی که به طور معمول به PCI Bus و همچنین USB متصل شدن را شناسایی می کند سپس کرنل کاری که می کند این است که درایور مورد نیاز برای کارت شبکه را پیدا می کند و به کارت شبکه می شناساند تا بتواند با کارت شبکه ارتباط برقرار کند . به دنبال این پروسه udev daemon که با نام udevd در لینوکس شناخته می شود در فاز های اول فرآیند Boot شدن سیستم اجرا می شود و قوانین مربوط به کارت شبکه را اعمال می کند و شما می توانید کارت شبکه را با نامی مثل eth0 مشاهده کنید . زمانی که کارت شبکه بطور کامل Load شد در مراحل بعد کارت شبکه یک آدرس IP دریافت می کند . خب یکبار دیگر فرآیند شناسایی شدن کارت شبکه را با هم مرور می کنیم :

  1. کرنل سیستم عامل گنو لینوکس PCI bus را شناسایی و پیدا می کند .
  2. با توجه به اطلاعاتی که در کرنل در رابطه با PCI Bus وجود دارد درایور مورد نظر را برای کارت شبکه Load می کند .
  3. Udev بر اساس قوانین یا Rule های خود کارت شبکه یا Network Interface را برای شما پیکربندی و آماده استفاده می کند .

برای تعمیر مشکلات مربوط به کارت شبکه ابتدا باید ببینید اصلا کارت شبکه در PCI Bus وجود دارد یا خیر. برای این کار دستور lspci را در ترمینال اجرا کنید. خروجی شبیه به شکل زیر است :

JBO:~ # lspci
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Inc Virtual Machine Communication Interface (rev 10)
00:0f.0 VGA compatible controller: VMware Inc Abstract SVGA II Adapter
00:10.0 SCSI storage controller: LSI Logic / 
               Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
02:00.0 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB
02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)
02:02.0 Multimedia audio controller: Ensoniq ES1371 [AudioPCI-97] (rev 02)
02:03.0 USB Controller: VMware Inc Abstract USB2 EHCI Controller
JBO:~ #

در خروجی دستور فوق در قسمت 02:01.0 کارت شبکه Ethernet توسط کرنل یافت شده است . در همین خط کارت شبکه AMD 79c970 را می بینید که کرنل ماژول PCnet32 نیاز دارد تا به آدرس دهی شود . قدم بعدی برای حل این مشکل این است که چک کنید که پیکربندی های سخت افزاری کارت شبکه در شاخه sys قرار گرفته ند یا خیر . هر دستگاه استفاده کننده از PCI پیکربندی های خود را در این شاخه ذخیره می کند . در دایرکتوری sys پوشه های مختلفی با توجه به نوع دستگاه ها قرار دارد اگر در اینجا کارت شبکه ای که راجبش صحبت کردیم را مثال بزنیم مسیر پیکربندی هایش در دایرکتوری sysbuspcidevices0000:02:01.0/ قرار دارد برای مثال اگر از این دایرکتوری ls بگیریم محتویاتی شبیه زیر مشاهده خواهیم کرد :

JBO:/sys/bus/pci/devices/0000:02:01.0 # ls -l
total 0
-rw-r--r-- 1 root root  4096 Oct 18 07:08 broken_parity_status
-r--r--r-- 1 root root  4096 Oct 17 07:50 class
-rw-r--r-- 1 root root   256 Oct 17 07:50 config
-r--r--r-- 1 root root  4096 Oct 17 07:50 device
lrwxrwxrwx 1 root root     0 Oct 17 07:51 driver -> ../../../../bus/pci/drivers/pcnet32
-rw------- 1 root root  4096 Oct 18 07:08 enable
lrwxrwxrwx 1 root root     0 Oct 18 07:08 firmware_node -> 
                              ../../../LNXSYSTM:00/device:00/PNP0A03:00/device:06/device:08
-r--r--r-- 1 root root  4096 Oct 17 07:50 irq
-r--r--r-- 1 root root  4096 Oct 18 07:08 local_cpulist
-r--r--r-- 1 root root  4096 Oct 18 07:08 local_cpus
-r--r--r-- 1 root root  4096 Oct 17 07:53 modalias
-rw-r--r-- 1 root root  4096 Oct 18 07:08 msi_bus
drwxr-xr-x 3 root root     0 Oct 17 07:50 net
-r--r--r-- 1 root root  4096 Oct 18 07:08 numa_node
drwxr-xr-x 2 root root     0 Oct 18 07:08 power
-r--r--r-- 1 root root  4096 Oct 17 07:50 resource
-rw------- 1 root root   128 Oct 18 07:08 resource0
-r-------- 1 root root 65536 Oct 18 07:08 rom
lrwxrwxrwx 1 root root     0 Oct 17 07:50 subsystem -> ../../../../bus/pci
-r--r--r-- 1 root root  4096 Oct 17 07:51 subsystem_device
-r--r--r-- 1 root root  4096 Oct 17 07:51 subsystem_vendor
-rw-r--r-- 1 root root  4096 Oct 17 07:51 uevent
-r--r--r-- 1 root root  4096 Oct 17 07:50 vendor
JBO:/sys/bus/pci/devices/0000:02:01.0 #

آیتم خیلی جالب برای عیب یابی و رفع اشکال این گونه مشکلات symbolic link دایرکتوری driver است ، در این مثال این کارت شبکه ما به درایور pcnet32 اشاره می کند ( به خروجی دستور فوق خوب توجه کنید ) . همانطور که می بینید کارت شبکه PCI از درایور صحیح استفاده می کند . نکته ای که بایستی خدمتتان عرض کنم این است که در برخی موارد درایوری که در لینوکس نصب شده است بخوبی کار می کند و در برخی موارد بصورت صحیح کار نمی کند و مشکل ایجاد می کند .

زمانی که داشتم روی سرور Dell کارت شبکه Broadcom را نصب می کردم با مشکلات متعددی مواجه شدم مثلا زمانی که دستور Ping از پکت های Jumbo Frame ها استفاده می کرد Kernel Panic رخ می داد و سرور قفل می کرد . در وهله اول به Kernel driver ظنین شدم که با کارت شبکه همخوانی داشته باشد . در مواقعی که این گونه مشکلات برای شما بوجود می آید ابتدا چک کنید ببینید از کدام نسخه از درایور کارت شبکه در حال حاضر استفاده می کنید ، شما با دستور modinfo می توانید به این موضوع پی ببرید. به خروجی دستور زیر توجه کنید :

JBO:/ # modinfo pcnet32
filename:       /lib/modules/2.6.27.19-5-pae/kernel/drivers/net/pcnet32.ko
license:        GPL
description:    Driver for PCnet32 and PCnetPCI based ethercards
author:         Thomas Bogendoerfer
srcversion:     261B01C36AC94382ED8D984
alias:          pci:v00001023d00002000sv*sd*bc02sc00i*
alias:          pci:v00001022d00002000sv*sd*bc*sc*i*
alias:          pci:v00001022d00002001sv*sd*bc*sc*i*
depends:        mii
supported:      yes
vermagic:       2.6.27.19-5-pae SMP mod_unload modversions 586
parm:           debug:pcnet32 debug level (int)
parm:           max_interrupt_work:pcnet32 maximum events handled per interrupt (int)
parm:           rx_copybreak:pcnet32 copy breakpoint for copy-only-tiny-frames (int)
parm:           tx_start_pt:pcnet32 transmit start point (0-3) (int)
parm:           pcnet32vlb:pcnet32 Vesa local bus (VLB) support (0/1) (int)
parm:           options:pcnet32 initial option setting(s) (0-15) (array of int)
parm:           full_duplex:pcnet32 full duplex setting(s) (1) (array of int)
parm:           homepna:pcnet32 mode for 79C978 cards 
                (1 for HomePNA, 0 for Ethernet, default Ethernet (array of int)

در مثال فوق ما اطلاعات مربوط به درایور کارت شبکه pcnet32 را بدست آوردیم . زمانی که با سخت افزار های متعددی کار می کنید شما بایستی چک کنید ببینید که از کدام نوع module برای آن سخت افزار استفاده می کنید . اگر آن module اپن سورس باشد خوشبختانه باید بگویم که می توانید در زمان بوجود آمدن مشکل (نه فیزیکی) برای آن سخت افزار امیدوار باشید زیرا جامعه Open Source و انجمن مربوطه اش به شما بخوبی کمک خواهند کرد . اگر آن module اپن سورس نباشد ممکن است ناسازگاری هایی بین کرنل لینوکس تان و آن module وجود داشته باشد در این گونه موارد به اصطلاح می گویند که کرنل tainted شده است.

Tainted Kernel کرنلی است که module یا ماژول هایی در خود به صورت Load شده دارد که توسط انجمن توسعه دهندگان کرنل گنو لینوکس کنترل و مدیریت نمی شود . برای پی بردن به اینکه کرنل سیستم عامل گنو لینوکس تان Tainted شده یا خیر محتوای فایل procsyskerneltainted را بایستی بررسی کنید اگر فایل tained را cat کردید و مشاهده کردید که عدد صفر در آن است پس کرنل گنو لینوکس شما Tained نشده است و Module های اختصاصی یک شرکت که انحصاری است Load نشده اند اما اگر عدد یک را مشاهده کردید کرنل شما Tained شده است و باید با یک ماژول Open Source جایگزین شود .

نویسنده : امیرحسین کریم پور

منبع : linux.tosinso.com

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی میباشد


امیرحسین کریم پور
امیرحسین کریم پور

مدیر ارشد توسینسو و متخصص سرویس های مایکروسافت

امیرحسین کریم پور ، مدیر ارشد توسینسو ، متخصص شبکه ، تخصص در حوزه سیستم عامل های کلاینت و سرور مایکروسافت و سرویس های مربوطه ، سیستم عامل لینوکس و... ، سابقه کار با سازمان ها و شرکت های مختلف در زمینه سرویس های مایکروسافت در قالب پروژه ، مشاوره و آموزش. علاقه مند به حوزه امنیت اطلاعات و تست نفوذ سنجی

نظرات