routing_ip_forwarding

Routing و IP forwarding در لینوکس

Routing  چیست:

مسیر یابی بین شبکه های مختلف و هدایت packet  ها یا بسته های دریافتی از یک شبکه به شبکه ای دیگر است. به عنوان نمونه ارسال ایمیل یا مشاهده یک وب سایت از طریق ارسال بسته هایی در بستر شبکه انجام می شود. این که این بسته ها چگونه یا در واقع از چه مسیری به مقصد برسد با استفاده از routing  صورت می پذیرد.

یک سیستم متصل به شبکه، وقتی میخواهد اتصالی به IP دیگرایجاد کند، ابتدا از طریق routing table خود بررسی میکند که آیا IP مقصد با سیستم در یک شبکه قرار دارند یا خیر. در صورتی که در یک شبکه قرار داشته باشند به صورت مستقیم با مقصد ارتباط برقرار میکند در غیر این صورت  بسته ها را از طریق Default route به gateway خود ( یا روتر) ارسال میکند. روتر بر اساس جدولی مشخص می کند که آیا مسیر ارتباطی ای به IP مورد نظر کاربر دارد یا خیر. در صورتی که مسیری داشته باشد، بسته را مستقیم از طریق مسیر مشخص شده ارسال میکند در غیر این صورت روتر نیز بسته را از طریق default route  مشخص شده برای آن به مسیر بعدی هدایت میکند. این فرایند تا جایی ادامه می یابد که بسته به مسیر مورد نظر تحویل شود.

در دنیای شبکه دو نوع routing  وجود دارد.

  • Static: دراین نوع routing حذف و اضافه کردن route  ها به صورت دستی انجام می شود.
  • Dynamic: در این نوع routing روتر با کمک پروتکل های dynamic routing مانند OSPF، EIGRP، RIP دائما بر اساس اطلاعات دریافتی از سایر روتر های همسایه، routing table  خود را به روز نگه دارد و از تغییرات و حذف و اضافه شدن network های جدید با خبر شود.

 

مشاهده routing table در لینوکس:

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

~]#      netstat –r

~]#      route

دستورات بالا خروجی تقریبا مشابه و مانند شکل زیر را نمایش میدهند

route_netstat_output

برخی از ستون ها در شکل بالا به قرار زیر هستند:

  • Destination: بیانگر شبکه مقصد است.
  • Gateway: بیانگر gateway برای رسیدن به آن شبکه است.
  • :Genmask بیانگر netmask آن شبکه است.
  • Flag: مقدار نمایش داده شده در این ستون بیانگر وضعیت route است که در شکل بالا
    • مقدار U در این مثال به معنی این است که Route مورد نظر Up یا فعال است.
    • مقدار UG به معنای این است که این route علاوه بر این که فعال است، باید از طریق gateway  ارسال شود.
  • Iface: معرفی کننده اینتفریسی است که در این route نقش دارد است.

هنگامی که سیستم عامل قصد داشته باشد به IP ای بسته ای ارسال کند، ابتدا به این جدول مراجعه میکند. این مثال خط اول default route  نام دارد. همانطور که در بالا اشاره شد کاربرد default route برای هنگامی است که IP مقصد یا در این جدول نباشد، یا با مبدا در یک شبکه نباشند.

به عنوان نمونه اگر سیستم قصد ارتباط با آدرس 192.169.200.100 را داشته باشد. چون با خط سوم هماهنگ میشود و flag آن برابر با U است  سیستم متوجه میشود که با این آدرس در یک شبکه است و ارتباط مستقیم دارد.

حال اگر سیستم قصد داشته باشد با آدرس 192.168.100.20 ارتباط برقرار کند، چون آدرس شبکه مقصد با هیچکدام از خطوط routing table  به جز default route همخوان نخواهد شد، از طریق Default route که دارای Flag برابر با UG است بسته ها به سمت gateway  هدابت می شوند.

حذف و اضافه route:

برای اضافه کردن یا حذف route  در لینوکس از دو دستور به شکل زیر میتوان استفاده کرد.

route add –net 192.168.199.0 netmask 255.255.255.0 dev ens33

ip route add 192.168.199.0/24 dev ens33

برای حذف یک route  نیز میتوان از همان دستورات بالا استفاده کرد با این تفاوت که به جای add از del  استفاده خواهد شد.

route del –net 192.168.199.0 netmask 255.255.255.0 dev ens33

یا

ip route del 192.168.199.0/24 dev ens33

نکته:

در صورتی که دو یا چند route  همزمان برای یک network در routing table  وجود داشته باشد، از الگوریتمی به نام longest prefix match استفاده می شود. به عنوان نمونه در صورتی که دو route  به برای 24/192.168.200.0  و 25/192.168.200.0 وجود داشته باشد، آن خطی که prefix  بزرگتری داشته باشد، (25/192.168.200.0)  در الویت قرار میگیرد.

