1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

QoS por HTB + Iptables

Discussão em 'Dúvidas e Suporte Técnico - GNU/Linux & *nix' iniciada por redalert, 13 de Outubro de 2007. (Respostas: 4; Visualizações: 3409)

  1. redalert

    redalert Folding Member

    Boas.

    Estou a tentar implementar um sistema de Quality-of-Service em minha casa:

    [​IMG]

    O servidor está a routear internet (4096/256 kbps) para a interface eth1. A eth2 não está a ser usada de momento, será para fazer bridge com outra LAN.

    A ideia é tratar o tráfego que irá sair pela eth0, vindo da eth1 e do próprio server, de modo a que o serviço de VoIP não seja afectado por P2P ou qualquer outro tipo de tráfego: http, ftp, etc. Para isso, implementei QoS com base em HTB:


    Código:
    #!/bin/bash
    
    # QoS VS 1.00
    # tc -s -d class show dev eth0
    
    IF_EXTERNA=eth0
    IF_INTERNA=eth1
    
    LIMITE_UPSTREAM=224kbit
    LIMITE_UPSTREAM_BT=205kbit
    
    
    function start()
    {
    echo ""
    echo "**************************************"
    echo "*		QoS VS 1.00	*		    "
    echo "*		Uptream = $LIMITE_UPSTREAM	*"
    echo "*		BitTorrent = $LIMITE_UPSTREAM_BT 	*"
    echo "**************************************"
    echo ""
    echo ""
    
    # Priority marks
    MARKPRIO1="0x1"
    MARKPRIO2="0x2"
    MARKPRIO3="0x3"
    MARKPRIO4="0x4"
    
    # Load modules
    modprobe sch_htb
    
    # Delete Queue Disciplines
    tc qdisc del dev $IF_EXTERNA root 2> /dev/null > /dev/null
    
    # Specify queue discipline
    tc qdisc add dev $IF_EXTERNA root handle 1:0 htb default 30
    
    # Create Root Class
    tc class add dev $IF_EXTERNA parent 1:0 classid 1:1 htb rate $LIMITE_UPSTREAM ceil $LIMITE_UPSTREAM
    
    # Create Sub Classes
    tc class add dev $IF_EXTERNA parent 1:1 classid 1:10 htb rate 128kbit ceil $LIMITE_UPSTREAM prio 1
    tc class add dev $IF_EXTERNA parent 1:1 classid 1:20 htb rate 100kbit ceil $LIMITE_UPSTREAM prio 2
    tc class add dev $IF_EXTERNA parent 1:1 classid 1:30 htb rate 1kbit ceil $LIMITE_UPSTREAM_BT prio 3
    
    # Filter packets
    tc filter add dev $IF_EXTERNA parent 1:0 protocol ip prio 1 handle $MARKPRIO1 fw classid 1:10
    tc filter add dev $IF_EXTERNA parent 1:0 protocol ip prio 2 handle $MARKPRIO2 fw classid 1:20
    tc filter add dev $IF_EXTERNA parent 1:0 protocol ip prio 3 handle $MARKPRIO3 fw classid 1:30
    
    # Add queuing disciplines
    tc qdisc add dev $IF_EXTERNA parent 1:10 sfq perturb 10
    tc qdisc add dev $IF_EXTERNA parent 1:20 sfq perturb 10
    tc qdisc add dev $IF_EXTERNA parent 1:30 sfq perturb 10
    
    
    
    echo ""
    echo "STARTED!!!!!!!!!!!"
    echo ""
    }
    
    
    function stop()
    {
    tc qdisc del dev $IF_EXT root 2> /dev/null > /dev/null
    tc qdisc del dev $IF_INT root 2> /dev/null > /dev/null
    
    echo ""
    echo "STOPED!!!!!!!!!!!"
    echo ""
    
    }
    
    
    function restart()
    {
    stop
    start
    }
    
    
    case "$1" in
    'start')
    start
    ;;
    'restart')
    restart
    ;;
    'stop')
    stop
    ;;
    *)
    echo "usage: start|restart|stop"
    esac
    
    Código:
    MARKPRIO1="0x1"
    MARKPRIO2="0x2"
    MARKPRIO3="0x3"
    
    IP_PAP2T="192.168.1.10"
    P2P_PORT="53666"
    
    IF_EXTERNA=eth0
    IF_INTERNA=eth1
    
    # Reset rules in mangle table
    iptables -F -t mangle
    
    # Setting priority marks
    
    # Priority 1
    # ICMP
    iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark $MARKPRIO1
    
    # DNS
    iptables -t mangle -A PREROUTING -p tcp --dport 53 -j MARK --set-mark $MARKPRIO1
    
    # NTP
    iptables -t mangle -A PREROUTING -p tcp --dport 123 -j MARK --set-mark $MARKPRIO1
    
    # VoIP
    iptables -t mangle -A PREROUTING -s $IP_PAP2T -j MARK --set-mark $MARKPRIO1
    
    # CS-Source
    iptables -t mangle -A PREROUTING -p tcp --dport 1200 -j MARK --set-mark $MARKPRIO1
    iptables -t mangle -A PREROUTING -p tcp --dport 27000:27015 -j MARK --set-mark $MARKPRIO1
    iptables -t mangle -A PREROUTING -p tcp --dport 27020:27039 -j MARK --set-mark $MARKPRIO1
    iptables -t mangle -A PREROUTING -p udp --dport 1200 -j MARK --set-mark $MARKPRIO1
    iptables -t mangle -A PREROUTING -p udp --dport 27000:27015 -j MARK --set-mark $MARKPRIO1
    iptables -t mangle -A PREROUTING -p udp --dport 27020:27039 -j MARK --set-mark $MARKPRIO1
    
    
    # Non TCP
    #iptables -t mangle -A PREROUTING -p ! tcp -j MARK --set-mark $MARKPRIO1
    
    # ********************************************************************************
    
    # Priority 2
    # HTTP
    iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark $MARKPRIO2
    iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark $MARKPRIO2
    
    # HTTPS
    iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark $MARKPRIO2
    
    # Proxy
    iptables -t mangle -A PREROUTING -p tcp --dport 3128 -j MARK --set-mark $MARKPRIO2
    
    
    # ********************************************************************************
    
    # Priority 3
    # P2P
    iptables -t mangle -A PREROUTING -p tcp --sport $P2P_PORT -j MARK --set-mark $MARKPRIO3
    iptables -t mangle -A PREROUTING -p tcp --dport $P2P_PORT -j MARK --set-mark $MARKPRIO3
    
    
    
    echo ""
    echo " ******* DONE!!! ******* "
    echo ""
    
    O problema é que isto não está a funcionar bem. Se reduzir a "rate" da classe 1:30, por exemplo, para 2kbps, "deixo de ter" internet, quer no servidor, quer na restante rede. É estranho, dado que essa classe não afecta HTTP e DNS (1:20 e 1:10, respectivamente)!

    A somar a isto, o serviço de VoIP apresenta lag aproximadamente de 1 segundo se, no servidor, estiver com P2P a "upar" a 25KB/s.

    Agradeço ajuda. :sad:


    [[]]

    PS: Todos os IPs são atribuidos por DHCP, estando os referênciados no esquema reservados por MACADDRESS.
     
    Última edição: 13 de Outubro de 2007
  2. APLinhares

    APLinhares OpenSource Moderator
    Staff Member

    eu andei a estudar 1 solução semelhante, seguindo este guia. Ve se ajuda.
    (e este, 1 pco + complexo)
     
  3. redalert

    redalert Folding Member

    Baseei-me nesses 2 e mais em 1 outro tutorial. O problema é que o processamento do tráfego não está a trabalhar. :confused:


    Tks.

    [[]]
     
  4. xupetas

    xupetas Banido

    ha outra hipotese. conheces o mastershaper? é exactamente o q procuras com a vantagem de ter uma gui por http
     
  5. redalert

    redalert Folding Member

    Gosto de "fazer à unha". :D Mas vou dar uma espreitadela à mesma. Tks. ;)

    Já descobri o problema do código. Apenas classifiquei o tráfego DNS por tcp como prioritário, sendo a maioria deste por UDP, que estava classificado por default na class 1:30. ;)


    [[]]
     

Partilhar esta Página