teoría-tos: (0.03) Al usar el Linux como router/gateway/firewall el manipular el campo TOS de las cabeceras IP nos permite variar la prioridad de los paquetes 0.02 7.10.2000 0.03 9.6.2001 TOS y 2.4 ###POR HACER Revisar prioridades en 2.4 Resumen de contenido: -------------------- TOS No modificar el bit 1 del TOS CONCLUSIONES: MANIPULACIÓN DE TOS: MAS AYUDA: Anexo-I El campo TOS en el kernel TOS TOS -Type of Service- es el segundo byte en la cabecera IP, y nos permite fijar prioridades a los paquetes en las reglas de filtrado de paquetes Podemos por ejemplo dar más prioridad a http que a ftp de forma que una descarga ftp continuada no ralentice la navegación web De este byte nos interesan tres bits, ya que el bit "High Reliability" no parece tener uso en los kernel de Linux (2.0, 2.2, 2.4): Low delay (prioridad alta) mascara 0x10 Low delay + High Throughput (medio-alta) mascara 0x18 (solo kernel >=2.2) Ningún bit TOS (prioridad normal) High Throughput (prioridad baja) mascara 0x08 Min cost (prioridad mínima) mascara 0x02 (solo kernel >=2.2) No modificar el bit 1 del TOS El man ipchains avisa de no modificar el bit 1 de TOS, esto lo podemos hacer usando como andmask 0x01 CONCLUSIONES: - Si es suficiente con tres prioridades (normal, alta y baja) basta con los bits TOS LOWDELAY y THROUGHPUT tanto en 2.0, como en 2.2 - Si hacen falta cinco prioridades, es preciso utilizar un kernel 2.2 MANIPULACIÓN DE TOS: ---Ejemplo con LOWDELAY--- kernel comando 2.0 ipfwadm -t 0x01 0x10 2.2 ipchains -t 0x01 0x10 # Con el primer valor se hace una operación AND, # ---son CERO los bits que queremos poner a CERO--- # Con el segundo valor se hace una operación XOR, # ---son UNO los bits que queremos poner a UNO--- 2.4 iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 ... MAS AYUDA: RFCs: paquete doc-rfc en /usr/doc/doc-rfc, en general muy técnicos RFC791 (en Inglés) Definición del protocolo IP, en el capítulo 3 (SPECIFICATION) están todos los campos y para que sirven RFC1349 (en Inglés) Type of Service in the Internet Protocol Suite man ipchains (busca: -t, --TOS andmask xormask) Anexo-I El campo TOS en el kernel ---------------- kernel 2.0 (en archivo /net/ipv4/ip_forward.c) IPTOS_LOWDELAY -> SOPRI_INTERACTIVE #prioridad alta IPTOS_THROUGHPUT -> SOPRI_BACKGROUND #prioridad baja resto -> SOPRI_NORMAL #prioridad media ---------------- kernel 2.2 definición de bits de TOS: include/linux/ip.h IPTOS_* prioridades según TOS: net/ipv4/route.c TC_PRIO_* importancia de cada prioridad: include/linux/pkt_sched.h TOS: Mask Prioridad Prioridad ---- ---- --------- --------- IPTOS_LOWDELAY 0x10 TC_PRIO_INTERACTIVE 6 LOWDELAY + THROUGHPUT 0x18 TC_PRIO_INTERACTIVE_BULK 4 - - TC_BESTEFFORT (0) IPTOS_THROUGHPUT 0x08 TC_PRIO_BULK 2 IPTOS_MINCOST 0x02 TC_PRIO_FILLER 1 Sin uso: IPTOS_RELIABILITY 0x04 - ---------------- kernel 2.4 = kernel 2.2 definición de bits de TOS: include/linux/ip.h IPTOS_* #define IPTOS_TOS_MASK 0x1E #define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) #define IPTOS_LOWDELAY 0x10 #define IPTOS_THROUGHPUT 0x08 #define IPTOS_RELIABILITY 0x04 #define IPTOS_MINCOST 0x02 prioridades según TOS: net/ipv4/route.c -> ip_tosprio[16] (TC_PRIO_*) TOS TCP_PRIO_* value __u8 ip_tos2prio[16] = { 0 0x00 TC_PRIO_BESTEFFORT, 0 1 0x02 ECN_OR_COST(FILLER), 2 0x04 TC_PRIO_BESTEFFORT, 0 3 0x06 ECN_OR_COST(BESTEFFORT), 4 0x08 TC_PRIO_BULK, 2 5 0x0A ECN_OR_COST(BULK), 6 0x0C TC_PRIO_BULK, 2 7 0x0E ECN_OR_COST(BULK), 8 0x10 TC_PRIO_INTERACTIVE, 6 9 0x12 ECN_OR_COST(INTERACTIVE), A 0x14 TC_PRIO_INTERACTIVE, 6 B 0x16 ECN_OR_COST(INTERACTIVE), C 0x18 TC_PRIO_INTERACTIVE_BULK, 4 D 0x1A ECN_OR_COST(INTERACTIVE_BULK), E 0x1C TC_PRIO_INTERACTIVE_BULK, 4 F 0x1E ECN_OR_COST(INTERACTIVE_BULK) }; importancia de cada prioridad: include/linux/pkt_sched.h #define TC_PRIO_BESTEFFORT 0 /*better than 1 and 2*/ #define TC_PRIO_FILLER 1 #define TC_PRIO_BULK 2 #define TC_PRIO_INTERACTIVE_BULK 4 #define TC_PRIO_INTERACTIVE 6 #define TC_PRIO_CONTROL 7 #define TC_PRIO_MAX 15