Policy routing  چیست؟

در شرایطی ممکن است نیاز باشد packet  ها بر اساس source IP به مثصدی هدایت شوند.  در این صورت میتوانیم از بیش از یک touting table  استفاده کرد.

به عنوان مثال یکی از موارد مورد استفاده از policy routing  زمانی است که در سیستمی دارای دو کارت شبکه باشیم و هر کارت شبکه نیز دارای gateway  خود باشد. در حالت عادی سیستم نمیتواند بیش از یک gateway داشته باشد.در نتیجه ترافیک کارت شبکه دوم هیچگاه به مقصد نمی رسد.

فرض کنیم سیستمی دارای دو کارت شبکه و با IP هایی به قرار زیر هستند.

ens33:

192.168.1.10/24 gateway 192.168.1.1

ens34:

10.20.30.2/24 gateway 10.20.30.1

برای ایجاد routing table   مخصوص هر کارت شبکه ابتدا در فایل /etc/iproute2/rt_tables به ازای هر اینتفیس یک table ایجاد مینمائیم.

echo 100 tblens33 > >> /etc/iproute2/rt_tables

echo 101 tblens34 >> /etc/iproute2/rt_tables

سپس به هر جدول gateway آن را معرفی میکنیم.

ip route add default via  192.168.1.1 table tblens33

ip route add default via 10.20.30.1 table  tbleens34

بعد از معرفی gateway می بایست default route هر کدام را نیز معرفی نمائیم.

ip rule add from 192.168.1.10  table tblens33

ip rule add from 10.20.30.2 table tblens34

در نهایت مشخص میکنیم که ترافیک خروجی هر کارت شبکه بر اساس کدام routing table ارسال شود.

ip route add  192.168.1.0/24  dev ens33 src 192.168.1.10 table tblens33

ip route add 10.20.30.0/24 dev ens34 src 10.20.30.2 table tblens34

IP forwarding  چیست؟

بعضا فعال سازی IP Forwarding  یا routing  به اشتباه با یک مفهوم عنوان می شوند اما در عمل IP forwarding  یکی از ویژگی های کرنل برای هدایت بسته ها از شبکه ای به شبکه ای دیگر است به عنوان مثال وقتی که بخواهیم از سیستم عامل به عنوان روتر استفاده کنیم، برای این که سیستم عامل قابلت ارسال پکت های ورودی از یک کارت شبکه به کارت شبکه دیگر خود را داشته باشد، باید این ویژگی در آن فعال شود.  IP forwarding  بر اساس اطلاعات routing table  تصمیم میگیرد که ترافیک ورودی از یک اینترفیس به کدام اینتفریس دیگر هدایت شود.

در نتیجه میتوان گفت IP forwarding  به تنهایی نمی تواند به عنوان routing  در نظر گرفته شود و فقط یکی از ملزومات پیکر بندی سیستم به عنوان روتر است. این ویژگی به دلایل امنیتی و به صورت پیشفرض در کرنل غیر فعال است.

مشاهده وضعیت IP forwarding  از طریق روش های زیر ممکن است.

sysctl net.ipv4.ip_forward

IP Forwarding

 

 

cat /proc/sys/net/ipv4/ip_forward

proc_ip_forward

 

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

sysctl -w net.ipv4.ip_forward=1

sysctl_ip_forward

 

یا

echo 0 > /proc/sys/net/ipv4/ip_forward

هر دو دستور بالا مقدار “1” را در فایل /proc/sys/net/ipv4/ip_forward می نویسند و عملکرد یکسانی دارند. باید توجه داشت که این تغییرات دائمی نیستند و با ریبوت شدن سرور مجددا به قدار پیش فرض باز میگردد.

رای این که این تغییرات به صورت دائمی تغییر کنند باید خط زیر به فایل  /etc/sysctl.conf اضافه شود.

net.ipv4.ip_forward = 0

نتیجه گیری:

در این مستند به معرفی خلاصه مفهوم routing ، برخی از دستورات کاربردی آن، policy routing و نحوه ایجاد routing table  مجزا برای هر کارت شبکه و همچنین معرفی IP forwarding و نقش ان در انتقال ترافیک بین اینترفیس ها و هم چنین نحوه فعال سازی آنها پرداخته شد.

 

حامد
اشتراک دانش رو دوست دارم برای همین سعی میکنم مطالب آموزشی ای تهیه شده دارای جزئیات خوب و به صورت کامل تهیه بشوند.استفاده از مطالب این سایت در هر جایی بلا مانع می باشد. اما ذکر منبع رفتاری حرفه ای و اخلاقی خواهد بود. من را از نظرات خود مطلع سازید. و اگر میخواهید در مورد من بیشتر بدانید سری به صفحه "در باره من" بزنید.