# Θεματολογία δικτύου > Τοπολογία δικτύου >  AWMN Traffic Shaping

## bakolaz

Μπορείς Αχιλλέα να μας πεις τι θα έχει προτεραιότητα και τι όχι έτσι όπως είναι ρυθμισμένο το trafficshaping. Η μήπως δεν είναι και θα γίνει μια και καλή για όλους τους routers remotely?

Επίσης θα ήθελα να ρωτήσω αν πρόκειται για κάτι απαιτητικό σε μνήμη....

----------


## Achille

> Μπορείς Αχιλλέα να μας πεις τι θα έχει προτεραιότητα και τι όχι έτσι όπως είναι ρυθμισμένο το trafficshaping. Η μήπως δεν είναι και θα γίνει μια και καλή για όλους τους routers remotely?


Προς το παρόν έχει 3 ουρές. Στη χαμηλότερη βάζει το ftp. Στην υψηλότερη βάζει telnet,ssh,IRC,Teamspeak και το chat του DC.

Σε κάθε ουρά εφαρμόζεται SFQ για να δίνεται στο μέτρο του δυνατού ίδιο bandwidth σε κάθε λογική σύνδεση, για να μην πνίγουν αυτοί που έχουν μεγαλύτερο bandwidth (είναι πιο κοντά) αυτούς που είναι πιο μακριά.

Αν συμφωνήσουμε όλοι να χρησιμοποιήσουμε συγκεκριμένο port για τα transfers στο DC και να χρησιμοποιούμε όλοι το 4662 στο eMule, μπορούν να μπουν και αυτά στην τελευταία ουρά. Επίσης στην υψηλή ουρά μπορούμε να βάλουμε τα ICMP (πχ ping), τα πακέτα που ξεκινάνε τα tcp connections (για γρήγορη σύνδεση) και...προτάσεις δεκτές.




> Επίσης θα ήθελα να ρωτήσω αν πρόκειται για κάτι απαιτητικό σε μνήμη....


Στην παρούσα μορφή δεν νομίζω ότι είναι ιδιαίτερα απαιτητικό. Θα το δοκιμάσες και θα μας πεις (χρησιμοποίησε το top).

Μετακινώ και το θέμα σε δική του ενότητα.

----------


## jabarlee

Αυτό με το DC γίνεται εύκολα ως εξής, όπως το συζητήσαμε:

Η σύνδεση client-hub γίνεται σε συγκεκριμένο port. To πράγμα χαλάει στις peer-to-peer συνδέσεις μεταξύ users. Στα win, το dc++ έχει την δυνατότητα να του ορίσεις σε ποιό port θα συνδέεται με άλλους χρήστες (default είναι random). Φαντάζομαι ότι αυτή η δυνατότητα θα υπάρχει και σε άλλους DC clients.
Αν ορίσουμε με firewall στα routers, να επιτρέπει σύνδεση στο hub μόνο όσους έχουν το σωστό port, υπεχρεώνουμε τους πάντες να έχουν το port που πρέπει και έτσι βάζουμε και το DC στο traffic shaping.

Νομίζω επίσης ότι θα μπορούσαμε να συμπεριλάβουμε και τα online games (τουλάχιστον το Unreal Tournament που ξέρω ότι ο admin ορίζει τα ports). Δεν καταναλώνουν και πολύ bandwidth (είναι και αυτό αρκετά παραμετροποιήσιμο) αλλά θέλουν μικρό lag, άρα μεγάλη προτεραιότητα στο queue.

Τέλος, νομίζω ότι θα έπρεπε οπωσδήποτε να έχουν high priority και τα shoutcast streams, που όλα παίζουν στα ports 8000-8001.

Αν καταφέρουμε να δώσουμε προτεραιότητα στις real time υπηρεσίες (VoIp, chat, games, streams), θα είναι μεγάλη επιτυχία. Έχω κάποιες αμφιβολίες για το priority στα ftp (όχι ότι δεν χρειάζεται, αλλά πολλοί έχουν ταινίες και mp3 στα ftp τους, οι χρήστες έτσι μπορούν να παρακάμψουν το low priority για τέτοιου είδους downloads). Εγώ έχω βγάλει ταινίες και games από το ftp, έχουν μείνει μόνο τα mp3, θα αφαιρεθούν και αυτά.

