کرنل لینوکس فرای ۲ Routing Table اصلی local و main تا ۲۵۲ جدول را پشتیبانی مینماید. علاوه بر route های سنتی، میتوان از RPDB که مخفف Routing Policy Database است استفاده نمود که کار باید به جای استفاده از دستور ip route برای آن از ip rule استفاده نمود. سیستم RPDB کار را خیلی آسان مینماید. فعلاً با ip route آشنا میشویم که اساس کار است.
هر Routing Table شامل تعدادی entry میباشد که هر Entry شامل موارد زیر میباشد:
-
آدرس مقصد; یک آدرس Network یا Host
-
ToS
-
scope
-
خروجی interface : خروجی که route مذکور باید از آن خارج شود.
هر Table با یک عدد مشخص میشود به فایل زیر در etc/iproute2/rt_tables/ دقت نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 |
$ cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep |
در دو صورت میتوانید از table ها استفاده نمایید:
-
اسم یک table
-
ID یک table
به مثالهای زیر توجه کنید:
1 2 |
# ip route show table main # ip route show table 254 |
هر دو معادل هستند و یک خروجی میدهند:
1 2 3 4 |
default via 192.168.42.129 dev enx0253343a3532 default dev eth0 scope link metric 1002 169.254.0.0/16 dev eth0 proto kernel scope link src 169.254.7.96 192.168.42.0/24 dev enx0253343a3532 proto kernel scope link src 192.168.42.173 |
نکته: enx0253343a3532 پورت interface موبایل میباشد که از طریق USB به کامپیوتر وصل شده است و اینترنت به اشتراک گذاشته است.
نکته: خیلی از موارد در نسخههای خاصی از کرنل به آن اضافه گردید. حتماً از (8)ip-route استفاده نمایید.
۱. گرفتن query با ip route
برای شروع به چند دستور زیر دقت کنید که همگی یکی هستند:
1 2 3 4 5 6 |
# ip r # ip route # ip route list # ip route show # ip route show table 254 # ip route show table main |
نکته: همانطور که دقت کردید اگر جدولی را مشخص نکنید به صورت پیشفرض بنا را بر main میگذارد.
خروجی همه دستورات بالا خروجی زیر میباشد:
1 2 3 4 |
default via 192.168.42.129 dev enxfa618e570c82 default dev eth0 scope link metric 1002 169.254.0.0/16 dev eth0 proto kernel scope link src 169.254.7.96 192.168.42.0/24 dev enxfa618e570c82 proto kernel scope link src 192.168.42.202 |
نکته: اگر به خاطر داشته باشید، اگر از دستور route در net-tools استفاده میکردید، برای شما کلمهای به نام gateway ارمغان گذاشته است. اما همان کلمه در iproute2 به default تغییر کرده است. در هر دو بسته Default Route به صورت زیر مشخص میشود:
-
با net-tool :
-
با iproute2:
1 2 |
# route -n |sed '3!d' 0.0.0.0 192.168.42.129 0.0.0.0 UG 0 0 0 enxfa618e570c82 |
1 2 |
# ip r |sed '1!d' default via 192.168.42.129 dev enxfa618e570c82 |
نکته: اما default های دیگری نیز داریم که در جلوتر توضیح میدهیم.(دیگر آنها Default Gateway نیستند.)
نکته: همانطور که میدانید در هر ماشین یک Default Gateway نمیتوان تعریف کرد. وقتی تعریف گردد، کل سیستم Routing شما به هم می ریزد.
ممکن دستور show در سرورهای کاربردی خروجیهای زیادی به شما نشان دهد،در اینحالت grep نیز کارساز نمیباشد. خود ip route چندین حالت query گرفتن را برای شما میسر کرده است. به حالات زیر دقت نمایید:
1 2 |
# ip route show to 192.168.1.0/24 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.7 |
بعد از کلمه show ممکن است ۲ کلمه to یا from پدیدار گردد که که اگر to باشد باید dst آدرس مشخص شود و اگر from، باید src آدرس مشخص شود.
بعد از آنها ۳ کلمه اختیاری زیر را نیز میتوانید به برید:
-
root
-
exact
-
match
نکته: هر چند کار با show طول و تفضیل زیادی دارد ولی ترجیح میدهم، مطالب مورد نیاز را بگویم تا در یک مورد عمیق شوم.
کلمه کاربردی دیگری برای query گرفتن به نام get نیز وجود دارد. به مثال زیر دقت نمایید:
1 2 3 |
# ip route get 192.168.42.0 broadcast 192.168.42.0 dev vboxnet0 src 192.168.42.89 cache <local,brd> |
نکته: یک سؤال جدی پیش میاید: کش routing table چیست؟ کش جدای از ۲۵۲ table نام برده شده نگهداری میشود. دستکاری Routing Table ها با تأخیر بر روی cache نوشته میشود. اگر میخواهید کش را پاک کنید باید از فرمان زیر استفاده نمایید:
1 |
# ip route flush cache |
فرمان فوق موجب میشود تا یکبار کش پاک شود و سریع با route های جدید جایگزین شود.
نکته: کش routing table را ممکن است در بعضی از سیستمها با forwarding information base (FIB) بشناسند.
چگونه routing table را ذخیره و بازیابی کنیم:
بدین منظور از فرمانهای زیر استفاده میکنیم:
1 2 3 |
# ip route save 1> rt.dump # ip route add 192.168.1.0/24 dev eth0 # ip route restore < rt.dump |
به فرمانهای بالا دقت نمایید، خط اول همیشه باید با STDIN مشخص شود. در مورد خط دوم برایتان به صورت متغیر نوشتم که اگر default gateway دارید با خطای معروف زیر مواجه نشوید:
1 |
RTNETLINK answers: Network is unreachable |
پس شما مجبورید یکبار دستی آدرس شبکه default gateway خود را قبل از restore وارد نمایید. سپس با فرمان سوم restore نمایید.
۲. انواع route type ها:
قبل از هر گونه دستکاری باید با انواع Entry در Routing Table ها آشنا شویم:
-
unicast : اکثر route ها در routing table به عنوان unicast ذخیره میشوند. هر گونه route که دارای مقصد شبکه و یا هاست خاصی باشد، توصیف کننده یک مسیر به مقصد میباشد. حتی route های پیچیده همانند nexthop دارای unicast میباشند. ممکن است در CMD کلمه unicast مشاهده نشود. ولی آن route به عنوان unicast در نظر گرفته میشود. یک مثال بارز اضافه کردن Default Gateway میباشد که یک route از نوع unicast است. به مثالهای زیر توجه نمایید:
-
broadcast : این نوع route فقط برای Link Layer استفاده میشود. و فقط در جدول local تعریف میشود. به مثالهای زیر توجه نمایید:
-
local : زمانی که IP آدرسی به یک interface اضافه میگردد، کرنل یک route در جدول local برای آن در نظر میگیرد. این بدان معناست که IP ها به صورت محلی میزبان IP های دیگر میباشند. به مثالهای زیر توجه نمایید:
-
nat : وقتی کاربر سعی میکند یک stateless NAT پیکربندی نماید، کرنل یک entry برای آن در routing table ثبت میکند. به مثالهای زیر توجه نمایید:
-
unreachable : هنگامی که یک درخواست برای تصمیم Routing یک مقصد با نوع مقصد unreachable بر میگرداند، یک ICMP Unreachable تولید میگردد و به آدرس مبدأ فرستاده میشود. به مثالهای زیر توجه نمایید:
-
prohibit : هنگامی که یک درخواست برای تصمیم Routing یک مقصد با نوع مقصد prohibit بر میگرداند، یک ICMP prohibit تولید میگردد و به آدرس مبدأ فرستاده میشود. فرق prohibit و blakhole همانند reject و drop در iptables است. به مثالهای زیر توجه نمایید:
-
blackhole : اگر یک پکت با این route type رسید از فرستادن آن صرفنظر میشود و هیچ گونه ICMP message نیز فرستاده نمیشود. به مثالهای زیر توجه نمایید:
-
throw : این نوع route type راه مناسبی است تا جلوی lookup شدن route گرفته شود. به مثالهای زیر توجه نمایید:
1 2 3 4 |
# ip route add unicast 192.168.0.0/24 via 192.168.101.5 # ip route add default via 190.4.250.2 # ip route add unicast default via 201.5.21.19 # ip route add 10.40.0.0/16 via 10.7.7.25 |
1 2 |
# ip route add table local broadcast 10.10.20.255 dev eth2 proto kernel scope link src 10.10.40.47 # ip route add table local broadcast 192.168.43.31 dev eth3 proto kernel scope link src 192.168.42.15 |
1 2 |
# ip route add table local local 10.10.20.64 dev eth2 proto kernel scope host src 10.10.40.47 # ip route add table local local 192.168.43.12 dev eth3 proto kernel scope host src 192.168.42.15 |
1 2 |
# ip route add nat 193.7.255.184 via 172.16.80.184 # ip route add nat 10.40.0.0/16 via 172.43.0.0 |
1 2 3 |
# ip route add unreachable 172.16.82.18 # ip route add unreachable 192.168.1.0/26 # ip route add unreachable 209.10.24.51 |
1 2 3 |
# ip route add prohibit 172.16.82.18 # ip route add prohibit 192.168.1.0/26 # ip route add prohibit 209.10.24.51 |
1 2 3 |
# ip route add blackhole default # ip route add blackhole 202.143.170.0/24 # ip route add blackhole 64.65.64.0/18 |
1 2 3 |
# ip route add throw default # ip route add throw 10.79.0.0/16 # ip route add throw 172.16.0.0/12 |
۳. بررسی یک سناریوی واقعی
فرض بر این است که دو کامپیوتر با دو subnet مختلف به یک Gateway متصل میباشند.
صورت مسئله: قرار است این دو همدیگر را watch نمایند.
۱.۳ فرضیات مسئله :
دو range :
-
172.16.0.0/12
-
10.0.0.0/8
Interface های روی gatewaye:
-
vboxnet0 : برای رنج ۱۰
-
vboxnet1 : برای رنج ۱۷۲
برای هر کدام از interface های *vboxnet برای خوانا شدن آخر IP آن را ۱.۱ میگذاریم.
دو کامپیوتر از هر رنج انتخاب و IP آخر آن را ۲۰ میدهیم مثلا:
-
172.16.1.20
-
10.10.1.20
در ضمن برای هر کدام default gateway را ۱.۱ مشخص میکنیم.
۲.۳ دست به کار شویم:
اگر بخواهیم از طرف gw به هر subnet یک ping بفرستیم با ICMP زیر مواجه میشویم:
1 2 3 4 5 |
# ping 10.10.1.20 PING 10.10.1.20 (10.10.1.20) 56(84) bytes of data. From 10.10.1.1 icmp_seq=1 Destination Host Unreachable From 10.10.1.1 icmp_seq=2 Destination Host Unreachable From 10.10.1.1 icmp_seq=3 Destination Host Unreachable |
دلیلش ساده است، gw ما به جایی دیگر route شده است.
راه کار:
در net-tools با فرمت زیر آشنا بودید:
1 2 |
route add -{net|host} $target gw $redirect dev IF route add -net 192.168.1.0/24 gw 172.16.1.1 dev eth0 |
در خط بالا یک route به Routing Table اضافه شد که میگوید اگر هر بستهای از شبکه فوق رسید، به آدرس ۱۷۲.۱۶.۱.۱ بر روی eth0 منتقل شود.
معادل iprout2 خط بالا چنین میشود:
1 |
# ip route add 192.168.1.0/24 via 172.16.1.1 dev eth0 |
حال که مسأله روشن شد به اضافه کردن route ها میپردازیم:
1 2 |
# ip r add 10.0.0.0/8 via 172.16.1.1 dev vboxnet1 # ip r add 172.16.0.0/12 via 10.10.1.1 dev vboxnet0 |
همچنین باید در هر طرف route شبکه مقابل را نیز افزود:
1 2 |
# ip r add 10.0.0.0/8 eth1 ###at 172.16.1.20 # ip r add 172.16.0.0/12 eth0 ###at 10.10.1.20 |
نکته: وقتی DHCP Server دارید، باید route های مربوط به client ها را درون آن بگذارید تا release شوند. زیرا دستی دادنشان برای شبکههای بزرگ سخت است.
حالا از هر دو طرفین میتوان شبکه طرف مقابل را watch کرد…!