30 de Agosto, 2004

Más calidad de servicio con Packet Filter

Ya expliqué en Calidad de servicio con Packet Filter como mejorar mucho la calidad de servicio de una máquina en Internet mediante la priorización de paquetes TCP ACK.

De esta forma podíamos subir y bajar datos a la vez a la máxima velocidad de nuestra linea tanto en la subida como en la bajada.

He intentado mejorar un poco la cosa, dando prioridad a las sesiones SSH tanto entrantes como salientes, así como al tráfico HTTP saliente de blackshell sobre cualquier otro tráfico. Esto es porque la semana pasada estuve descargando soft más de lo habitual y parece que la respuesta de blackshell se resentía.

La idea es añadir dos prioridades más a lo que ya tenía:

altq on $ext_if priq bandwidth 150Kb queue \
	{ qdef, qtcp_ack, qssh, qhttp }

# colas que ya estaban
queue qdef priority 1 priq(default)
queue qtcp_ack priority 7

# nuevas colas
queue qssh priority 6 priq(red)
queue qhttp priority 3

He renombrado las colas que ya tenía para que quedara más claro, por si alguien consulta la anotación anterior sobre los ACKs.

Las prioridades en PF para priq van del 0 al 15, siendo 0 ninguna prioridad, 1 la mínima, y 15 la máxima.

De esta forma conseguimos que las sesiones SSH vayan suaves sin importar el resto del tráfico, y por detrás, las respuestas a peticiones HTTP.

He puesto a subir un fichero grande a un FTP y a la vez a bajar otro desde otro FTP distinto. Gracias a la priorización de ACKs conseguimos máxima velocidad en los dos sentidos.

Ahora inicio una sesión SSH contra una máquina en Internet y se comporta casi como si los otros dos procesos no existieran. Más que suficiente para trabajar cómodamente. Quizás sería más efectivo emplear un scheduler (¿organizador?) por clases y repartir explícitamente el ancho de banda indicando mínimos, pero necesito prioridades para el tema de los ACKs.

Desde esa sesión SSH intento descargar un fichero grande de la web de blackshell, y consigo el máximo ancho de banda que puede dar blackshell con sus modestos 150Kbps (la subida del fichero por FTP se atasca hasta que detengo la petición HTTP).

Así que aparentemente las prioridades funcionan :).

Debido a que blackshell no es un servidor dedicado sino que hace de enrutador/cortafuegos para mi red local, las reglas no son perfectas, pero mostrando solo lo interesante tenemos:

# prioridad a TCP ACK
pass in on $ext_if proto tcp from any to $ext_if flags S/SA \
        keep state queue (qdef, qtcp_ack)
pass out on $ext_if proto tcp from $ext_if to any flags S/SA \
        keep state queue (qdef, qtcp_ack)

# ssh
pass out on $ext_if proto tcp from any to any port 22 \
        keep state queue qssh
pass in on $ext_if proto tcp from any to $ext_if port 22 flags S/SA \
        keep state queue qssh

# http
pass in on $ext_if proto tcp from any to $ext_if port 80 flags S/SA \
        keep state queue qhttp

Así cuando use algún programa P2P, esta web no se resentirá ;).

Anotación por Juan J. Martínez.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.