Vraag IPTABLES - Limiet van een specifiek binnenkomend IP


Ik wil de snelheid van een specifieke service niet beperken. Mijn doelen zijn om het tarief te beperken, uitsluitend op basis van het binnenkomende IP-adres. Bijvoorbeeld met behulp van een pseudo-regel:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

Hoe kan ik de limiet beoordelen met IPTables op basis van binnenkomende IP-adressen?


101
2018-04-28 21:09


oorsprong




antwoorden:


IPTables is niet gemaakt voor dit soort werk, waar heel veel pakketten moeten worden geanalyseerd om deze beslissingen te nemen. IPTables is echter gedeeltelijk het antwoord!

Het echte antwoord hierop is de geweldige en onderbenutte verkeersleidingfaciliteiten in Linux. Houd er rekening mee dat als je dit doet zonder te weten wat er aan de hand is, dit ertoe kan leiden dat je de netwerkverbinding met de machine verliest! Je bent gewaarschuwd!

Ervan uitgaande dat eth0 het uitgaande apparaat is, moet u een op klassen gebaseerde wachtrij voor verkeerscontrole maken die standaard het meeste verkeer uitvoert via de wachtrij 'Snel' en een specifieke lijst met mensen in de wachtrij 'Slow' zet.

Het mooie hiervan is dat je een situatie kunt creëren waarbij je veel uitgaand verkeer toestaat voor de langzame gebruiker, tenzij een overkoepelende klasse de bandbreedte wil, maar dit voorbeeld doet dit niet (zal altijd 10 kbps bieden aan de langzame gebruikers). Het wachtrijsysteem ziet er ongeveer zo uit:

                         Inbound traffic
                              +
                              |
                              |
                              v
                     +------------------+
                     |   Class 1:1      |
                     |------------------|
                     |  Root (all flows)|
                     |       100mbit    |
                     +-----+-----+------+
                           |     |
                           |     |
                           |     |
                           |     |
                           |     |
          +----------+     |     |     +----------+
          |    1:11  +-----+     +-----+    1:12  |
          |----------|                 |----------|
          | Default  |                 | Slow     |
          |100mb-80kb|                 |   80kb   |
          +----------+                 +----------+

Om dit te doen, moet je eerst de wachtlijndiscipline in de kernel instellen. Het volgende zal dit voor u doen .. je moet dit als een heel script uitvoeren

#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit

tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo

De "standaard 11" is belangrijk omdat het de kernel vertelt wat te doen met verkeer dat niet geclassificeerd is.

Zodra dit is gebeurd, kunt u een iptables-regel instellen om pakketten te classificeren die aan bepaalde criteria voldoen. Als je van plan bent om heel veel mensen in deze langzame regel te stoppen, is een ipset-regel meer geschikt (die volgens mij beschikbaar moet zijn op rhel6).

Dus, maak een ipset-database om de vergelijking te maken tegen ...

ipset create slowips hash:ip,port

Maak vervolgens de iptables-regel om de match te doen ..

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

Dit geeft de kernel de opdracht om, als je het bestemmings-IP koppelt aan de bronpoort van de set, deze in te delen in de langzame wachtrij die je opstelt met verkeerscontrole.

Nu, ten slotte, wanneer je een IP down wilt vertragen, kun je de ipset-opdracht gebruiken om de ip aan de set toe te voegen, zoals deze:

ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...

Je kunt testen dat het werkt met de opdracht "tc -s class show dev eth0" en je ziet daar stats die aangeven dat pakketten worden omgeleid naar de langzame wachtrij.

Merk op dat het enige echte nadeel hiervan is dat het herstarten overleeft. Ik denk niet dat er init scripts beschikbaar zijn om de ipsets te maken van dumps on reboot (en ze moeten ook gemaakt worden voor iptables-regels) en ik ben er zeker van dat er geen init-scripts zijn om verkeerscontroleregels bij het opnieuw opstarten opnieuw in te stellen. Als je niet gehinderd wordt, kun je gewoon het hele ding recreëren door een script in rc.local op te roepen.


165
2018-04-28 23:35



Nou, ik kan je niet genoeg bedanken. Dit is zeer beschrijvend en zeer informatief. Later realiseerde ik me dat ik kennis van TC nodig had en ben sindsdien begonnen dit te onderzoeken. Nogmaals bedankt! - James
Oh en wat betreft het verliezen van verbinding. Ik zorg ervoor dat ik de configuratie down heb voordat ik van mijn VPS naar de hostcomputer ga. Ook heb ik VPN-toegang tot het particuliere netwerk op ETH0. Ik zal alleen aan ETH1 werken dus in theorie heb ik het probleem niet. Maar waarschuwing gehoord! - James
Ik kan je niet vertellen hoe vaak ik soortgelijke tutorials heb gelezen, dit is de eerste die logisch is - RC1140
Als een sidenote is dit typisch meer geschikt om resourcebeperkingen als deze in controlegroepen (opnieuw, ook mogelijk en ook onderbenut en geweldig) te doen, omdat u per applicatie limieten op cpu, geheugen, IO en netwerk in een gecentraliseerde 'policy store' kunt definiëren '. Maar moet nog zien dat zo'n vraag wordt gesteld om een ​​antwoord te bieden. - Matthew Ife
Als je de. Niet leuk vindt tc syntaxis die je zou kunnen geven tcng een poging die een beetje meer gebruikersvriendelijke taal toevoegt die genereert tc commando's. Ik heb dit altijd leuk gevonden in shellscripts: echo '... multi line tcng configuration ...' | tcng | sh. - Mattias Wadman


Het is zo simpel als het nemen van een snelheidsbeperkende regel en het toevoegen van de -s schakelaar. De -s switch past inkomende IP's aan. Bijvoorbeeld iptables -A INPUT -s 1.1.1.1 en dan klaar met je gewenste methode van snelheidsbeperking voor die regel.


5
2018-04-28 21:12



Dank u voor uw snelle antwoord. Helaas is mijn grootste probleem de tweede helft. Ik heb gekeken naar - limitit en ik heb niets gezien dat me toestaat te limiteren op basis van KB / s - elke richting die je me kunt wijzen? - James
@James Ik zou terug zijn gekomen, maar ik moest naar het huis van een vriend stappen. Ik ben net terug en ik zie dat MIfe een behoorlijke klus heeft geklaard. =) - Wesley