نمایش نتایج: از شماره 1 تا 2 از مجموع 2
سپاس ها 1سپاس

موضوع: آموزش نحوه مانیتور کردن لاگ ها و ارسال ایمیل، SMS یا پیام تلگرام

  
  1. #1
    نام حقيقي: ali

    عضو عادی
    تاریخ عضویت
    Jun 2010
    محل سکونت
    mashhad
    نوشته
    605
    سپاسگزاری شده
    481
    سپاسگزاری کرده
    57

    آموزش نحوه مانیتور کردن لاگ ها و ارسال ایمیل، SMS یا پیام تلگرام

    درود خدمت دوستان عزیزم

    در ویکی میکروتیک توضیحاتی نوشته شده که به کمک آن می توانیم بصورت خودکار،
    لاگ های فعلی موجود در مموری را بازخوانی کرده و درصورت وجود کلمات کلیدی خاص در آنها، لاگ یا لاگ های مورد نظر را برای خودمان ایمیل کنیم.
    توضیح اصلی استفاده از این اسکریپت در لینک زیر موجود است :
    https://wiki.mikrotik.com/wiki/Monit...t_/_run_script

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

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

    تلگرام :
    آموزش ارسال پیام تلگرام توسط روتر میکروتیک

    پیامک (SMS) :
    آموزش ارسال SMS اطلاع رسانی به وسیله میکروتیک


    حال به سراغ فعال کردن این مانیتورینگ برویم،
    در قدم اول باید لاگ های مربوط به وجود خطای ورود را برای ثبت در لاگ های سیستم عامل میکروتیک خود فعال نمایم.
    برای فعال کردن خطای ورود به خود دستگاه از بخش System\Logging\Rules می بایست Rule پیشفرض را برسی کنیم:
    Topics:Cirtical Action:memory
    در صورت فعال بودن این Rule هر زمان کاربری سعی در ورود به روتر کند، اما موفق به ورود نشود، یک لاگ از وضعیت پیش آمده در مموری دستگاه ثبت می گردد.

    همینطور
    برای ثبت Rule مربوط به تلاش ورود افراد، جهت ورود به وای فای شبکه ما، دو حالت وجود دارد
    در حالتی که ما تنها یک اکسس پوینت داریم و مشغول وارد کردن این دستورات روی آن هستیم می بایست در دستگاه Rule زیر را اضافه نماییم
    کد:
    /system logging add topics=wireless action=memory
    در حالت دیگر اگر ما دارای تعداد بسیار زیادی اکسس پوینت هستیم که با کابل به دستگاه مرکزی متصل هستند و توسط دستگاه مرکزی با ابزار Capsman مورد مدیریت قرار گرفته اند، می بایست لاگ Rule جدید را در دستگاه مرکزی به صورت زیر اضافه نماییم
    کد:
     /system logging add topics=caps action=memory
    بعد از ساختن و فعال کردن این Rule ها، اگر کاربری ورود ناموفق به روتر داشته باشد،
    یک لاگ در روتر ثبت می شود که در آن از کلمه کلیدی login failure استفاده شده است.

    و اگر کاربری اقدام به ورود ناموفق به WiFi شبکه ما بکند،
    یک لاگ در روتر ثبت می شود که در آن از کلمه کلیدی 4-way handshake استفاده شده است.

    تنها کاری که ما می بایست انجام دهید، استفاده از اسکریپت مشاهده لاگ های روتر است، می توان آن را هر چند دقیقه یک بار، مثلا پنج یا ده دقیقه یک بار اجرا نمود تا لاگ ها باز خوانی شوند و اگر یکی از کلمات کلیدی ما، به تازگی در لاگ جدیدی ثبت گردیده بود، آنرا برای ما اطلاع رسانی نماید.
    شما می توانید، هر لاگ دیگر و کلمه کلیدی دیگری را جایگزین نموده و یا به اسکریپت اضافه نمایید.
    همینطور می توانید، بخشی از لاگ انتخابی را با کلمه ای دیگر نادیده بگیرید که توضیحات آن در لینک ویکی میکروتیک موجود است.

    توجه فرمایید که من در این اسکریپت ویرایش شده، تصمیم گرفتم که در پیام تلگرام و SMS تنها لاگ آخر ثبت گردد.
    به این معنی که اگر در فاصله ی بین اجرا شدن های اسکریپت، چندین لاگ از نوع های مشخص شده، در روتر ثبت گردد، در پیام تلگرام و SMS تنها آخرین لاگ جدید، ارسال خواهد شد.
    اما در ایمیل، تمامی لاگ های جدید مورد درخواست، ارسال خواهد شد.
    مثلا اگر پنج لاگ جدید ثبت شده باشد، بعد از ارسال پیام اطلاع رسانی، با مراجعه به ایمیل و یا خود دستگاه، تمامی آنها قابل مشاهده خواهد بود.
    علت چنین تصمیمی از طرف من این بوده که در ارسال پیام تلگرام و SMS چون از URL استفاده می شود، طول URL ما از حد مجاز بیشتر نشود، که باعث بروز خطا و عمل نکردن ارسال پیام اطلاع رسانی شود.
    البته در تست های انجام گرفته، متوجه شدم می توان بین ده تا پانزده پیام را نیز یکجا ارسال نمود.
    علت دیگر این بود که پیام های ارسالی بصورت تک خطی ارسال می شوند و اضافه شدن هر لاگ به انتهای لاگ قبلی، کمی از شکیل بودن آن می کاهد، اما خب شما در صورت تمایل می توانید، وضعیت را در اسکریپت عوض نموده تا یک پیام کلی دریافت نمایید و یا چندین پیام را بصورت دلخواه در هر بار فعال شدن اسکریپت دریافت نمایید.


    خب به سراغ اسکریپت برویم، ابتدا از بخش System\Scheduler یک Schedule جدید ایجاد می کنیم.
    نامی که به آن اختصاص می دهیم باید عینا در اسکریپتی که زیر آن کپی میکنیم وارد شود، به این علت که، اسکریپت تاریخ و زمان آخرین مرتبه ای که پیام ارسال شده است را در بخش کامنت ثبت می کند. من نام آن را Mikrotik-Alert در نظر گرفته ام، اگر آنرا تغییر نمی دهید، نیاز است که Schedule خود را با همین نام ایجاد نمایید، به عنوان مثال :

    کد:
    /system scheduler add name="Mikrotik-Alert" interval="00:02:00" on-event="Enter Script"
    اسکریپت:

    کد:
    # BEGIN SETUP
     :local scheduleName "Mikrotik-Alert"
    :local startBuf [:toarray [/log find  message~"4-way handshake" || message~"login failure"]]
    :local removeThese 
    
     # Email
     :local emailAddress "YourEmail@gmail.com"
    
     # Telegram 
     :local MyToken "{MyToken}"
     :local MyID "{MyID}"
    :local TelOutput
    
     # SMS
     :local MyUser "{UserName}" 
     :local MyPass "{Password}"
     :local FromNum "50002210004082"
     :local ToNum "09351000000"
    :local SmsMsg 
    # END SETUP
    
    # warn if schedule does not exist
    :if ([:len [/system scheduler find name="$scheduleName"]] = 0) do={
      /log warning "[LOGMON] ERROR: Schedule does not exist. Create schedule and edit script to match name"
    }
    
    # get last time
    :local lastTime [/system scheduler get [find name="$scheduleName"] comment]
    # for checking time of each log entry
    :local currentTime
    # log message
    :local message
     
    # final output
    :local output
    
    
    :local keepOutput false
    # if lastTime is empty, set keepOutput to true
    :if ([:len $lastTime] = 0) do={
      :set keepOutput true
    }
    
    
    :local counter 0
    # loop through all log entries that have been found
    :foreach i in=$startBuf do={
     
    # loop through all removeThese array items
      :local keepLog true
      :foreach j in=$removeThese do={
    #   if this log entry contains any of them, it will be ignored
        :if ([/log get $i message] ~ "$j") do={
          :set keepLog false
        }
      }
      :if ($keepLog = true) do={
       
       :set message [/log get $i message]
    
    #   LOG DATE
    #   depending on log date/time, the format may be different. 3 known formats
    #   format of jan/01/2002 00:00:00 which shows up at unknown date/time. Using as default
        :set currentTime [ /log get $i time ]
    #   format of 00:00:00 which shows up on current day's logs
       :if ([:len $currentTime] = 8 ) do={
         :set currentTime ([:pick [/system clock get date] 0 11]." ".$currentTime)
        } else={
    #     format of jan/01 00:00:00 which shows up on previous day's logs
         :if ([:len $currentTime] = 15 ) do={
            :set currentTime ([:pick $currentTime 0 6]."/".[:pick [/system clock get date] 7 11]." ".[:pick $currentTime 7 15])
          }
       }
        
    #   if keepOutput is true, add this log entry to output
       :if ($keepOutput = true) do={
         :set output ($output.$currentTime." ".$message."\r\n")
    
    #   Only One Message For Telegram
         :set TelOutput ($currentTime." - ".$message)
       }
    #   if currentTime = lastTime, set keepOutput so any further logs found will be added to output
    #   reset output in the case we have multiple identical date/time entries in a row as the last matching logs
    #   otherwise, it would stop at the first found matching log, thus all following logs would be output
        :if ($currentTime = $lastTime) do={
         :set keepOutput true
         :set output ""
         :set TelOutput ""
       }
      }
    
    #   if this is last log entry
      :if ($counter = ([:len $startBuf]-1)) do={
    #   If keepOutput is still false after loop, this means lastTime has a value, but a matching currentTime was never found.
    #   This can happen if 1) The router was rebooted and matching logs stored in memory were wiped, or 2) An item is added
    #   to the removeThese array that then ignores the last log that determined the lastTime variable.
    #   This resets the comment to nothing. The next run will be like the first time, and you will get all matching logs
       :if ($keepOutput = false) do={
    #     if previous log was found, this will be our new lastTime entry      
         :if ([:len $message] > 0) do={
            :set output ($output.$currentTime." ".$message."\r\n")
    
    #   Only One Message For Telegram
         :set TelOutput ($currentTime." - ".$message)
          }
        }
      }
      :set counter ($counter + 1)
    }
    
    # If we have output, save new date/time, and send email
    if ([:len $output] > 0) do={
      /system scheduler set [find name="$scheduleName"] comment=$currentTime
    
      /log info "Start Sending Email, Telegram and SMS Message For Mikrotik Alert"
    
    #Send Email
      /tool e-mail send to="$emailAddress"  subject="Mikrotik Alert" body="Mikrotik Alert $currentTime \r\n $output"
    
    #send telegram Message
      /tool fetch url="https://api.telegram.org/bot$MyToken/sendmessage?chat_id=$MyID&text=Mikrotik Alert - $TelOutput" mode=https keep-result=no 
    
    #Send SMS
    
    # Replace Spase With %20 For Sms String
    :if ([:find $TelOutput " " -1] > 0) do={
     :for i from=0 to=([:len $TelOutput] -1) step=1 do={
      :local actualchar value=[:pick $TelOutput $i];
      :if ($actualchar = " ") do={ :set actualchar value="%20" };
      :set SmsMsg value=($SmsMsg.$actualchar);
     }
    }
    
      /tool fetch ascii=yes mode=https keep-result=no url="https://raygansms.com/SendMessageWithUrl.ashx?Username=$MyUser&Password=$MyPass&PhoneNumber=$FromNum&MessageBody=Mikrotik%20Alert%20-%20$SmsMsg&RecNumber=$ToNum&Smsclass=1" 
    
      /log info "[LOGMON] New logs found, Mikrotik OS, sended alert"
    }
    دوستان توجه داشته باشید که نظیر چنین عملکردی را می توان به راحتی در نرم افزار های مانیتورینگ و یا لاگ سرورهای، شبکه پیاده سازی نمود.
    علت ذکر چنین راه کاری این است که ممکن است بعضی دوستان در شبکه سرور مجزا و یا خاصی جهت این کار نداشته باشند و یا ترس آن وجود داشته باشد که در ساعتی از دسترس خارج باشد.
    درچنین شرایطی، استفاده از راهکارهایی که باعث می شود، خود سیستم عامل میکروتیک بطور کاملا مستقل عمل کند، می تواند مشکل گشا باشد.



    موضوعات مشابه:

  2. #2
    نام حقيقي: ali

    عضو عادی
    تاریخ عضویت
    Jun 2010
    محل سکونت
    mashhad
    نوشته
    605
    سپاسگزاری شده
    481
    سپاسگزاری کرده
    57
    اسکریپت بالا با این تفاوت که بجای ارسال تنها لاگ آخر به تلگرام و SMS
    ده لاگ ابتدایی را به تلگرام و سه لاگ بصورت SMS با یک پیام ارسال می کند.

    کد:
    # BEGIN SETUP
     :local scheduleName "Mikrotik-Alert"
    :local startBuf [:toarray [/log find  message~"4-way handshake" || message~"login failure"]]
    :local removeThese 
    
     # Email
     :local emailAddress "YourEmail@gmail.com"
    
     # Telegram 
     :local MyToken "{MyToken}"
     :local MyID "{MyID}"
     :local TelOutput
    
     # SMS
     :local MyUser "{UserName}" 
     :local MyPass "{Password}"
     :local FromNum "50002210004082"
     :local ToNum "09351000000"
     :local SmsMsg 
     :local SmsMsgFix
     #Msg Count
     :local Msgcounter 0
    # END SETUP
    
    # warn if schedule does not exist
    :if ([:len [/system scheduler find name="$scheduleName"]] = 0) do={
      /log warning "[LOGMON] ERROR: Schedule does not exist. Create schedule and edit script to match name"
    }
    
    # get last time
    :local lastTime [/system scheduler get [find name="$scheduleName"] comment]
    # for checking time of each log entry
    :local currentTime
    # log message
    :local message
     
    # final output
    :local output
    
    
    :local keepOutput false
    # if lastTime is empty, set keepOutput to true
    :if ([:len $lastTime] = 0) do={
      :set keepOutput true
    }
    
    
    :local counter 0
    # loop through all log entries that have been found
    :foreach i in=$startBuf do={
     
    # loop through all removeThese array items
      :local keepLog true
      :foreach j in=$removeThese do={
    #   if this log entry contains any of them, it will be ignored
        :if ([/log get $i message] ~ "$j") do={
          :set keepLog false
        }
      }
      :if ($keepLog = true) do={
       
       :set message [/log get $i message]
    
    #   LOG DATE
    #   depending on log date/time, the format may be different. 3 known formats
    #   format of jan/01/2002 00:00:00 which shows up at unknown date/time. Using as default
        :set currentTime [ /log get $i time ]
    #   format of 00:00:00 which shows up on current day's logs
       :if ([:len $currentTime] = 8 ) do={
         :set currentTime ([:pick [/system clock get date] 0 11]." ".$currentTime)
        } else={
    #     format of jan/01 00:00:00 which shows up on previous day's logs
         :if ([:len $currentTime] = 15 ) do={
            :set currentTime ([:pick $currentTime 0 6]."/".[:pick [/system clock get date] 7 11]." ".[:pick $currentTime 7 15])
          }
       }
        
    #   if keepOutput is true, add this log entry to output
       :if ($keepOutput = true) do={
         :set output ($output.$currentTime." ".$message."\r\n")
    
    
        set Msgcounter ($Msgcounter + 1)
    #   Only First 10 Message For Telegram
        if ($Msgcounter < 11 ) do={
         :set TelOutput ($TelOutput.$currentTime." - ".$message."%0A")
        }
    
    #   Only First 3 Message For SMS
        if ($Msgcounter < 4 ) do={
         :set SmsMsg ($SmsMsg.$currentTime." - ".$message."%0A")
        }
    
       }
    #   if currentTime = lastTime, set keepOutput so any further logs found will be added to output
    #   reset output in the case we have multiple identical date/time entries in a row as the last matching logs
    #   otherwise, it would stop at the first found matching log, thus all following logs would be output
        :if ($currentTime = $lastTime) do={
         :set keepOutput true
         :set output ""
         :set TelOutput ""
     :set SmsMsg ""
       }
      }
    
    #   if this is last log entry
      :if ($counter = ([:len $startBuf]-1)) do={
    #   If keepOutput is still false after loop, this means lastTime has a value, but a matching currentTime was never found.
    #   This can happen if 1) The router was rebooted and matching logs stored in memory were wiped, or 2) An item is added
    #   to the removeThese array that then ignores the last log that determined the lastTime variable.
    #   This resets the comment to nothing. The next run will be like the first time, and you will get all matching logs
       :if ($keepOutput = false) do={
    #     if previous log was found, this will be our new lastTime entry      
         :if ([:len $message] > 0) do={
            :set output ($output.$currentTime." ".$message."\r\n")
    
         :set Msgcounter ($Msgcounter + 1)
         :set TelOutput ($TelOutput.$currentTime." - ".$message."%0A")
         :set SmsMsg ($SmsMsg.$currentTime." - ".$message."%0A")
          }
        }
      }
      :set counter ($counter + 1)
    }
    
    # If we have output, save new date/time, and send email
    if ([:len $output] > 0) do={
      /system scheduler set [find name="$scheduleName"] comment=$currentTime
    
      /log info "Start Sending Email, Telegram and SMS Message For Mikrotik Alert"
    
    #Send Email
      /tool e-mail send to="$emailAddress"  subject="Mikrotik Alert" body="Mikrotik Alert $currentTime \r\n $output"
    
    #send telegram Message
      /tool fetch url="https://api.telegram.org/bot$MyToken/sendmessage?chat_id=$MyID&text=Mikrotik Alert - $TelOutput" mode=https keep-result=no 
    
    #Send SMS
    
     :set SmsMsg ("Mikrotik%20Alert%20:%0A(Run%20:%20".$currentTime.")%0A".$SmsMsg)
    # Replace Spase With %20 For Sms String
    :if ([:find $SmsMsg " " -1] > 0) do={
     :for i from=0 to=([:len $SmsMsg] -1) step=1 do={
      :local actualchar value=[:pick $SmsMsg $i];
      :if ($actualchar = " ") do={ :set actualchar value="%20" };
      :set SmsMsgFix value=($SmsMsgFix.$actualchar);
     }
    }
    
      /tool fetch ascii=yes mode=https keep-result=no url="https://raygansms.com/SendMessageWithUrl.ashx?Username=$MyUser&Password=$MyPass&PhoneNumber=$FromNum&MessageBody=$SmsMsgFix&RecNumber=$ToNum&Smsclass=1" 
    
      /log info "[LOGMON] New logs found, Mikrotik OS, sended alert"
    }



    ویرایش توسط shahani : 2020-01-21 در ساعت 09:05 AM
    Raminvip سپاسگزاری کرده است.

کلمات کلیدی در جستجوها:

هیچ کلمه ای ثبت نشده است.

برچسب برای این موضوع

مجوز های ارسال و ویرایش

  • شما نمی توانید موضوع جدید ارسال کنید
  • شما نمی توانید به پست ها پاسخ دهید
  • شما نمی توانید فایل پیوست ضمیمه کنید
  • شما نمی توانید پست های خود را ویرایش کنید
  •