در شماره اول iproute2 بیشتر به معرفی آن و فرمانهای داخل آن پرداختیم. در صورتی که هر یک از Object های آن خود به یک مطلب نیاز دارند. در این مطلب سعی شده است تا کار اولیه با interface ها تشریح شود، شاید دلیلش این باشد که اولین مسأله در مورد Internetworking بعد از مفاهیم کار با ineterface ها باشد.
نکته: در تمام مثالها دو ماشین را فرض کردهایم که یکی بر روی VirtualBox و دیگری host ما میباشد. و از ۲ کارت شبکه آن استفاده میکنیم. به صورت پیشفرض یکی را برای ssh و دیگری را برای فرمان ip استفاده کردهایم.
برای شمارههای آتی هر قسمت از iproute2 را یک مطلب کردهام. به عنوان مثال ip rourte یک مطلب جدا، tc یک مطلب جدا و غیره….
۱. فرمان ip و address:
نکته: یکسری از ملزومات در شماره اول پرداخته شد، ولی بلاجبار در این شماره باید اشارهای به آنها بشود همچون مخفف سازی Object ها که بسیار ضروری میباشند.
فرمانهای زیر یکی میباشند:
1 2 3 4 5 |
# ip address # ip a # ip a show # ip addr show # ip a s |
خروجی همه آنها چنین است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:93:04:1d brd ff:ff:ff:ff:ff:ff inet 192.168.56.102/24 brd 192.168.56.255 scope global eth0 inet6 fe80::a00:27ff:fe93:41d/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:3f:a5:6f brd ff:ff:ff:ff:ff:ff inet 192.168.42.164/24 brd 192.168.42.255 scope global eth1 inet6 fe80::a00:27ff:fe3f:a56f/64 scope link valid_lft forever preferred_lft forever |
دو فرمان زیر کار را ساده ترمیکند:
1 2 3 4 5 6 7 8 9 |
$ ip a s eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:93:04:1d brd ff:ff:ff:ff:ff:ff inet 192.168.56.102/24 brd 192.168.56.255 scope global eth0 inet6 fe80::a00:27ff:fe93:41d/64 scope link valid_lft forever preferred_lft forever mohsen@parsix:~$ ip a s eth0 |grep inet inet 192.168.56.102/24 brd 192.168.56.255 scope global eth0 inet6 fe80::a00:27ff:fe93:41d/64 scope link |
در بالا فقط خواستیم با eth0 کار کنیم.
نکته: اگر درحال اسکریپت نویسی هستید و فقط IP address را نیاز دارید میتوانید اینگونه عمل نمایید:
1 2 |
$ ip -4 a s eth0 |grep ^inet |awk '{print $2}' |awk -F/ '{print $1}' 192.168.56.102 |
نکته: اگر نیاز است IPv6 را پیدا کنید کافیست 6- را به جای 4- به کار ببرید، همانند زیر:
1 2 |
# ip -6 a s eth0 |grep ^inet |awk '{print $2}' |awk -F/ '{print $1}' fe80::a00:27ff:fe93:41d |
برای تغییر ip address بهتر است در ابتدا ip قبلی آن را توسط فرمان زیر پاک نمایید:
1 |
# ip a del 192.168.56.102/24 dev eth0 |
البته میتوانید با خیال راحت dev مربوطه را flush کنید:
1 |
# ip a flush eth0 |
سپس به آن یک IP address بیافزایید:
1 |
# ip a add 192.168.42.23/24 dev eth0 brd 192.168.42.255 |
نکته: brd منظور آدرس broadcast میباشد.
نکته: dev مشخص کننده interface شما می باشد.
۲. فرمان ip و link:
هر دو فرمان زیر با هم برابرند:
1 2 |
$ ip link $ ip l |
و خروجی آنها چنین میشود:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ ip l 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 18:03:73:60:b4:4e brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 38:59:f9:42:98:33 brd ff:ff:ff:ff:ff:ff 4: enxeacc09265a23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether ea:cc:09:26:5a:23 brd ff:ff:ff:ff:ff:ff 5: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff 6: vboxnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 0a:00:27:00:00:01 brd ff:ff:ff:ff:ff:ff |
نکته: ip link به صورت پیشفرض تمام link ها را نمایش میدهد، به عنوان مثال در مثال بالا wlan0 مشکل دارد و میتوان با up آن را فیلتر کرد و هر چه device ی که up است را نمایش داد:
1 2 3 4 5 6 7 8 9 10 11 |
$ ip l sh up 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 18:03:73:60:b4:4e brd ff:ff:ff:ff:ff:ff 4: enxeacc09265a23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether ea:cc:09:26:5a:23 brd ff:ff:ff:ff:ff:ff 5: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff 6: vboxnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 0a:00:27:00:00:01 brd ff:ff:ff:ff:ff:ff |
نکته: ممکن است بخواهید به یک Device فیلتر کنید:
1 2 3 |
$ ip l show dev eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 08:00:27:3f:a5:6f brd ff:ff:ff:ff:ff:ff |
اگر به یاد دارید در net-tools میتوانستیم با دستور زیر statistics خوبی از interface مربوطه بگیریم:
1 2 3 |
# ifconfig -s eth0 Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 52 0 0 0 35 0 0 0 BMRU |
اما با ip link میتوان مقادیر بیشتری را دریافت کرد:
1 2 3 4 5 6 7 |
# ip -s link sh dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 08:00:27:93:04:1d brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 18547 57 0 0 0 0 TX: bytes packets errors dropped carrier collsns 6792 36 0 0 0 0 |
نکته: البته اگر از یک s- اضافی استفاده کنیم مقادیر خیلی بیشتر میشوند:
1 2 3 4 5 6 7 8 9 10 11 |
# ip -s -s link sh dev eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 08:00:27:93:04:1d brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 18547 57 0 0 0 0 RX errors: length crc frame fifo missed 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 6792 36 0 0 0 0 TX errors: aborted fifo window heartbeat 0 0 0 0 |
شاید برای شما خواننده عزیز تکراری باشد، اما سطوح خوانندگان این مطلب طیف میباشد و من مجبورم چند keyword زیر را برای فرمان بالا توضیح دهیم:
-
RX: تعداد Packet های Receive شده
-
TX: تعداد Packet های Transfer شده
-
overrun: طول Packet ی که بیشتر از حد انتظار باشد.
-
collsns: در یک زمان Collosion رخ داده است.
عموما نفوذکنندهها برای اینکه بفهمند وسط IDS وجود دارد یا خیر از on و off بودن PROMISC کارت شبکه میفهمند. بدین منظور شما میتوانید آن را تغییر دهید:
1 |
# ip link set dev eth0 promisc off |
فلاگهایی که شما میتوانید برای کارت شبکه خود تغییر دهید به شرح ذیل میباشند:
-
ARP
-
dynamic
-
multicast
-
allmulticast
-
trailers
برای تغییر mtu میتوانید بدین گونه رفتار نمایید:
1 |
# ip link set eth0 mtu 1500 |
برای تغییر دادن طول صف TX میتوانید بدین گونه رفتار نمایید:
1 |
# ip link set eth0 txqlen 1000 |
برای تغییر MAC address میتوان بدین گونه رفتار کرد:
1 |
# ip link set dev eth0 address 00:12:13:de:f2:53 |
۳. فرمان ip و maddr:
قبل از پرداختن به این Object باید سه نوع آدرسدهی در شبکه را تعریف نماییم:
-
unicast: مقصد پیام ارسالی را فقط به یک ماشین بخصوص میفرستد.
-
Broadcast: همه ماشینها پیام ارسالی را دریافت میکنند.
-
Multicast: فقط گروهی از ماشینهای مشخص پیام ارسالی را دریافت میکنند.
برای مشاهده آدرس multicast یک device میتوانید از هر دو فرمان زیر استفاده نمایید، خروجی فرقی نمیکند:
1 2 |
# ip ma show dev eth1 # ip ma l eth0 |
خروجی چنین میشود:
1 2 3 4 5 6 7 8 |
# ip ma l eth1 3: eth1 link 01:00:5e:00:00:01 link 33:33:00:00:00:01 link 33:33:ff:3f:a5:6f inet 224.0.0.1 inet6 ff02::1:ff3f:a56f inet6 ff02::1 |
برای اضافه کردن یک آدرس Multicast میتوان از فرمان زیر استفاده نمود:
1 |
# ip madd add 227.10.0.1 dev eth1 |
همانطور که میبینید خطی که دارای کلمه static است به آن اضافه شده است:
1 2 3 4 5 6 7 8 9 |
# ip m show dev eth1 3: eth1 link 01:00:5e:00:00:01 link 33:33:00:00:00:01 link 33:33:ff:3f:a5:6f link e3:0a:00:01:00:00 static inet 224.0.0.1 inet6 ff02::1:ff3f:a56f inet6 ff02::1 |
نکته: multicast هایی که با فرمان ip اضافه میکنیم همیشه کلمه static جلوی آنها دیده میشوند.
برای پاک کردن نیز باید از دستور زیر تبعیت نمود:
1 |
# ip madd del 227.10.0.1 dev eth0 |
۴. فرمان ip و neigh:
همانطور که به خاطر دارید، فرمانهای arp و rarp در بسته net-tools و فرمان ip در بسته iproute2 وجود دارند. اما در این بینابین یک فرمان که به شدت به کار میآید، چه با iproute2 کار کنید و چه با net-tools ، دم دستی شما به حساب میآید که در بسته iputils-arping وجود دارد. این فرمان arping نام دارد.
neigh کارآیی فرمان arp را داراست.
از فرمان arp گذر میکنیم، زیرا در net-tools قرار دارد هر چند، به چند مثال از آن نیاز داریم.
اما در ابتدا با arping شروع میکنیم که اساس کار یک sysadmin میباشد.
بیایید کمی فرمان زیر را بررسی کنیم:
1 2 3 4 5 |
# arping -I eth0 -c 1 192.168.42.129 ARPING 192.168.42.129 from 192.168.42.181 eth0 Unicast reply from 192.168.42.129 [CA:34:ED:0B:A7:71] 0.997ms Sent 1 probes (1 broadcast(s)) Received 1 response(s) |
نکته: همیشه interface واجب میباشد.
نکته: همیشه آدرس مقصد واجب میباشد.
نکته: با 1 c- میتوان تعداد ARPING ها را مشخص کرد. (مخفف count)
و بدین صورت به ARP Table شما اضافه میگردد.
نکته: فرمان بالا برای IP های مقصدی کار میکند که قابل دسترس باشند.
نکته: دو نسخه از فرمان arping وجود دارد که با syntax های متفاوت کار میکنند. یکی در بسته arping و دیگری در بستهای که بالاتر توضیح داده شد. ترجیج بر این است که هر دو مورد بررسی قرار گیرد.
وقت آن رسیده که بر ip neighbor فوکوس نماییم. چند فرمان زیر طبق قانون مخفف سازی همگی یکی هستند:
1 2 3 4 |
# ip neighbor # ip neigh # ip n # ip n |
نکته: در همه موارد بالا میتواند آخرین پارامتر show قرار گیرد که در مثالهای بعدی به آن خواهیم پرداخت.
کارکرد این Object بر روی ARP Table میباشد. ترجیح میدهم با مثالها پیش رویم تا بیشتر با آن آشنا شوید.
قبل از هر گونه مثالی، بهتر است رکنهای اساسی را در یک ARP Table را یادآورم شوم:
آدرس IP
آدرس MAC که به آن Link Layer Address نیز گفته میشود. (lladdr)
انواع state های هر row که در دستور IP با کلمه nud با آن برخورد میکنیم. nud خود مخفف Neighbour Unreachability Detection میباشد.
خیلی از موارد نیز وجود دارند که به عنوان جزییات در نظر گرفته میشوند که شما را به مستندات میسپاریم.(همانند زمان)
نکته: فرض را بر این گذاشتیم که شما با پروتکل (Address Resolution Protocol) که مخففا آن را ARP مینامیم آشنا هستید و از تعاریف گذشتیم.
بیایید چند مثال بزنیم تا به نکاتی برسیم، اگر از net-tools به خاطر داشته باشید میتوانستید کش arp را این چنین ببینید:
1 2 3 4 5 6 7 8 |
# arp -n Address HWtype HWaddress Flags Mask Iface 192.168.42.53 ether 08:00:27:93:b9:61 C eth0 192.168.42.52 (incomplete) eth0 192.168.42.51 ether 08:00:27:c7:b0:08 C eth0 192.168.42.19 ether 0a:00:27:00:00:00 C eth0 192.168.42.129 (incomplete) eth0 192.168.42.89 ether 0a:00:27:00:00:00 C eth0 |
معادل همان در iproute2 این چنین میشود:
1 2 3 4 5 6 7 |
# ip n 192.168.42.53 dev eth0 lladdr 08:00:27:93:b9:61 REACHABLE 192.168.42.52 dev eth0 FAILED 192.168.42.51 dev eth0 lladdr 08:00:27:c7:b0:08 REACHABLE 192.168.42.19 dev eth0 lladdr 0a:00:27:00:00:00 REACHABLE 192.168.42.129 dev eth0 FAILED 192.168.42.89 dev eth0 lladdr 0a:00:27:00:00:00 REACHABLE |
تجزیه تحلیل هر خط:
هر خط مربوط به یک MAC Address میباشد. ستون اول آدرس IPv4 یا IPv6 آن میباشد. سپس interface شبکه آن با dev blahblah همانند dev eth0 مشخص شده است. با lladdr آدرس سخت افزاری آن (MAC Address) مشخص میگردد. گزینه آخر nud میباشد.
نکته: خطوطی هستند که با FAILED مشخص شدهاند، اینها از سیستم پاک شدهاند ولی تاریخ انقضا آنها از بین نرفته است یا فعلاً قابل دسترس نیستند. درواقع در حال حاضر به گونهای مشکل دارند.
سه nud زیر خیلی مهم هستند:
-
REACHABLE : اینگونه آدرسها قابل دسترس میباشند.
-
STALE : اینگونه آدرسها معتبر ولی مشکوک میباشند. ip neigh نمیتواند آنها را تغییر دهد.
-
PERMANENT : اینگونه آدرسها معتبر بوده و فقط به صورت administratively قابل پاک کردن میباشند.
به چند مثال زیر دقت نمایید:
1 2 3 4 5 |
# ip n add to 192.168.42.59 lladdr 08:00:27:93:b9:59 nud perm dev eth0 # ip n 192.168.42.59 dev eth0 lladdr 08:00:27:93:b9:59 PERMANENT 192.168.42.129 dev eth0 FAILED 192.168.42.89 dev eth0 lladdr 0a:00:27:00:00:00 REACHABLE |
در بالا یک آدرس با یک MAC خود را به صورت permanent و با interface استفاده شده eth0 اضافه
کردیم. که با ip n نمایش داده شده است.
فرض کنید چنیدن interface دارید و میخواهید فیلتر کنید، اینگونه رفتار میکنید:
1 2 3 4 |
# ip n show dev eth0 192.168.42.59 lladdr 08:00:27:93:b9:59 PERMANENT 192.168.42.129 FAILED 192.168.42.89 lladdr 0a:00:27:00:00:00 REACHABLE |
برای فیلتر کردن بین nud ها هم اینگونه میتوان رفتار کرد:
1 2 |
# ip n show nud permanent 192.168.42.59 dev eth0 lladdr 08:00:27:93:b9:59 PERMANENT |
همچنین میتوان هر دو را با هم ترکیب کرد:
1 2 |
# ip n show nud permanent dev eth0 192.168.42.59 lladdr 08:00:27:93:b9:59 PERMANENT |
برای اطلاعات بیشتر همانند قبلتر (link)ها از فرمان زیر استفاده میکنیم:
1 2 3 4 |
ip -s -s n 192.168.42.59 dev eth0 lladdr 08:00:27:93:b9:59 used 466/466/466 probes 0 PERMANENT 192.168.42.129 dev eth0 ref 2 used 110/79335/107 probes 6 FAILED 192.168.42.89 dev eth0 lladdr 0a:00:27:00:00:00 ref 5 used 18/0/13 probes 1 REACHABLE |
میتوان برای پاک کردن یک interface خاص از جدول از فرمان زیر استفاده کرد:
1 |
# ip n flush dev eth0 |
یا :
1 |
# ip n del to 192.168.42.50 dev eth0 |
البته فرمانهای replace و change نیز وجود دارند که به خود خواننده واگذار میشوند.
۵. فرمان ip ntable:
ntable مخصوص پیکربندی جدول مقادیر arp میباشد. بر دو نوع است:
-
ndisc_cache : که مخصوص IPv6 است.
-
arp_cache : که مخصوص IPv4 است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ip nt show dev eth0 inet6 ndisc_cache dev eth0 refcnt 4 reachable 28064 base_reachable 30000 retrans 1000 gc_stale 60000 delay_probe 5000 queue 31 app_probes 0 ucast_probes 3 mcast_probes 3 anycast_delay 1000 proxy_delay 800 proxy_queue 64 locktime 0 inet arp_cache dev eth0 refcnt 5 reachable 20384 base_reachable 30000 retrans 1000 gc_stale 60000 delay_probe 5000 queue 31 app_probes 0 ucast_probes 3 mcast_probes 3 anycast_delay 1000 proxy_delay 800 proxy_queue 64 locktime 1000 |
با دستور زیر میتوان مقادیر IPv4 را فیلتر کرد:
1 2 3 4 5 6 7 |
# ip ntable show dev eth0 name arp_cache inet arp_cache dev eth0 refcnt 5 reachable 31516 base_reachable 30000 retrans 1000 gc_stale 60000 delay_probe 5000 queue 31 app_probes 0 ucast_probes 3 mcast_probes 3 anycast_delay 1000 proxy_delay 800 proxy_queue 64 locktime 1000 |
با فرمان زیر به سادگی میتوان پارامترهای neighbor را تغییر داد:
1 |
# ip ntable change dev eth0 retrans 3000 name arp_cache |
همانطور که دیدید، ratrans را از ۱۰۰۰ به ۳۰۰۰ تغییر دادیم.
همانطور که دیدید، بعضی از Object ها گفته نشد و قرار است و برای بعضی از Object ها مثل route مطلبی جدا بگذارم. منتظر مطالب بعدی iproute باشید.
بسیار عالی و کاربردی. ممنون