----------


## Achille

> Αυτό με το DC γίνεται εύκολα ως εξής, όπως το συζητήσαμε:
> 
> Η σύνδεση client-hub γίνεται σε συγκεκριμένο port. To πράγμα χαλάει στις peer-to-peer συνδέσεις μεταξύ users. Στα win, το dc++ έχει την δυνατότητα να του ορίσεις σε ποιό port θα συνδέεται με άλλους χρήστες (default είναι random). Φαντάζομαι ότι αυτή η δυνατότητα θα υπάρχει και σε άλλους DC clients.


Αν ορίσουμε με firewall στα routers, να επιτρέπει σύνδεση στο hub μόνο όσους έχουν το σωστό port, υπεχρεώνουμε τους πάντες να έχουν το port που πρέπει και έτσι βάζουμε και το DC στο traffic shaping.


```
TCP    cray:1476              gaia.achille.awmn:411  ESTABLISHED
TCP    cray:65535             cray.achille.awmn:0    LISTENING
UDP    cray:65535             *:*
```

Το DC++ χρησιμοποιεί random port για να συνδεθεί στο server ότι και να βάλεις. Επομένως δεν γίνεται να το κόψουμε με firewall.
Μπορούμε το bot που τρέχεις, όταν συνδέεται κάποιος, να κάνει ένα δοκιμαστικό transfer και να βλέπει ποια πόρτα χρησιμοποιεί ο χρήστης, ή να ρωτάει το hub (αν έχει αυτήν την πληροφορία) και να κάνει disconnect το χρήστη με το κατάλληλο μήνυμα (use port ταδε).

Στο emule είμαστε καλυμένοι, γιατί για να έχεις HighID πρέπει να χρησιμοποιείς το 4662, και ο server δεν σε αφήνει να συνδεθείς αν έχεις LowID.



> Νομίζω επίσης ότι θα μπορούσαμε να συμπεριλάβουμε και τα online games (τουλάχιστον το Unreal Tournament που ξέρω ότι ο admin ορίζει τα ports). Δεν καταναλώνουν και πολύ bandwidth (είναι και αυτό αρκετά παραμετροποιήσιμο) αλλά θέλουν μικρό lag, άρα μεγάλη προτεραιότητα στο queue.


Να βρούμε σε ποια ports παίζουν τα παιχνίδια που χρησιμοποιούν το DirectPlay, και ρυθμίζουμε και τα υπόλοιπα σε αυτό το range




> Τέλος, νομίζω ότι θα έπρεπε οπωσδήποτε να έχουν high priority και τα shoutcast streams, που όλα παίζουν στα ports 8000-8001.


OK



> Αν καταφέρουμε να δώσουμε προτεραιότητα στις real time υπηρεσίες (VoIp, chat, games, streams), θα είναι μεγάλη επιτυχία. Έχω κάποιες αμφιβολίες για το priority στα ftp (όχι ότι δεν χρειάζεται, αλλά πολλοί έχουν ταινίες και mp3 στα ftp τους, οι χρήστες έτσι μπορούν να παρακάμψουν το low priority για τέτοιου είδους downloads). Εγώ έχω βγάλει ταινίες και games από το ftp, έχουν μείνει μόνο τα mp3, θα αφαιρεθούν και αυτά.


Το ftp παίρνει ΧΑΜΗΛΟΤΕΡΟ priority, όχι υψηλότερο. Στην ίδια κατηγορία δηλαδή με τα DC, emule. Το web παραμένει στην default κατηγορία (μέση).

----------


## spirosco

Θα βοηθουσε αν ειχαμε και οι υπολοιποι καποιο sample για να γινει η αρχη.
Δοκιμασα καποια commands που υπαρχουν σε ενα αρχειο στο source του iproute2 αλλα αν δεν το γνωριζεις το αντικειμενο...
Ο κομβος μου ειναι ετοιμος, QoS, iproute2 εγκατεστημενα.
Το μονο που χρειαζεται ειναι οι βασικες εντολες για να ξεκινησει να λειτουργει σωστα και μετα με λιγο διαβασμα βλεπουμε και τι αλλο μπορει να γινει.

----------


## Achille

Αμα δε σε δαγκώσω με το slackware...

