Поиск по этому блогу

среда, 13 июля 2016 г.

RouterOS/Mikrotik: гостьове підключення та боротьба з халявщиками.

Організувати на Mikrotik гостьовий wifi це справа добра, але, як загальновідомо, шара об'єму не має то завжди окрім мобільних пристроїв (проти яких ніхто особливо нічого не має) з'являються халявщики з ноутбуками, які вважають, що торенти на гостьовому це норма. Ні, не норма.

Тобто, мета, залишити доступ для будь-яких Android, iPhone, WindowsPhone і, по можливості, блокувати будь-яких інших "абонентів".

Все це робимо на Mikrotik 2011UiAS-2HnD, хоча певно без зайвих зусиль перенесеться та підійде до будь-яких інших моделей.

Рецепт, у скриптах.

Скрипт dhcp-make-static-guest:

/ip dhcp-server lease make-static [ find server="guest" and address!="guest-dhcp" ];
/ip dhcp-server lease set [ find server="guest" and address!="guest-dhcp" ] address="guest-dhcp" always-broadcast=no;
Тобто для dhcp серверу, який обслуговує guest підключення, всі підключення у lease робляться статичними. Другим кроком, всім їм замість статичної адреси призначається адресний пул, в який розрахований для гостьових підключень. Таким чином при кожному наступному підключення гість має можливість отримати будь-яку іншу адресу з пулу і не конфліктувати з іншими. Якби адреса була статичною то велика вірогідність, що адреси б, наприклад, збігалися.
Скрипт dhcp-make-static-guest варто запускати за розкладом, але не рідше ніж виділено lease time.
Далі, для статичних гостьових записів у dhcp lease проводимо регламентну обробку, а саме:

  • блокуємо доступ для записів у яких hostname є пустим;
  • блокуємо доступ для записів у яких запис не відповідає певним ознакам (наприклад всі Android пристрої мають hostname який починається з android).
Скрипт reglament:
:foreach i in=[/ip dhcp-server lease find server="guest"] do={

  :local mac [/ip dhcp-server lease get $i mac-address];
  :local hostname [/ip dhcp-server lease get $i host-name];
  :local blockaccess [/ip dhcp-server lease get $i block-access];
  :local lenhostname [ :len $hostname ];

  :if ($lenhostname<1) do={
    # Block Access for Hosts whith empty hostname.

    /ip dhcp-server lease set [ find mac-address=$mac ] block-access=yes

  } else={
    # Block Access for another categories.

    :local hn;
    :local illegal true;

    if ($illegal) do={
      :set hn [ :pick $hostname 0 7 ];
      if ([ :find $hn "android" -1 ]=0) do={
        :set illegal false;
      }
    }

    if ($illegal) do={
      :set hn [ :pick $hostname 0 7 ];
      if ([ :find $hn "Windows" -1 ]=0) do={
        :set illegal false;
      }
    }

    if ($illegal) do={
      :set hn [ :pick $hostname 0 6 ];
      if ([ :find $hn "iPhone" -1 ]=0) do={
        :set illegal false;
      }
    }

    if ($illegal) do={
      :set hn [ :pick $hostname 0 4 ];
      if ([ :find $hn "iPad" -1 ]=0) do={
        :set illegal false;
      }
    }

    if ($illegal) do={
      :set hn [ :pick $hostname 0 9 ];
      if ([ :find $hn "Microsoft" -1 ]=0) do={
        :set illegal false;
      }
    }

    if ($illegal) do={
      :set hn [ :pick $hostname 0 10 ];
      if ([ :find $hn "BLACKBERRY" -1 ]=0) do={
        :set illegal false;
      }
    }

    if ($illegal && !$blockaccess) do={
      :put "Block-Access: $mac $blockaccess";
      /ip dhcp-server lease set [ find mac-address=$mac ] block-access=yes
    }

  }
}
Додаємо виклик цих скриптів у розклад:
/system scheduler add interval=2m30s name=reglament on-event="/system script run dhcp-make-static-guest ;\r\
    \n/system script run reglament ;\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=jan/01/1970 start-time=00:00:00

На додаток, також можна спробувати додати деяких "незручностей" халявщикам, що бажають тягати великі файли через гостьове підключення. Скажемо у reglament додати:
# Disable guest subscribers who exceed the limit for a single connection.
:foreach wirelessClient in [/interface wireless registration-table find  interface="wlan2-guest" ] do={
  :local macAddress [/interface wireless registration-table get [ find .id=$wirelessClient ] value-name=mac-address];
  :local bytes [/interface wireless registration-table get [ find .id=$wirelessClient ] value-name=bytes];
  :local posComma [ :find $bytes "," -1];
  :local RXbytes [:pick $bytes 0 $posComma];

  :local deregister false;
  :if ($RXbytes > 20000000) do={ 
    :set deregister true;
  }
  if (deregister) do={
    :put "Deregistration: $macAddress $bytes $RXbytes";
    /interface wireless registration-table remove [ find mac-address=$macAddress ]
  }
}
Тут ми "рубаємо" всі wifi-підключення по яким пройшло/прийнято більше 20 мільйонів байт. Повірте, що жодна web-сторінка за одну сесію не віддасть такий обсяг інформації. Ну, а кому треба то той перепідключиться до гостьового доступу. Принаймні більша частина сучасних пристроїв та операційних систем це робить автоматично.