مانیتور کردن دستگاه های بی سیم موجود با MikroTik ROS

مسلما RouterOS یکی از کاراترین و جذاب ترین! سیستم عامل های شبکه هست. ابزار هایی که در ROS در اختیار کاربر قرار داده شده، بعضا غافل گیر کننده هستند! برای شبکه بیسیم ابزارهای مختلفی مانند sniffer،snooper ، spectral scan و … ابزار های مهمی هستند که در تب رابط wireless دیده می شوند. به نظرم snooper یکی از ابزارهای مهم در wifi router های میکروتیک هست. البته شاید به طور روزمره برای کانفیگ شبکه استفاده نشود ولی در نوع خودش جالب هست. در زیر توضیح خواهم داد که این ابزار، یک ابزار بسیار ساده هست که ممکن هست همه یک بار روشن خاموشش کرده باشن حداقل! در این نوشتار میخواهیم با استفاده از یک کد، ترافیک عبوری کلیه دستگاه های وای فای درون محیط را بررسی کنیم. Snooper : در snooper سعی داریم ترافیکی که از کلیه دستگاه های محیط ارسال می شوند را capture کنیم ولی در sniffer فقط داده های مربوط به دستگاه هایی که به شبکه متصل هستند را می توانیم capture کنیم. البته باید اشاره کرد که جزییات بسته ها(مانند آنچه که در wireshark می بینیم) در هر دو حالت مشخص نیست و صرفا موارد کلی مانند ادرس فرستنده یا قدرت سیگنال دریافتی قابل مشاهده می باشد(چنانچه نیاز به بررسی دقیق محتوی بسته هستیم یک حالت مشابه sniffer با عنوان packet sniffer در منو Tools سیستم عامل تعبیه شده است. با استفاده از روش که در این لینک مشخص شده می توانید ROS را به wireshark متصل کنید. ).درحالت snooper برای اینکه بتوانیم تمامی سیگنال های محیط را جمع آوری کنیم، بایستی interface شبکه در حالت monitor قرار بگیرد. متاسفانه در ROS هنوز این قابلیت وجود ندارد که یک رابط Wireless هم در حالت monitor و همزمان در حالتی مانندAp(ap bridge) قرار بگیرد(البته در نسخه های جدید ظاهرا امکان اینکه به طور همزمان بتواند هم در حالت station و هم در حالت ap قرار بگیرد تعبیه شده است.). بنابراین به محض اینکه snooper روشن شود، حالت رابط بی سیم عوض شده و اگر مثلا ap باشد تمامی کلاینت هایی که به دستگاه متصل هستند قطع خواهند شد و پس از خاموش شدن snooper به حالت قبل بر می گردد. من چون در محیط لینوکس هستم با رابط وب ROS کار می کنم. مسیر زیر را طی کنید:Wireless → Select the interface → Snooperمحیط snooper همانطور که مشاهده می کنید هنوز شروع به کار نکردیم و اطلاعاتی قابل مشاهده نیست. در واقع فرآیند پیچیده ای را نمی بینیم. فقط چند مورد تنظیمات ساده در Settings هست که به آن خواهیم پرداخت . دکمه Start را فشار می دهیم.دستگاه های شناخته شده در محیط فکر می کنم فیلد های مشخص و نیاز به توضیح ندارند. به سراغ تنظیمات برویم. برای تغییر تنظیمات باید Snooper را خاموش کنید.تنظیمات snooper متاسفانه در مورد این فیلد ها من توضیحات دقیقی جایی پیدا نکردم. اگر کسی پیدا کرد حتما لینک آن را در نظرات بگذارد! ولی به طور کلی برای monitor کردن دستگاه های کنار بایستی بین کانال های مختلف جابجا شد و در هر کانال برای مدتی ترافیک رد و بدل شده را monitor کرد. این دو مورد مربوط به فیلد های اول و دوم است. اینکه مقدار Channel time دقیقا چقدر باشد، مشخص نشده است. ولی مقداری که به صورت پیش فرض است به نظر بنده مناسب هست. اگر این مقدار خیلی زیاد باشد دستگاه بین کانال های مختلف دیرتر جابجا می شود و احتمال دارد بعضی ترافیک ها از دست روند و دیده نشوند و درنتیجه در خروجی مشاهده نخواهد شد. اگر این مقدار خیلی کم باشد دستگاه در مجموع زمان زیادی را درگیر جابجایی بین کانال های می شود و زمان کافی هم نخواهد داشت که کانال را دقیق بررسی کند و ممکن است باز هم ترافیک از دست رود. من مقدار ۲۰۰۰ و ۲۰۰ و ۲۰ را تست کردم با توجه به خروجی snooper مشخص شد همان مقدار 200 بهتر عمل میکند و دستگاه ها و ترافیک بیشتری در محیط را پیدا می شد. حال که ساختار کلی خود snooper را توضیح دادیم نوبت آن است که از طریق کد با snooper ارتباط برقرار کنیم و داده های را دریافت کنیم. برای اینکار ابتدا بایستی امکان ارتباط ssh بدون وارد کردن رمز را برقرار نماییم. خود ssh پیش فرض روی ROS ظاهرا روشن هست. برای دستگاه خود یک ip ست کنید. البته به احتمال زیاد این کار را قبلا کردید!‌ برای اینکار بایستی از طریق مسیر زیر اقدام نمایید :IP → Addresses به طور مثال در مسیر زیر روی دستگاه من ip ۱۹۲.۱۶۸.۵.۳۶ مشخص شده است.تعیین ادرس ip حال بایستی ssh-key مربوط به سیستم خودمان (کامپیوتر) را درون روتر اضافه کنیم، تا برای اجرا کد روی کامپیوتر خودمان هر دفعه مجبور به زدن پسورد نباشیم. من از لینوکس استفاده می کنم بنابراین دستورات زیر برای لینوکس هست! اگر اصرار داشتید که از ویندوز استفاده کنید شاید این لینک بتواند به شما کمک کند. ابتدا با دستور زیر ssh-key را ایجاد می کنیم :ssh-keygen -t rsaتمامی فیلد ها را خالی رها کنید و فقط enter بزنید ! بررسی کنید فایل id_rsa.pub در مسیر زیر اینجا شده باشد:~/.sshحال بایستی این ssh-key را به روتر منتقل کنیم. چون سیستم عامل روتر خود linux نیست باید دستی اینکار رو بکنیم. برای اینکار وارد مسیر زیر شوید:~/.sshحال به دستگاه ftp میزنیم،با استفاده از نام کاربری (برای من admin هست) و پسورد روتر، وارد شوید . دستور زیر را بزنید تا id_rsa.pub به حافظه روتر منتقل شود . سپس با دستور exit خارج شوید:ftp 192.168.5.36 put id_rsa.pub exitبررسی کنید که فایل مد نظر به قسمت file های روتر اضافه شده باشد:حال درون روتر ترمینال را باز نمایید. دستور زیر را بزنید :user ssh-keys import public-key-file=id_rsa.pub user=adminبه جای admin ، نام کاربری خود را وارد نمایید (به صورت پیش فرض admin هست.)حال درون کامپیوتر خود به روتر ssh بزنید تا ببینید کار میکند یا خیر :ssh admin@192.168.5.36برای اولین بار از شما اجازه دسترسی را می گیرد و با زدن yes برای دفعات بعد این مشکل را نخواهید داشت. نکته : چنانچه ssh-key اشتباهی ساختید، فایل id_rsa.pub را پاک کنید. اگر قبلا با ssh و با زدن پسورد به دستگاه متصل شده اید ابتدا تنظیمات قبلی را باید پاک نمایید(گاهی پیش می آید که نام کاربری و پسورد را درست می زنید ولی ssh وصل نمی شود. در این حالت ssh-key اشتباه به دستگاه اضافه شده است یا اینکه سیستم شما با تنظیمات قبلی در حال کار هست.). اگر اخیرا این ssh-key رابه دستگاه اضافه کرده اید تنظیمات مربوطه خط اخر فایل زیر هست که می توانید آن را پاک نمایید:~/.ssh/known_hosts برای کار با snooper از طریق ترمینال دستور flat-snoop دستور بهتری از خود snoop هست. دستور زیر را اجرا نمایید : interface wireless snooper flat-snoop wlan1من کد زیر را با پایتون زدم که به روتر ssh می زند و چنانچه داده جدیدی (ترافیک یا بسته) جدید مشاهده شود آنرا به عنوان بسته جدید بررسی می کند. کد را روی github گذاشتم.در واقع در این کد ما درون تابع run_continuously به روتر یک بار ssh میزنیم و هر موقع داده جدید(یک خط داده) بیاید از طریق دستور yeild انرا به تابع اصلی باز می گردانیم. داده های یک بسته در یک پاراگراف قرار دارند. بنابراین بعد از شناسایی پاراگراف و دریافت اخرین خط پاراگراف که یک خط خالی هست. درون بسته (پاراگراف) بررسی می کنیم چنانچه بسته مد نظر مربوط به آدرس mac با مقدار address بود. مقدار قدرت سیگنال دریافتی را برمی گرداند. خروجی این کد در زیر قابل مشاهده است : همانطور که مشاهده می کنید می توان از فیلد های دیگر بسته نیز استفاده نمود. مشکلات :۱. فکر می کنم با بسته شدن کد پایتون ارتباط ssh باز می ماند و انگار که snooper خاموش نمی شود. تابع exit_handler رو برای همین کار گذاشته بودم، ولی نتوستم مشکل را حل کنم. ۲. من در واقع این کد را بررسی قدرت سیگنال های دریافتی از دستگاه های نزدیک نوشتم. کد درست کار می کرد، ولی دستگاه MikroTik (RB951) مقدار RSS درستی به نظرم نشان نمی داد. مثلا وقتی دستگاه به روتر نزدیک بود خیلی پیش می آمد rss کم نشان داده می شد و یا بلعکس. در واقع مقدار rss بعضا بی دلیل به مقدار خیلی زیاد، کم و زیاد می شد! اگر کسی دلیل این امر اطلاع داشت به بنده خبر بده !