wireless.uzice.net - Uzice bez zice

UPUTSTVO: MIKROTIK - OGRANIČENJE PROTOKA PO KORISNIČKIM NIVOIMA

Ako vam je potrebno da korisnicima ogranicite internet protok ali tako da korisnike podelite po unapred definisanim nivoima, ovaj skript bi mogao da bude resenje problema.

/queue simple; :foreach i in=[find] \
do={  \
     :set sqName [get $i name]; \
     :set sqTotalBytes [get $i total-bytes]; \
     :set sqLevel [:find $sqName "\[LevelA\]"]; \
     :if ($sqLevel >= 0)  do={ \
        set $i limit-at=32000/32000 max-limit=64000/64000 \
          burst-threshold=48000/48000 burst-limit=128000/128000 burst-time=30/30; \
        :if ($sqTotalBytes  > (100 * 1048576))  do = { \
          set $i limit-at=24000/24000 max-limit=32000/32000 \
             burst-threshold=0/0 burst-limit=0/0 burst-time=0/0; \
        }; \
     } else {
       :set sqLevel [:find $sqName "\[LevelB\]"]; \
       :if ($sqLevel >= 0)  do={ \
           set $i limit-at=64000/64000 max-limit=128000/128000 \
             burst-threshold=78000/78000 burst-limit=256000/256000 burst-time=30/30; \
           :if ($sqTotalBytes  > (200 * 1048576))  do = { \
             set $i limit-at=64000/64000 max-limit=64000/64000 \
               burst-threshold=0/0 burst-limit=0/0 burst-time=0/0; \
           }; \
       } else { \
           :set sqLevel [:find $sqName "\[LevelC\]"]; \
           :if ($sqLevel >= 0)  do={ \
               set $i limit-at=72000/72000 max-limit=256000/256000 \
                 burst-threshold=96000/96000 burst-limit=1000000/1000000 burst-time=30/30; \
               :if ($sqTotalBytes  > (300 * 1048576))  do = { \
                  set $i limit-at=72000/72000 max-limit=72000/72000 \
                    burst-threshold=0/0 burst-limit=0/0 burst-time=0/0; \
                }; \
            }; \
        }; \
     }; \
     :if ($sqLevel >= 0) do { \
        :put ([get $i name] . " : " . [get $i limit-at] . " : " . \
           [get $i max-limit]  . " : " . [get $i burst-limit]   . " : " . \
           [get $i burst-threshold]  . " : " . [get $i burst-time]) ; \
     }; \
}

Skript proverava imena dodeljena simple queues pravilima. Ako u imenu pravila nadje oznaku [LevelA], [LevelB] ili [LevelC] ) uključujući i uglaste zagrade, on podešava parametre za ograničenje protoka koja su unapred definisana u samom skriptu. Skrpit takođe proverava total-limit vrednost svakog pravila, i ako je korsinik premašio vrednost zadatu za nivo koji mu je dodeljen, onda tom pravilu podešava drugačije vrednosti za ograničenje protoka.

Ovo vam omogućava da podesite skup pravila koji će definisati potreban broj grupa (u primeru su date tri grupe, ali ih može biti neograničeno) i da svako pravilo u simple queues, prostim dodavanjem oznake grupe u naziv, pridružite nekoj od grupa. Ako želite da promenite grupu kojj pripada neko pravilo, samo promenite iznaku grupe u nazivu tog pravila.

Za svaku grupu možete definisati sve potreben parametre za ograničenje protoka, ali i ograničenje protoka u slučaju da je korsinik premašio zadatu količinu prenesenih podataka.

Ovaj skript treba da se preko scheduler-a pokreće u pravilnim vremenskim razmacima, na primer, svakih 30 minuta. Takođe potreban je okidač koji će resetovati vrednost total-bytes u svim pravilima simple queues, jednom dnevno (ako se želi dnevno ograničenje protoka). Preporučljivo je da reset nastupi u doba kada počinje period slabijeg opterećenja, recimo oko 2 časa ujutru.

Kako se resetuje brojač protoka:

U starim verzijama Mikrotika:

/queue simple reset-counters 

U novim verzijama:

/queue simple reset-counters-all

Mikrotik 3.xx i 4.xx

U verzijama Mikrtika od 3.xx i novijim, promenjena je sintaksa skript jezika tako da navedeni skript na njima ne radi. Evo izmenjenog skripta koji će raditi u novim verzijama.

 

{

:log info ("Setting user levels - started"); 

/ip firewall address-list; 

:local list [find list=LevelA]
 :if ([:len $list] > 0) do={remove $list} 

:local list [find list=LevelB] 
 :if ([:len $list] > 0) do={remove $list} 

:local list [find list=LevelC] 
 :if ([:len $list] > 0) do={remove $list} 

:log info ("- user level lists deleted") 

/queue simple

:foreach i in=[find] do={  \

     :local sqName [get $i name] 
     :local sqDstAddress [get $i dst-address] 
     :local sqTotalBytes [get $i total-bytes] 

     :log info ("Setting user level for: " . $sqName) 


# LevelA
     :local sqLevel [:find $sqName "[LevelA]"] 

     :if ($sqLevel >= 0)  do={ 
       :put ($sqName . " > LevelA <") 
       /ip firewall address-list add list=LevelA address=$sqDstAddress 
        set $i limit-at=64k/64k max-limit=128k/128k \
                 burst-threshold=32k/32k burst-limit=512k/512k \
                 burst-time=30/30 priority=8

        :if ($sqTotalBytes  > (10 * 1048576))  do={ \
           set $i limit-at=12k/12k max-limit=32k/32k \
                     burst-threshold=10k/10k burst-limit=15k/15k burst-time=30/30 \
                     priority=8
   
          :log info ("Limit-exceeded on simple queue " . $sqName) 

        }


     } 

	 
# LevelB
     :local sqLevel [:find $sqName "[LevelB]"] 

     :if ($sqLevel >= 0)  do={ 
       :put ($sqName . " > LevelB <") 
       /ip firewall address-list add list=LevelB address=$sqDstAddress 
        set $i limit-at=64k/64k max-limit=256k/256k \
                 burst-threshold=32k/32k burst-limit=512k/512k \
                 burst-time=30/30 priority=8


        :if ($sqTotalBytes  > (20 * 1048576))  do={ \
           set $i limit-at=12k/12k max-limit=32k/32k \
                     burst-threshold=10k/10k burst-limit=15k/15k burst-time=30/30 \
                     priority=8
   
          :log info ("Limit-exceeded on simple queue " . $sqName) 

        }

     } 
	 

# LevelC
     :local sqLevel [:find $sqName "[LevelC]"] 

     :if ($sqLevel >= 0)  do={ 
       :put ($sqName . " > LevelC <") 
       /ip firewall address-list add list=LevelC address=$sqDstAddress 
        set $i limit-at=128k/128k max-limit=512k/512k \
                 burst-threshold=64k/64k burst-limit=1024k/1024k \
                 burst-time=30/30 priority=8

        :if ($sqTotalBytes  > (30 * 1048576))  do={ \
           set $i limit-at=12k/12k max-limit=32k/32k \
                     burst-threshold=10k/10k burst-limit=15k/15k burst-time=30/30 \
                     priority=8
   
          :log info ("Limit-exceeded on simple queue " . $sqName) 

        }


     } 

}


:log info ("Setting user levels - finished")

}

 

 

Ostavite komentar ili pitanje u vezi ovog uputstva.

Predrag Supurović

Mikrotik forum za pomoć i razmenu znanja