Gestione del traffico
Finalmente possiamo creare lo script per la gestione del traffico. In questo caso eviterò la teoria, dato che è tutto spiegato nei documenti indicati precedentemente (li avete letti, giusto?)
Procederemo con il creare tre script, uno per iptables per marchiare i pacchetti dati in base alla loro porta di provenienza, uno per il controllo del traffico (tc) in maniera da differenziare le priorità dei pacchetti in base al loro marchio, e uno per resettare lo stato.
Prima di tutto torniamo alla nostra iptables:
- cd /home/myname
- mkdir shaping
- cd shaping
- iptables-save > blank_iptables
ora creiamo il file di testo:
- vi marking_packets.sh
Dovrebbe assomigliare a questo:
Mine looks a bit like this:
MARKPRIO1="1"
# Setting priority marks
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --sport 80 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --sport 139 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --sport 138 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --sport 137 -j MARK --set-mark $MARKPRIO1
Tutto questo marca il traffico SSH, HTTP e Samba come "alta priorità". Tutto il resto è ignorato. Salviamo il file e rendiamo eseguibile con il seguente comando:
- chmod +x marking_packets.sh
Ora creiamo il file chiamato iptables_quotas.sh, che assomiglierà a questo:
#Constants
# Interface you want to do shaping on
# eth2, eth1 for direct connection; ppp0 or so for dsl
# and other dialup connections (check ifconfig)
IFACE=eth0
# Priority marks
MARKPRIO1="1"
# Rates
LAN_RATE="100mbit"
P2PRATE="200kbit"
PRIORATE4="100kbit"
# Quantum
QUANTUM1="1200"
QUANTUM4="150"
# Burst
BURST1="0k"
BURST4="0k"
CBURST1="0k"
CBURST4="0k"
# Set queue length for IFACE
ifconfig $IFACE txqueuelen 16
# Specify queue discipline
tc qdisc add dev $IFACE root handle 1:0 htb default 104 r2q 1
# Set root class
tc class add dev $IFACE parent 1:0 classid 1:1 htb rate $LAN_RATE burst $BURST1
cburst $CBURST1
# Specify sub classes
tc class add dev $IFACE parent 1:1 classid 1:101 htb rate $LAN_RATE ceil $LAN_RATE
quantum $QUANTUM1 burst $BURST1 cburst $CBURST1 prio 0
tc class add dev $IFACE parent 1:1 classid 1:104 htb rate $PRIORATE4 ceil $P2PRATE
quantum $QUANTUM4 burst $BURST4 cburst $CBURST4 prio 3
# Filter packets
tc filter add dev $IFACE parent 1:0 protocol ip prio 0 handle $MARKPRIO1 fw
classid 1:101
tc filter add dev $IFACE parent 1:0 protocol ip prio 3 handle $MARKPRIO4 fw
classid 1:104
# Add queuing disciplines
tc qdisc add dev $IFACE parent 1:101 sfq perturb 16 quantum $QUANTUM1
tc qdisc add dev $IFACE parent 1:104 sfq perturb 16 quantum $QUANTUM4
Ora rendiamolo eseguible come il file precedente. Se volete resettare iptable e tc, potete utilizzare lo script seguente:
IFACE=eth0
tc qdisc del dev $IFACE root 2> /dev/null > /dev/null
tc class del dev $IFACE root 2> /dev/null > /dev/null
tc filter del dev $IFACE root 2> /dev/null > /dev/null
iptables-restore < blank_iptables
Ora avviamo i due script:
- ./marking_packets.sh
- ./iptables_quotas.sh
Ecco fatto! Se avete concluso tutto correttamente non appariranno ne errori ne avvisi. Potete controllare il traffico impostando, per esempio, il LAN_RATE a 10kbit e cercare di copiare un file dall'xbox tramite la rete, e noterete quanto è lento.
Complimenti, ecco che avete per le mani un potente NAS. Ci sono molte cose che possono essere fatte con questo progetto. Potete utilizzare due grossi hard disk anziché un drive da 2.5". Perché non aggiungere anche le funzionalità RAID? O magari abbinare un modem USB per donare alla Xbox le funzionalità di router! Insomma, le possibilità sono infinite.