lars2015
Goto Top

Mikrotik - Limitierung d. gesamten Traffics

Guten Abend zusammen,

ich habe folgendes Problem und finde keinen Lösungsansatz im Netz.

Ich habe verschiedene externe ip adressen die zu mir connecten - (ftp server etc... ) nun meine Frage: wie kann ich jeder einzelnen IP eine Limitierung des Traffics setzen : Sprich:

User 1 soll maximal 10 MB/ Tag an Traffic verursachen. (danach soll er keine Daten mehr bekommen von mir bis zum nächsten Tag.)
User 2 soll maximal 2 MB/ Tag an Traffic verursachen. (danach soll er keine Daten mehr bekommen von mir bis zum nächsten Tag.)

Ist dies möglich ? Hatte nur was über Hotspot gelesen/gesehen aber damit habe ich noch nie was machen müssen... finde nur die Limitierung der TrafficRate... aber nicht des Volumes ...

viele Grüße

lars

Content-Key: 301395

Url: https://administrator.de/contentid/301395

Printed on: April 19, 2024 at 19:04 o'clock

Mitglied: 114757
114757 Apr 09, 2016 updated at 21:53:47 (UTC)
Goto Top
Moin,
das kannst du auf dem Mikrotik mit Queues und einem Skript machen.
Das Script prüft regelmässig pro Queue die aufgelaufene Menge an Bytes (lässt sich abfragen) und bei Überschreiten deines definierten Wertes setzt du im Skript einfach eine Firewall-Rule die die IP blockt. Um Mitternacht lässt du dann ein Skript laufen was die Counter der Queues zurücksetzt und die Firewall regeln wieder raus nimmt. Feddich.

http://wiki.mikrotik.com/wiki/Manual:Scripting

Gruß jodel32
Member: colinardo
colinardo Apr 10, 2016, updated at Apr 11, 2016 at 20:51:47 (UTC)
Goto Top
Hallo Lars,
ich habe mir da mal zwei Skripte für den Mikrotik geschrieben. Das erste lässt man in regelmäßigen Intervallen laufen und es checkt dann den aufgelaufenen Traffic von einem/mehreren "Simple Queue(s)". Wenn der kumulierte Traffic von Up- und Download in diesen Queue(s) ein bestimmtes Maximum übersteigt wird die externe IP (Target-IP des Queue) in eine Firewall-Blocklist eingetragen. Eine entsprechende Firewall-Rule verweist auf diese Liste und blockt dann diese IPs.

Das zweite Skript lässt man um Mitternacht einmal laufen. Es entfernt dann die IPs von der Blockliste und setzt die Counter der Queues zurück, so dass die Hosts sich wieder verbinden können.

Für jede externe IP die du du limitieren willst erstellst du einen "Simple Queue" und stellst die maximale Geschwindigkeit auf einen definierten Wert (bitte nicht auf "Unlimited" stehen lassen). Den Queues gibst du eindeutige Namen.

Hier sind die Skripte:
back-to-topSkript 1 checkt den aufgelaufenen Traffic in den Queues so lange die IP des Queues noch nicht auf der Blockliste steht (Regelmässig ausführen lassen z.B. alle 20 Sekunden je nach Genauigkeitsanforderung für die Limitierung)
# Queue Namen und deren zugehöriges Maximum an zulässigen Bytes
:local QUEUES {"queue1"=10000000;"queue2"=2000000}  
# Name der Block Address-List
:local BLOCKLISTNAME "MyBlocklist"  
# ------------
:foreach qname,maxbytes in=$QUEUES do={
    :local qnum [/queue simple find name="$qname"]  
    :if ([:len $qnum] > 0) do={
        :local qtarget [:pick [:tostr [/queue simple get $qnum target]] 0 [:find [:tostr [/queue simple get $qnum target]] "/" 0]]  
       :if ([:len [/ip firewall address-list find list="$BLOCKLISTNAME" address="$qtarget"]] = 0) do={  
            :local bytes [/queue simple get $qnum bytes]
            :local bytesUP [:tonum [:pick $bytes 0 [:find $bytes "/" 0]]]  
            :local bytesDOWN [:tonum [:pick $bytes ([:find $bytes "/" 0]+1) 50]]  
            :local bytesTOTAL ($bytesUP + $bytesDOWN)
            :if ($bytesTOTAL > $maxbytes) do={
                 /log info message="Queue ->$qname<- exceeded max bytes ($[($bytesTOTAL / 1024)] KB), adding target '$qtarget' to blocklist."  
                 /ip firewall address-list add list="$BLOCKLISTNAME" address=$qtarget  
             }
        } else={
            :put "Target already in blocklist, skipping queue check."  
        }
     } else={
         /log warning message="A queue with the name '$qname' was not found!"  
     }
}
back-to-topSkript 2 entfernt die IPs aus der Blockliste und setzt die Zähler aller angegebenen Queues zurück (z.B. immer um Mitternacht ausführen lassen)
# reset queue limits for next day
# -----------------------------------------------
# Namen der Queues im Array angeben
:local QUEUES [:toarray ("queue1","queue2")]  
# Name der Block Address-List
:local BLOCKLISTNAME "MyBlocklist"  
# -----------------------------------------------
# Entferne alle IPs aus der Addressliste
/ip firewall address-list remove [find list="$BLOCKLISTNAME"]  
# counter reset der Queues
:foreach qname in=$QUEUES do={/queue simple reset-counters "$qname"}  