Κατέβασε και εγκατέστησε το "alien", μετά χρησιμοποίησέ το για να μετατρέψεις το trafshape*.deb σε .tgz και να πάρεις από μέσα τα scriptάκια.

Είναι ένα που τρέχει στο startup και ένα που το βάζεις να τρέχει όταν σηκώνεται η κάθε ethernet.

----------


## jObo

erotiksi.. ti akribos software xrisimopoieite gia to traffic shaping? Stin praksi einai pragmatiko shaping i ena QoS ?

Harisis

----------


## Achille

iproute2 + tc. Σκοπός των scripts είναι να εξασφαλίσουμε QoS στο AWMN (προτεραιότητα σε interactive υπηρεσίες), και traffic shaping στις DSL που θα μοιράσουμε (οι χρήστες που πληρώνουν να έχουν εγγυημένο bandwidth στο DSL modem, οι υπόλοιποι ότι περισσέψει).

Το δεύτερο είναι πιο δύσκολο να επιτευχθεί, αν το συνδιάσουμε όμως με κάποιο είδος tunneling (πχ pptp vpn) τότε ίσως να είναι αρκετά πιο εύκολο ακόμα και από το πρώτο (είναι εύκολο να βάλεις κανόνες στο ppp interface, δύσκολο να ξεχωρίσεις στο ethernet τι είναι internet traffic και τι όχι).

----------


## spirosco

Thanks Αχιλλεα  ::

----------


## stoidis

> ...και traffic shaping στις DSL που θα μοιράσουμε (οι χρήστες που πληρώνουν να έχουν εγγυημένο bandwidth στο DSL modem, οι υπόλοιποι ότι περισσέψει).


Διευκρίνηση πριν μας "σφάξουν". Οι χρήστες που πληρώνουν για τις DSL γραμμές τους, όχι οι χρήστες που πληρώνουν στο AWMN (δεν πουλάμε internet!)

----------


## ggeorgan

Μετάφραση του post του stoidis για μη μηχανικούς :
_Διευκρίνιση πριν μας «σφάξουν». Οι χρήστες που πληρώνουν στον ΟΤΕ ή Vivodi και στον ISP τους για τις DSL γραμμές τους, όχι οι χρήστες που πληρώνουν στο AWMN (δεν πουλάμε internet, ούτε και τίποτε άλλο, οπότε δεν πληρωνόμαστε κιόλας !)_

----------


## Achille

Επειδή κάποιοι ζήτησαν τα scripts που κάνουν το traffic shaping, τα post-άρω εδώ:

trafshape_up


```
#!/bin/bash
INTERFACES=$*

# traffic shaping section

for IFACE in $INTERFACES; do

tc qdisc del dev $IFACE root >/dev/null 2>&1

tc qdisc add dev $IFACE root handle 1: prio

tc qdisc add dev $IFACE parent 1:1 handle 10: sfq perturb 10
tc qdisc add dev $IFACE parent 1:2 handle 20: sfq perturb 10
tc qdisc add dev $IFACE parent 1:3 handle 30: sfq perturb 10

done
```

/etc/init.d/trafshape_netfilter


```
#!/bin/bash

# netfilter section

iptables -t mangle -F

for CHAIN in PREROUTING OUTPUT; do

# Telnet, ssh & ftp

iptables -A $CHAIN -t mangle -p tcp --sport ssh \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --dport ssh \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --sport telnet \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --dport telnet \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --sport ftp \
        -j TOS --set-tos Maximize-Throughput
iptables -A $CHAIN -t mangle -p tcp --dport ftp \
        -j TOS --set-tos Maximize-Throughput
iptables -A $CHAIN -t mangle -p tcp --sport ftp-data \
        -j TOS --set-tos Maximize-Throughput
iptables -A $CHAIN -t mangle -p tcp --dport ftp-data \
        -j TOS --set-tos Maximize-Throughput

# Teamspeak

iptables -A $CHAIN -t mangle -p udp --sport 8767 \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p udp --dport 8767 \
        -j TOS --set-tos Minimize-Delay

# IRC

iptables -A $CHAIN -t mangle -p tcp --sport 6667 \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --dport 6667 \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --sport 7000 \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --dport 7000 \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --sport 7325 \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --dport 7325 \
        -j TOS --set-tos Minimize-Delay

# DC
iptables -A $CHAIN -t mangle -p tcp --sport 411 \
        -j TOS --set-tos Minimize-Delay
iptables -A $CHAIN -t mangle -p tcp --dport 411 \
        -j TOS --set-tos Minimize-Delay

done
```

