[technique] Partage de bande passante sur ligne ADSL
Cyril
popolinux at gmail.com
Lun 5 Déc 10:52:01 CET 2011
Bonjour Laurent,
Merci pour ton travail.
Si je comprend bien :
* La QoS sur le débit descendant est en place sur Paris car c'est le
routeur Parisien qui collecte le flux et le renvoi par le biais du
tunnel VPN ?
* La QoS sur le débit descendant n'est pas encore gérée et doit être
placée sur le serveur de routage local qui envoi le flux de
données sur le GW à Paris ?
Dans le cas de St Gaudens, j'ai adapté un chouilla la syntaxe du script
pour garder une cohérence avec ceux déjà en place.
Je le met en fin de mail, pour toutes fins utiles.
Sinon, est-t-il possible de flusher toutes les règles TC ?
Ce serait intéressant pour mon script.
Petite remarque :
Pour tapstg tu as mis "RATE=11000kbit" et pour les autres
"DOWN=5500kbit", sans doute une erreur ?
-----
Script :
#!/bin/bash
IPTABLES=/sbin/iptables
ID_IP_QOS=1
function init_setup
{
ip route add 10.0.0.0/24 dev eth0 table 200
ip route add default via 10.0.0.253 table 200
ip route add 91.224.148.1/32 via 10.0.0.253
openvpn --mktun --dev-type tap --dev tapstg
ip link set tapstg up
openvpn --dev-type tap --dev tapstg --comp-lzo yes --cipher
none --proto udp --verb 3 --daemon --keepalive 10 30 --persist-tun
--local 10.0.0.221 --remote 91.224.148.1 65005 --secret
/root/static-65005.key --log-append /root/vpn-tapstg.log --mssfix 1400
--fragment 1400
#--log /dev/shm/vpn-65005.log
ip addr add 91.224.148.7/31 dev tapstg
echo 1 > /proc/sys/net/ipv4/ip_forward
ip r add 0/1 via 91.224.148.6
ip r add 128/1 via 91.224.148.6
}
function flush
{
# Flush table NAT
/sbin/iptables -t nat -F
# Reset table conntrack
/usr/sbin/conntrack -F
# Vide la conf DHCP
echo '' > /root/dhcp-list.conf
echo '' > /var/www/ip2monitor.list
echo '' > /etc/hosts_tetaneutral
}
function ip_mapping
{
local ip_private=$1
local ip_public=$2
local mac_src=$3
local description=$4
local monitor=$5
# Routage
ip a add $ip_public/32 dev tapstg
iptables -t nat -A PREROUTING -d $ip_public -j DNAT
--to-destination $ip_private
iptables -t nat -A POSTROUTING -s $ip_private -j SNAT
--to-source $ip_public
# Ecriture de la config DHCP
{
echo "host $description {"
echo " hardware ethernet $mac_src;"
echo " fixed-address $ip_private;"
echo "}"
} >> /root/dhcp-list.conf
# Ecriture dans la lite des IP ? monitorer
if [ $monitor = "yes" ]; then
echo $ip_private >> /var/www/ip2monitor.list
fi
# Ecriture du fichier hosts temporaire
{
echo "$ip_public $description"
} >> /etc/hosts_tetaneutral
# Ajout de la QoS
qos_by_ip_add_ip $ID_IP_QOS $ip_public 'src' 'tapstg' '700kbit'
export ID_IP_QOS=$((ID_IP_QOS + 1))
}
function create_node
{
local ip_local=$1
local mac=$2
local description=$3
local monitor=$4
# Ecriture de la config DHCP
{
echo "host node-$description {"
echo " hardware ethernet $mac;"
echo " fixed-address $ip_local;"
echo "}"
} >> /root/dhcp-list.conf
# Ecriture dans la lite des IP ? monitorer
if [ $monitor = "yes" ]; then
echo $ip_local >> /var/www/ip2monitor.list
fi
}
function dhcp_write_conf
{
{
echo "ddns-update-style none;"
echo "default-lease-time 600;"
echo "max-lease-time 86400;"
echo "log-facility local7;"
echo "subnet 172.16.0.0 netmask 255.255.0.0 {"
echo " option domain-name \"tetaneutral.net\";"
echo " option domain-name-servers 8.8.8.8;"
echo " option routers 172.16.0.254;"
echo " $(cat /root/dhcp-list.conf)";
echo "}"
} > /etc/dhcp/dhcpd.conf
/etc/init.d/isc-dhcp-server restart
}
function qos_by_ip_init {
local dev=$1
local rate=$2
tc qdisc add dev $dev root handle 1: htb default 1
tc class add dev $dev parent 1: classid 1:1 htb rate $rate
}
function qos_by_ip_add_ip {
local id_host=$1
local ip=$2
local dir=$3
local dev=$4
local rate=$5
echo "QoS IP $ip (id : $id_host) : $rate sur $dev";
tc class add dev $dev parent 1: classid 1:$id_host htb rate $rate
tc filter add dev $dev protocol ip parent 1:0 prio 1 u32 match
ip $dir $ip flowid 1:$id_host
}
function maj_hosts
{
{
cat /etc/hosts_system
cat /etc/hosts_tetaneutral
} > /etc/hosts
}
# Parsing des arguments
if [ "--setup" = "$1" ]
then init_setup
fi
# Flush
flush
# Init la file QoS
qos_by_ip_init 'tapstg' '700kbit'
# Appel de la config
source /root/config.sh
# Ecriture de la config
dhcp_write_conf
# Ecriture du fichier hosts
maj_hosts
Le 04/12/2011 22:12, Laurent GUERBY a écrit :
> Bonsoir,
>
> Comme expliqué ici :
>
> http://lists.tetalab.org/pipermail/tetaneutral/2011-April/000129.html
>
> L'algorithme de gestion de file d'attente par défaut va equitablement
> repartir la bande passante par flux. Lors du partage d'une ligne ADSL
> par plusieurs utilisateurs un utilisateur ouvrant plus de connexions
> simultanées aura plus de flux et donc plus de bande passante, ce qui
> n'est pas tres "juste".
>
> De plus sur une ligne ADSL dépasser la capacité en bande passante va
> entrainer un ping tres elevé a cause des buffer des modems et routeurs,
> il est donc plus judicieux de limiter a la source le debit a une valeur
> legerement inferieure a la capacité de la ligne.
>
> Sur une ligne ADSL normale l'utilisateur va pouvoir controler facilement
> le debit montant mais plus difficilement le débit descendant qui depends
> de la politique de son FAI. Dans le cas de tetaneutral.net l'integralité
> du traffic descendant passe par notre routeur a Paris qui l'envoie dans
> un tunnel openvpn tap vers l'ADSL, nous pouvons donc le controler
> finement.
>
> J'ai mis quelques liens ici :
>
> http://chiliproject.tetaneutral.net/projects/tetaneutral/wiki/Buffer_Bloat
>
> Je propose d'appliquer le script suivant sur gw a Paris sur les trois
> tunnels (tapstg = Saint-Gaudens, tapthd = trebons.net, tapmon = Mones),
> et en changeant DIR et RATE sur les machines locales (upload
> a determiner).
>
> La seule astuce est l'utilisation du dernier octet de l'IP pour le
> classid (un nombre incrémenté aurait aussi fonctionné). Le script
> est relativement simple car la qdisc s'applique dans les deux
> sens sur les IP publiques directement (sauf erreur).
>
> <<
> function do_qos {
> tc qdisc add dev $DEV root handle 1: htb default 1
> tc class add dev $DEV parent 1: classid 1:1 htb rate $RATE
> for IP in $IP_LIST; do
> tc class add dev $DEV parent 1: classid 1:$IP htb rate $RATE
> tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip $DIR 91.224.148.$IP flowid 1:$IP
> done
> }
>
> DIR=dst #on gw then RATE= ADSL download speed
> #DIR=src #on local machine then RATE= ADSL upload speed
>
> DEV=tapstg
> RATE=11000kbit
> IP_LIST=$(seq 129 144)
> do_qos
>
> DEV=tapthd
> DOWN=5500kbit
> IP_LIST=$(seq 194 207)
> do_qos
>
> DEV=tapmon
> DOWN=600kbit
> IP_LIST=$(seq 114 115)
> do_qos
> Commentaires et suggestions bienvenus,
>
> Sincèrement,
>
> Laurent
>
>
> _______________________________________________
> technique mailing list
> technique at lists.tetaneutral.net
> http://lists.tetaneutral.net/listinfo/technique
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://lists.tetaneutral.net/pipermail/technique/attachments/20111205/106ea2fd/attachment.htm>
Plus d'informations sur la liste de diffusion technique