https://wiki.frotmail.nl/index.php?title=Iproute_2&feed=atom&action=historyIproute 2 - Revision history2024-03-29T06:06:08ZRevision history for this page on the wikiMediaWiki 1.41.0https://wiki.frotmail.nl/index.php?title=Iproute_2&diff=47&oldid=prevEric: Created page with "Category:Linux Category:Networking - Ontwerp Webadmin IPRoute2 = Traffic Manager = ==Inleiding== Naar aanleiding van een discussie over het gebruik van iproute2 en tc kwam al snel een conclusie; het is te complex om iemand uit te leggen die er niet dagelijks mee te maken heeft. En om dus iemand anders aan de hand van enkele aanwijzingen de scripts aan te laten passen is niet erg prettig. Op [http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm deze pagina]..."2022-04-05T09:12:06Z<p>Created page with "<a href="/index.php/Category:Linux" title="Category:Linux">Category:Linux</a> <a href="/index.php?title=Category:Networking&action=edit&redlink=1" class="new" title="Category:Networking (page does not exist)">Category:Networking</a> - <a href="/index.php/Ontwerp_Webadmin_IPRoute2" title="Ontwerp Webadmin IPRoute2">Ontwerp Webadmin IPRoute2</a> = Traffic Manager = ==Inleiding== Naar aanleiding van een discussie over het gebruik van iproute2 en tc kwam al snel een conclusie; het is te complex om iemand uit te leggen die er niet dagelijks mee te maken heeft. En om dus iemand anders aan de hand van enkele aanwijzingen de scripts aan te laten passen is niet erg prettig. Op [http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm deze pagina]..."</p>
<p><b>New page</b></p><div>[[Category:Linux]] [[Category:Networking]]<br />
<br />
- [[Ontwerp Webadmin IPRoute2]]<br />
<br />
= Traffic Manager =<br />
==Inleiding==<br />
Naar aanleiding van een discussie over het gebruik van iproute2 en tc kwam al snel een conclusie; het is te complex om iemand uit te leggen die er niet dagelijks mee te maken heeft. En om dus iemand anders aan de hand van enkele aanwijzingen de scripts aan te laten passen is niet erg prettig.<br />
<br />
Op [http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm deze pagina] staat erg duidelijk toegelicht hoe htb in zijn werkt gaat, htb is een van de mogelijkheden om met tc "prioriteiten toe te kennen aan bepaalde datastromen. In deze user manual wordt veel gebruik gemaakt van diagrammen om aan te geven welke "nodes" bandbreedte kunnen delen met elkaar. Op dit idee ben ik verder gegaan en hier is de huidige user interface uit ontstaan.<br />
<br />
==Iproute==<br />
Iproute wordt in het systeem gebruikt om eventueel meerdere internet verbindingen tegelijk te gebruiken met als extra de mogelijkheid om bepaalde diensten/hosts/whatever aan bepaalde internet verbindingen te koppelen. Dit koppelen gebeurt aan de hand van de MARK die meegegeven dient te worden aan een stroom gegevens.<br />
<br />
Deze MARK kan je met iptables instellen, voorbeeld:<br />
<br />
Alle ssh pakketjes in en uit markeren met MARK 1<br />
// De dienst ssh krijgt mark 1<br />
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 1<br />
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN<br />
<br />
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j MARK --set-mark 1<br />
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j RETURN<br />
<br />
Nadat deze markering is ingesteld kunnen alle pakketjes met de mark 1 aan een internet verbinding of combinatie van internet verbindingen worden toegewezen.<br />
<br />
Ook op gateways met maar 1 internet verbinding kan dit pakket handig zijn, maar dan puur om de verschillende diensten bandbreedte toe te wijzen<br />
<br />
==tc==<br />
Om naast het kiezen van interfaces ook nog prioriteiten toe te kunnen passen is ook tc erbij gehaald. Op basis van dezelfde markering kunnen we een dienst een minimale bandbreedte en een maximale bandbreedte toewijzen.<br />
<br />
==ssh==<br />
Om als php script onder apache toch commando's als root uit te kunnen voeren maken we gebruik van ssh. Een bijkomend voordeel is dat je zo eventueel backend en frontend kuns opsplitsen (nog niet getest!)<br />
<br />
Het gebruik van ssh brengt wel wat aandachtpuntjes met zich mee:<br />
<br />
===known_hosts===<br />
Voor ssh een verbinding wil maken naar een host moet deze host + fingerprint bekend zijn op de server. Normaal wordt dit in ~/.ssh/known_hosts bijgehouden maar omdat deze ssh sessies worden gedraait als apache user kunnen deze beter system-wide worden ingesteld<br />
<br />
ssh localhost<br />
<br />
hierna zal in de /root/.ssh/known_hosts een regel te vinden zijn welke begin met:<br />
<br />
localhost rsa ssh-rsa AAAAB3NzaC1yc2E.....<br />
<br />
deze moet je kopieren naar de file /etc/ssh/ssh_known_hosts<br />
<br />
<br />
<br />
==under construction==<br />
Laat duidelijk zijn dat deze web-interface pas bij versie 1.0 alpha is en dus nog gegarandeerd fouten bevat!<br />
<br />
Bugs kan je hier melden (zie discussion page) en dan zal ik kijken of ik tijd heb om er naar te kijken.<br />
<br />
Als je een goede reden denkt te hebben waarom je toegang nodig hebt tot de subversion repository kan je je ook hier melden! <br />
<br />
= Voorbeelden en resultaten van onderzoeken =<br />
Voor ik beginnen ben aan de TrafficManager heb ik me eerst verdiept in iproute en tc, de resultaten en uitprobeersels die hieruit zijn gekomen staan hieronder:<br />
<br />
==2 internet verbindingen bundelen tot 1==<br />
Hieronder staat een test-script welke in theorie 2 modems tegelijk kan gebruiken, dit voorbeeld is rechtstreeks overgenomen uit de LARTC howto<br />
<br />
echo nics config<br />
ifconfig eth0 192.168.0.49<br />
ifconfig eth1 10.0.0.5<br />
<br />
echo incoming traffic<br />
ip route add 192.168.0.0/24 dev eth0 table 100<br />
ip route add default via 192.168.0.1 table 100<br />
ip route add 10.0.0.0/8 dev eth1 table 200<br />
ip route add default via 10.0.0.1 table 200<br />
<br />
echo Debug<br />
ip route show table 100<br />
ip route show table 200<br />
<br />
echo Delete oude Main routes<br />
ip route delete 192.168.0.0/24<br />
ip route delete 10.0.0.0/8<br />
ip route delete default<br />
<br />
echo Route Main<br />
ip route add 192.168.0.0/24 dev eth0 src 192.168.0.49<br />
ip route add 10.0.0.0/8 dev eth1 src 10.0.0.5<br />
<br />
echo Tabellen koppelen<br />
ip rule add from 192.168.0.49 table 100<br />
ip rule add from 10.0.0.5 table 200 <br />
<br />
echo debug again<br />
ip route show<br />
<br />
echo outgoing<br />
ip route add default scope global nexthop via 192.168.0.1 dev eth0 weight 1 \ <br />
nexthop via 10.0.0.1 dev eth1 weight 1<br />
<br />
==QoS in Linux met TC en HTB==<br />
Dit script zorgt ervoor dat Client A (met het ip 1.2.3.4) met 30 kb/sec kan downloaden (minimaal) en verder 10 kb/sec over heeft voor overige protocollen. Verder kan http tot 100 kb/sec groeien indien de rest niet wordt gebruikt, ook kan "rest" groeien tot max 100 kb/sec wanneer er geen http verkeer is<br />
<br />
Voorbeeld:<br />
<br />
Indien een andere client (Client B met ip 1.2.3.5) aan het downloaden is met 60 kb/sec:<br />
<br />
- Client A http: 30 kb/sec (of wanneer http 0 kb/sec is kan rest groeien tot 40 kb/sec)<br />
<br />
- Client A rest: 10 kb/sec (of wanneer rest 0 kb/sec is kan http tot 40 kb/sec groeien)<br />
<br />
<br />
De classes kunnen bij elkaar bandbreedte lenen wanneer deze niet gebruikt worden bij een andere class. De maximale snelheid (inclusief het lenen) wordt aangegeven met ceil.<br />
<br />
# Enable root<br />
tc qdisc add dev eth0 root handle 1: htb default 12<br />
<br />
# Root aanmaken, main limit<br />
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps<br />
<br />
# Per child opgeven wat het limiet is<br />
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps<br />
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps<br />
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps<br />
<br />
# Als hij source-port 80 heeft en mijn desktop is dan naar :10<br />
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 1.2.3.4 \<br />
match ip sport 80 0xffff flowid 1:10<br />
# Ander verkeer van mijn desktop naar :11<br />
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 1.2.3.4 \<br />
flowid 1:11<br />
<br />
== 2 scripts samengevoegd ==<br />
Dit script deelt de internet verbindingen van eth2 en eth3.<br />
<br />
- de dienst ssh gaat altijd over eth2 en krijgt max 30 kb/sec<br />
<br />
- HTTP gaat altijd over eth3 en krijgt max 10 kb/sec<br />
<br />
- Overige diensten gaan over beide netwerkkaarten (session round-robin) en krijgen max 100 kb/sec<br />
<br />
## Config<br />
# Internet Subnets<br />
INET1="10.6.6.0/24"<br />
INET2="10.7.7.0/24"<br />
# Gateways<br />
GW1="10.6.6.1"<br />
GW2="10.7.7.1"<br />
# Internet Interfaces<br />
IF1="eth2"<br />
IF2="eth3"<br />
# Internet IP's<br />
IP1="10.6.6.2"<br />
IP2="10.7.7.2"<br />
<br />
<br />
## Cleanup previous run<br />
ip rule del from $IP1<br />
ip rule del from $IP2<br />
ip rule del fwmark 1<br />
ip rule del fwmark 2<br />
ip rule del fwmark 3<br />
<br />
<br />
## Setup load-balancing<br />
# Incoming traffic<br />
ip route add $INET1 dev $IF1 table 150<br />
ip route add default via $GW1 table 150<br />
ip route add $INET2 dev $IF2 table 151<br />
ip route add default via $GW2 table 151<br />
<br />
# Delete old Main routes<br />
ip route delete $INET1<br />
ip route delete $INET2<br />
ip route delete default<br />
<br />
# Route Main <br />
ip route add $INET1 dev $IF1 src 10.6.6.2<br />
ip route add $INET2 dev $IF2 src 10.7.7.2<br />
<br />
echo Tabellen koppelen<br />
ip rule add from 10.6.6.2 table 150<br />
ip rule add from 10.7.7.2 table 151<br />
ip rule add fwmark 1 table 150<br />
ip rule add fwmark 2 table 151<br />
<br />
ip rule add fwmark 3 table 152<br />
<br />
ip route add $INET1 dev $IF1 table 152<br />
ip route add $INET2 dev $IF2 table 152<br />
ip route add default scope global table 152 nexthop via $GW1 dev $IF1 weight 1 nexthop via $GW2 dev $IF2 weight 1<br />
<br />
<br />
echo debug again<br />
ip route show<br />
<br />
echo outgoing<br />
ip route add default scope global nexthop via $GW1 dev $IF1 weight 1 nexthop via $GW2 dev $IF2 weight 1<br />
<br />
## Dividing traffic <br />
# outgoing traffic, mark for gateway selection<br />
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 22 -j MARK --set-mark 1<br />
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j MARK --set-mark 2<br />
iptables -t mangle -A PREROUTING -i eth1 -p tcp --dport 21 -j MARK --set-mark 3<br />
<br />
<br />
## Setup traffic shaping<br />
# Enable root<br />
tc qdisc add dev eth1 root handle 1: htb default 12<br />
<br />
# Root aanmaken, main limit<br />
tc class add dev eth1 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps<br />
<br />
# Per child opgeven wat het limiet is<br />
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 30kbps ceil 30kbps<br />
tc class add dev eth1 parent 1:1 classid 1:11 htb rate 10kbps ceil 10kbps<br />
tc class add dev eth1 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps<br />
<br />
# verkeer met MARK 1<br />
tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:10<br />
# verkeer met MARK 2<br />
tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 2 fw flowid 1:11<br />
<br />
<br />
# incoming traffic, mark for bandwidth throttling<br />
iptables -t mangle -A POSTROUTING -o eth1 -p tcp --sport 22 -j MARK --set-mark 1<br />
iptables -t mangle -A POSTROUTING -o eth1 -p tcp --sport 80 -j MARK --set-mark 2<br />
iptables -t mangle -A POSTROUTING -o eth1 -p tcp --sport 21 -j MARK --set-mark 3</div>Eric