Ξαναλέω ότι αυτά έχουν βγει για να καλύψουν βασικές ανάγκες (με το πρώτο δημιουργούνται 3 ουρές που να χρησιμοποιούν τα TOS fields και με το δεύτερο μασκαρεύονται κάποια πακέτα σε συγκεκριμένα ports ώστε να χρησιμοποιούν TOS fields ακόμα και αν δεν το κάνουν).

Επίσης χρησιμοποιείται ο αλγόριθμος SFQ ώστε να δίνεται κατά το δυνατόν το ίδιο bandwidth σε κάθε stream στην ίδια ουρά προτεραιότητας.

----------


## spirosco

Ενεργοποιηθηκε και στον κομβο μου το TF.

Αχιλλεα, μια διευκρινηση μονο σε παρακαλω.
Στο 2ο script το $CHAIN αφορα μονο το OUTPUT chain η και τo FORWARD?

----------


## Achille

for CHAIN in PREROUTING OUTPUT; do

 ::

----------


## spirosco

Το ετρεξα οπως το ειχες στο post, αλλα το iptables μου παραπονιεται για "invalid syntax".
Υποθετω λοιπον οτι μαλλον κατι δεν κολλαει με το Slack.
Γι'αυτο ρωταω, επειδη για να παιξει αντικατεστησα το $CHAIN με OUTPUT.

Τωρα εχω αυτο :




> #!/bin/sh
> 
> # netfilter section
> 
> iptables -t mangle -F
> 
> # Telnet, ssh & ftp
> 
> iptables -A OUTPUT -t mangle -p tcp --sport ssh -j TOS --set-tos Minimize-Delay
> ...


Και επειδη ειχα παρομοιο προβλημα με το 1ο script, το εφτιαξα ετσι :




> if [ -z "$1" ]; then
> echo "You must specify an interface name. eg. eth0"
> exit 1
> fi
> 
> tc qdisc del dev $1 root >/dev/null 2>&1
> 
> tc qdisc add dev $1 root handle 1: prio
> 
> ...


Το καλω ως `traffshape.up ethX` για καθε interface.

Τι λες?

----------


## Achille

Ξαναδοκίμασε το δικό μου και αντικατέστησε στην πρώτη γραμμή το shell με /bin/bash. Μάλλον εκεί είναι το πρόβλημα.

----------


## spirosco

Ειχες δικιο για το /bin/bash ( #!/bin/bash για την ακριβεια)

Στο 2ο script φαινεται που δεν του αρεσαν τα "\" και εβγαζε αυτο :



> Bad argument ` '
> Try `iptables -h' or 'iptables --help' for more information.
> /bin/test1: line 11: -j: command not found


Ετσι τελικα δουλευουν και τα δυο (Slackware 9.1) :




> *#!/bin/bash*
> INTERFACES=$*
> 
> # traffic shaping section
> 
> for IFACE in $INTERFACES; do
> 
> tc qdisc del dev $IFACE root >/dev/null 2>&1
> 
> ...





> *#!/bin/bash*
> # netfilter section
> 
> iptables -t mangle -F
> 
> for CHAIN in PREROUTING OUTPUT; do
> 
> # Telnet, ssh & ftp
> 
> ...


Και το αποτελεσμα:




> ~# tc qdisc
> qdisc sfq 30: dev eth0 limit 128p quantum 1514b perturb 10sec
> qdisc sfq 20: dev eth0 limit 128p quantum 1514b perturb 10sec
> qdisc sfq 10: dev eth0 limit 128p quantum 1514b perturb 10sec
> qdisc prio 1: dev eth0 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
> qdisc sfq 30: dev eth1 limit 128p quantum 1514b perturb 10sec
> qdisc sfq 20: dev eth1 limit 128p quantum 1514b perturb 10sec
> qdisc sfq 10: dev eth1 limit 128p quantum 1514b perturb 10sec
> qdisc prio 1: dev eth1 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
> ...

----------

