Priorizar tráfico – QoS
El día de hoy se presentó el caso de un amigo que necesitaba priorizar el tráfico entre sus oficinas. La calidad de los enlaces ADSL que posee no es buena, la latencia es alta y en horas punta la oficina sucursal tiene problemas para conectarse a los recursos de la oficina principal.
Como el aplicativo tiene algunas deficiencias no es posible conectarse mediante el cliente y hacer una consulta SQL limpia, por ello debe usar una conexión Terminal Service, aquí el script que elaboré para priorizar el tráfico y asegurar anchos de banda mínimos:
——————————————————————————————-
root@fw.server:/# cat /root/qos_servidor
#! /bin/bash
DEVWAN=”ppp0″
DEVTUN0=”tun0″
IPT=”iptables -t mangle”
TC=”/sbin/tc”
###Gestion Ancho de Banda###################
$TC qdisc del dev $DEVWAN root
$TC qdisc del dev $DEVTUN0 root
$IPT -F
$IPT -X
$TC qdisc add dev $DEVWAN root handle 1: htb default 11
$TC qdisc add dev $DEVTUN0 root handle 1: htb default 11
$TC class add dev $DEVWAN parent 1: classid 1:1 htb rate 150kbit ceil 150kbit
$TC class add dev $DEVTUN0 parent 1: classid 1:1 htb rate 100kbit ceil 100kbit
#Banda WAN
$TC class add dev $DEVWAN parent 1:1 classid 1:10 htb rate 110kbit ceil 150kbit prio 1
$TC qdisc add dev $DEVWAN parent 1:10 handle 10: sfq perturb 10
$TC filter add dev $DEVWAN parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
$TC class add dev $DEVWAN parent 1:1 classid 1:11 htb rate 40kbit ceil 150kbit prio 2
$TC qdisc add dev $DEVWAN parent 1:11 handle 11: sfq perturb 10
$TC filter add dev $DEVWAN parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
#Banda tun0
$TC class add dev $DEVTUN0 parent 1:1 classid 1:10 htb rate 70kbit ceil 100kbit prio 1
$TC qdisc add dev $DEVTUN0 parent 1:10 handle 10: sfq perturb 10
$TC filter add dev $DEVTUN0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
$TC class add dev $DEVTUN0 parent 1:1 classid 1:11 htb rate 30kbit ceil 100kbit prio 2
$TC qdisc add dev $DEVTUN0 parent 1:11 handle 11: sfq perturb 10
$TC filter add dev $DEVTUN0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
#Conexiones iniciales
$IPT -A PREROUTING -m tos –tos Minimize-Delay -j TOS –set-tos 0×10
$IPT -A PREROUTING -m tos –tos Minimize-Delay -j RETURN
$IPT -A PREROUTING -m tos –tos Minimize-Cost -j TOS –set-tos 0×02
$IPT -A PREROUTING -m tos –tos Minimize-Cost -j RETURN
$IPT -A PREROUTING -m tos –tos Maximize-Throughput -j TOS –set-tos 0×08
$IPT -A PREROUTING -m tos –tos Maximize-Throughput -j RETURN
$IPT -A OUTPUT -m tos –tos Minimize-Delay -j TOS –set-tos 0×10
$IPT -A OUTPUT -m tos –tos Minimize-Delay -j RETURN
$IPT -A OUTPUT -m tos –tos Minimize-Cost -j TOS –set-tos 0×02
$IPT -A OUTPUT -m tos –tos Minimize-Cost -j RETURN
$IPT -A OUTPUT -m tos –tos Maximize-Throughput -j TOS –set-tos 0×08
$IPT -A OUTPUT -m tos –tos Maximize-Throughput -j RETURN
$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN
$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN
$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j TOS –set-tos 0×10
$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN
$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j MARK –set-mark 1
$IPT -A OUTPUT -p tcp –tcp-flag SYN,ACK,RST SYN -j RETURN
#SSH
$IPT -A PREROUTING -p tcp –dport 22 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –dport 22 -j RETURN
$IPT -A PREROUTING -p tcp –dport 22 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –dport 22 -j RETURN
$IPT -A OUTPUT -p tcp –sport 22 -j TOS –set-tos 0×10
$IPT -A OUTPUT -p tcp –sport 22 -j RETURN
$IPT -A OUTPUT -p tcp –sport 22 -j MARK –set-mark 1
$IPT -A OUTPUT -p tcp –sport 22 -j RETURN
$IPT -A OUTPUT -p tcp –dport 22 -j TOS –set-tos 0×10
$IPT -A OUTPUT -p tcp –dport 22 -j RETURN
$IPT -A OUTPUT -p tcp –dport 22 -j MARK –set-mark 1
$IPT -A OUTPUT -p tcp –dport 22 -j RETURN
#TS
$IPT -A PREROUTING -p tcp –sport 3389 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –sport 3389 -j RETURN
$IPT -A PREROUTING -p tcp –sport 3389 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –sport 3389 -j RETURN
$IPT -A PREROUTING -p tcp –dport 3389 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –dport 3389 -j RETURN
$IPT -A PREROUTING -p tcp –dport 3389 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –dport 3389 -j RETURN
#NetBios
$IPT -A PREROUTING -p tcp –sport 445 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –sport 445 -j RETURN
$IPT -A PREROUTING -p tcp –sport 445 -j RETURN
$IPT -A PREROUTING -p tcp –sport 445 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –sport 445 -j RETURN
$IPT -A PREROUTING -p tcp –dport 445 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p tcp –dport 445 -j RETURN
$IPT -A PREROUTING -p tcp –dport 445 -j MARK –set-mark 1
$IPT -A PREROUTING -p tcp –dport 445 -j RETURN
#ICMP
$IPT -A PREROUTING -p icmp -j TOS –set-tos 0×10
$IPT -A PREROUTING -p icmp -j RETURN
$IPT -A PREROUTING -p icmp -j MARK –set-mark 1
$IPT -A PREROUTING -p icmp -j RETURN
$IPT -A OUTPUT -p icmp -j TOS –set-tos 0×10
$IPT -A OUTPUT -p icmp -j RETURN
$IPT -A OUTPUT -p icmp -j MARK –set-mark 1
$IPT -A OUTPUT -p icmp -j RETURN
#DNS
$IPT -A PREROUTING -p udp –dport 53 -j TOS –set-tos 0×10
$IPT -A PREROUTING -p udp –dport 53 -j RETURN
$IPT -A PREROUTING -p udp –dport 53 -j MARK –set-mark 1
$IPT -A PREROUTING -p udp –dport 53 -j RETURN
$IPT -A OUTPUT -p udp –dport 53 -j TOS –set-tos 0×10
$IPT -A OUTPUT -p udp –dport 53 -j MARK –set-mark 1
$IPT -A OUTPUT -p udp –dport 53 -j RETURN
———————————————————————————————-
Como puede verse, se posee una interfaz ppp0 -enlace ADSL-, una interfaz tun0 que interconecta ambas oficinas.
Como dato importante se observa que el ancho de banda de subida declarado sobre ppp0 es de 150Kbps, como sobre la misma interfaz se crea la interfaz virtual tun0 aquí genero otra banda y la acoto a 100Kbps. Genero dos bandas, la banda 10 con prioridad máxima -1- y la banda 11 con prioridad 2 y dónde pasará todo lo que no se encuentre declarado en el script.
La priorización de tráfico en este caso es para conexiones 3389 -terminal service, icmp, dns- sé que hay algunas lineas demás -innecesarias- pero no interfieren con lo que se desea lograr. Otro dato importante es que en la oficina principal también inserté un script similar para asegurar la priorización en ambos lados.
El script sirve para muchos casos, sólo se debe modificar lo necesario y si hay alguna duda por parte del alguien que lea esto pregunte o lea en google.