Eine Firewall-Regel die den Traffic entsprechend für die IPs blockiert könnte dann so aussehen:
/ip firewall filter add chain=input action=reject reject-with=icmp-host-prohibited src-address-list="MyBlocklist"
Die Position der Regel ist natürlich zu beachten. Wenn du Connection-Tracking auf deiner Firewall betreibst (also mit Related Regeln arbeitest) und willst das der Traffic für die IP welche Ihr Limit überschreitet, abrupt gekappt werden soll, muss die Regel natürlich vor den "related Regeln" positioniert werden. Willst du das nicht dann kann der User so lange weiter Daten übertragen bis er die Verbindung trennt. Nach dem Connection-Tracking Timeout kommt er dann aber nicht mehr rein. Diese Variante hätte den Vorteil für den Client das er eben noch die Chance bekommt seine laufenden Übertragungen zu beenden, aber natürlich wird dabei der Traffic überschritten. Da musst du also entscheiden was für dich relevant ist.

Hoffe das hilft dir weiter.

Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate

p.s. Es gibt hier eine Kategorie , du kannst deine Frage besser dort rein schieben, die Kategorie passt besser.
Mitglied: 114757
114757 Apr 11, 2016 updated at 18:00:57 (UTC)
Goto Top
@colinardo Schön kommt sofort in meine Mikrotik-Script-Bibliothek face-smile TOP!!

@lars2015
Wenns das dann war, den Beitrag noch auf gelöst setzen, wenn keine Rückmeldung mehr kommt.

Gruß jodel32
Member: lars2015
lars2015 Apr 11, 2016 at 20:48:54 (UTC)
Goto Top
Hallo zusammen,

Erst einmal vielen Dank für die tolle Hilfe ! Ich habe mich gestern u vorgestern riesig gefreut über die Antworten und wollte mir mal die Zeit nehmen um mich dafür zu bedanken ! Ich hatte schon nach der ersten Antwort ein mulmiges Gefühl face-smile (dachte : na toll - wieder etwas programmieren / wieder ne neue Sprache "anlernen") Trotzdem ein super Tip mit den Scripts von jodel32 danke dafür
- aber dank Uwe habe ich eine gewisse Ahnung, wie so ein Script aussehen soll/kann und ich hoffe ich bekomme es damit hin.

@ Uwe

Kann es sein, das im ersten Script in Zeile 17 bei "list=block" nicht "block" sondern "MyBlocklist" stehen muss in dem Beispiel ?

- ich habe die Scripte gestern mal schnell ausprobiert und die Bytes wurden auch schön zusammen gezählt und anschließend der User auch in die MyBlocklist eingetragen aber die Firewall-Regel (die ganz nach oben von mir geschoben wurde) hat mir den User nicht direkt gekappt (er hatte einen Video-Stream von meinem Server gestartet, der dann fleißig weiter lief.(hab auch lang genug gewartet, um auszuschliessen das der User was gepuffert hatte) Ich werde dementsprechend meine Einstellungen nochmal überprüfen müssen, da ich nicht sicher ausschließen kann, das sich vielleicht woanders ein Fehler eingeschlichen hat und mich erneut melden... bin ja mit dem Mikrotik hinter einem Telekom Router face-sad NAT etc.

Trotzdem vielen Dank bisher Uwe !! Damit hast du mir sehr geholfen. Ich hoffe ich kriege den Rest auch noch hin. Melde mich erneut bis zum WE.

Gruss Lars
Member: colinardo
colinardo Apr 11, 2016 updated at 21:01:16 (UTC)
Goto Top
Zitat von @lars2015:
Kann es sein, das im ersten Script in Zeile 17 bei "list=block" nicht "block" sondern "MyBlocklist" stehen muss in dem Beispiel ?
Sorry da gehört list="$BLOCKLISTNAME" hin, das hatte ich vergessen auszutauschen.

- ich habe die Scripte gestern mal schnell ausprobiert und die Bytes wurden auch schön zusammen gezählt und anschließend der User auch in die MyBlocklist eingetragen aber die Firewall-Regel (die ganz nach oben von mir geschoben wurde) hat mir den User nicht direkt gekappt (er hatte einen Video-Stream von meinem Server gestartet, der dann fleißig weiter lief.(hab auch lang genug gewartet, um auszuschliessen das der User was gepuffert hatte) Ich werde dementsprechend meine Einstellungen nochmal überprüfen müssen, da ich nicht sicher ausschließen kann, das sich vielleicht woanders ein Fehler eingeschlichen hat und mich erneut melden... bin ja mit dem Mikrotik hinter einem Telekom Router face-sad NAT etc.

Vermutlich einfach noch ein Interpretationsfehler von deiner Seite.
Das festzustellen kann hier nur das posten deiner Queue und Firewall Config klären.
Das doppelte NAT stellt hier kein Hindernis dar, ist ja nur ein DST-NAT vom T-COM Router in Richtung MK, Source-Address bleibt dann ja gleich.

Grüße Uwe