[GuadaWireless] Manual: "Navega Gracias a GuadaWireless" ....
Angel Martin Gonzalez
angelux en guadawireless.org
Mar Oct 16 22:41:38 CEST 2007
Siseñores que buenos soys!!!
Una muy buena currada. Enhorabuena a los implicados y como no muchas
gracias por prestarnos vuestro saber. ;-)
Salu2
ax.
Juan Miguel Alcarria Herrera wrote:
> El script de Rutas de usuarios hay que ponerlo en el cron, Saludos.
>
> -----Mensaje original-----
> De: guadawireless-bounces en guadawireless.net en nombre de Juan Miguel Alcarria Herrera
> Enviado el: mié 10/10/2007 19:26
> Para: lista en guadawireless.net
> CC:
> Asunto: [GuadaWireless] Manual: "Navega Gracias a GuadaWireless" ....
>
> Hola a todo os mando el manual que hemos hecho Alfonso y yo, esta un poco para "lerdos", que nadie se de por aludido ;-), pero es que tambien he aprovechado lo he publicado en otra pagina que si que hay un monton de "lerdos", ahi va:
>
> Lo que hacemos en este manual no es nada nuevo, ya que existe mucha documentación para realizarlo con squid y delay pools o con el mismo apache + iptables, lo curioso del manual es que lo consigamos hacer sin apoyarnos en grandes aplicaciones, es decir hacerlo funcionar en un router de 50 euros, con paquetes de nos mas de 100 KB.
>
> Sin más pasaremos a realizar todo lo necesario para Controlar el ancho de banda y a anunciar nuestra web.
>
> Dividiremos el manual en varios pasos, si solo os hace falta uno de los pasos pues ya sabéis, pasad de los demás y coged el que os haga falta.
>
> Comenzaremos realizando la parte en la cual enseñaremos al cliente nuestra pagina de bienvenida.
>
> Os cuento el funcionamiento del script que realizaremos, añadiremos una regla a iptables para que nos "contee" el numero de paquetes recibidos por el puerto 80, de esta forma solamente la primera petición del puerto 80 sera redirigida a nuestro servidor web con la pagina de Bienvenida, a partir de ahí no redirigiremos ninguna petición hasta que pasen 15 minutos (configurable). Pasados esos 15 minutos el contador se reinicializará y volveremos a redirigir la primera petición al puerto 80 para volver a anunciar al benefactor del ADSL. El funcionamiento es simple, cuando me conecto a la red wifi y abro mi navegador para visitar Google, no saldrá Google sino que nos saldrá la pagina de bienvenida con un botón que "refrescara" la conexión para lanzarme a la dirección a la que iba antes de salir la pagina.
>
> Crearemos otro script para mandar a los que abusen a otro servidor con otro tipo de bienvenida, mas bien malvenida y se redirigirá todo a esa malvenida, hasta que queramos.
>
> INSTALACIÓN DE LIGHTTPD y MÓDULOS PARA IPTABLES
>
> Necesitaremos el paquete lighttpd, este servidor web tiene la propiedad de poder "reescribir" la dirección, cosa que el pequeñisimo servidor web que trae openwrt no es capaz de hacer, así que le debemos instalar y preparar par su posterior utilización. Necesitaremos también los dos módulos que realizan lo que queremos
>
> Para instalarlo:
>
> root en openwrt:/# ipkg install lighttpd
> root en openwrt:/# ipkg install lighttpd-mod-rewrite
> root en openwrt:/# ipkg install lighttpd-mod-redirect
>
> Debemos configurar nuestro servidor web, para ello le pondremos a escuchar en el puerto 8080, no queremos que siempre que se entre a nuestra ip salga la bienvenida, solo cuando nosotros queramos.
>
> La instalación nos deja un archivo para configurar en /etc/ llamado lighttpd.conf copiémoslo y editémoslo:
>
> root en openwrt:/# cp /etc/lighttpd.conf /etc/lighttpd_bienvenida.conf
> root en openwrt:/# vi /etc/lighttpd_bienvenida.conf
>
> Descomentad el modulo rewrite, ojo con las comas.
> Decidle donde estará el document root, este sitio normalmente es un directorio dentro de /www, aquí es donde alojaremos la pagina de bienvenida, yo he puesto server.document-root = "/www_capta_clientes/"
>
> Configurad el server.port, sera el puerto donde escuchemos, por defecto escucha en el 80, yo lo pongo en el 8080:
>
> server.port = 8080
>
> Tendremos que decirle que reescriba cualquier dirección que venga detrás del dominio por index.html, o el nombre que tenga nuestra pagina de bienvenida, esto lo haremos para que si alguien entra por ejemplo a http://www.improvisa.com/index.php, le salga http://nuestrip/index.html, de la redirección del dominio se encargará iptables pero de reemplazar el nombre la pagina se tiene que encargar lighttpd. Lo haremos añadiendo esto al archivo de configuración, justo donde se encuentran los comentarios de como hacer el rewrite, buscad esto: #### url handling modules (rewrite, redirect, access) y lo añadís despues de los comentarios:
>
> url.rewrite = ( "^(.*)" => "/index.html" )
>
> Ya tenemos configurado el nuevo servidor solo nos falta lanzarlo, esto es solo para que probeis, ya que el script que haremos lo lanzara solo:
>
> root en openwrt:/# lighttpd -f /etc/lighttpd_bienvenida.conf
>
> Para instalar los módulos de Iptables haremos lo siguiente:
>
> root en openwrt:/# ipkg install iptables-mod-extra
> root en openwrt:/# ipkg install iptables-mod-nat
>
> CREACIÓN DE SCRIPT PARA REDIRECCIONAR PETICIONES A LOS BIENVENIDOS
>
> Muy bien ya tenemos creado el servidor hagamos ahora el script para que todo se ejecute como queremos. Asumiré que tenemos en distintas redes nuestra conexión de are local y el acceso a Internet, por ejemplo:
>
> Subred Internet: 192.168.0.0/24
> Subred Area Local: 172.16.0.0/24
>
> root en openwrt:/# vi /etc/init.d/capta_clientes
>
> ########## COMIENZO SCRIPT ##########
> #!/bin/sh
>
> Subred_internet=192.168.0.0/24 ##La que nos da acceso a Internet
> Segundos_reinicio_contador=900 # (15 minutos). Cuando es una imagen no hace nada, sólo que no se ve la imagen
> Numero_peticiones_redirigidas=1 # Asegurarse del número de peticiones al puerto 80 que tenemos que redirigir: 1 por la propia página más 1 por cada imagen de dicha página
> IP_servidor_web=172.16.0.1 ## O la ip del openwrt donde tenemos levantado el lighttpd
> Puerto_servidor_web=8080
> Accion_de_los_no_redirigidos=RETURN # Puede ser RETURN (continúa con las reglas posteriores) o ACCEPT (no continúa)
>
> status()
> {
> ps xa | grep lighttpd | grep -v grep
> iptables -L PREROUTING -n -v -t nat | grep Chain
> iptables -L PREROUTING -n -v -t nat | grep capta_clientes | grep -v Chain
> iptables -L capta_clientes -n -v -t nat
> }
>
> stop()
> {
> iptables -t nat -D PREROUTING -p TCP -s 0/0 -d 0/0 --dport 80 -j capta_clientes 2> /dev/null
> iptables -t nat -F capta_clientes 2> /dev/null
> iptables -t nat -X capta_clientes 2> /dev/null
>
> killall -9 lighttpd 2> /dev/null
> }
>
> restart()
> {
> stop
> sleep 1
>
> /usr/sbin/lighttpd -f /etc/lighttpd_bienvenida.conf
>
> # Necesario el paquete ipkg iptables-mod-extra
> insmod ipt_recent > /dev/null 2>&1
> # Necesario el paquete ipkg iptables-mod-nat
> insmod ipt_REDIRECT > /dev/null 2>&1
>
> # Creamos nuestra cadena nueva
> iptables -t nat -N capta_clientes
> # Excluimos a los rangos de IPs internas privadas
> iptables -t nat -A capta_clientes -s $Subred_internet -d 0/0 -j $Accion_de_los_no_redirigidos
> # Excluimos a los rangos de IPs internas que queramos, si no quieres excluir comenta
> iptables -t nat -A capta_clientes -s 0/0 -d 172.16.0.1 -j $Accion_de_los_no_redirigidos
> # Si el contador es mayor que uno (ya ha mostrado nuestra página) se sale de la cadena. A los X minutos se reinicia el contador
> iptables -t nat -A capta_clientes -s 0/0 -d 0/0 -p tcp --dport 80 -m state --state NEW -m recent --name contador --update --seconds $Segundos_reinicio_contador --hitcount $Numero_peticiones_redirigidas -j $Accion_de_los_no_redirigidos
> # Redirige a servidor web de localhost en el puerto indicado donde se muestra nuestra página para captar clientes ;-)
> iptables -t nat -A capta_clientes -s 0/0 -d 0/0 -p tcp --dport 80 -m state --state NEW -m recent --name contador --set -j REDIRECT --to-port $Puerto_servidor_web
> ###iptables -t nat -A capta_clientes -s 0/0 -d 0/0 -p tcp --dport 80 -m state --state NEW -m recent --name contador --set -j DNAT --to-destination $IP_servidor_web:$Puerto_servidor_web
>
> # Envía a nuestra cadena todas las peticiones web, luego se discierne si redirigirlas a nuestra página o no
> # Asegurarse de que esta misma regla se elimina en stop()
> iptables -t nat -A PREROUTING -p TCP -s 0/0 -d 0/0 --dport 80 -j capta_clientes
>
> status
> }
>
> case "$1" in
> status)
> status
> ;;
> stop)
> echo "Parando capta_clientes:"
> stop
> ;;
> start)
> echo "Reiniciando capta_clientes:"
> restart
> ;;
> restart)
> echo "Reiniciando capta_clientes:"
> restart
> ;;
> *)
> echo "Modo de uso: $0 (start|stop|restart|status)"
> exit 1
> ;;
> esac
>
> ########## FIN SCRIPT ##########
>
> Démosle permisos de ejecución:
>
> root en openwrt:/# chmod +x /etc/init.d/capta_clientes
>
> Muy bien de esta forma ya tenemos todo hecho, esta todo el script comentado si tenéis alguna duda al foro. Todas las peticiones salvo las excluidas pasaran cada 15 minutos por nuestro servidor web que esta escuchando en el puerto 8080.
>
> CREACIÓN DE SCRIPT PARA REDIRECCIONAR A LOS QUE ABUSAN
>
> Pues el funcionamiento es parecido pero sin contador, crearemos un script el cual añadirá una regla para la ip que le digamos y siempre sera redirigida a otro servidor web que lanzaremos en otro puerto.
>
> Configuraremos el nuevo servidor web en otro archivo de configuración:
>
> root en openwrt:/# cp /etc/lighttpd.conf /etc/lighttpd_bienvenida.conf
> root en openwrt:/# vi /etc/lighttpd_abuso.conf
>
> Descomentar el modulo redirect, no el rewrite como arriba, ojo con las comas
> Cambiad el puerto de escucha, el mi ahora es server.port = 8888
> Utilizare el mismo document_root pero con otra redirección en vez de sobreescribir, ya no lo pasare a index.html sino a abuso.html
> url.redirect = ("^/(.*)" => "http://direccionopenwrt/abuso.html")
>
> Para quitar a los que abusan lo único que hago es reiniciar, pero si queréis hacerlo para quitarlos con el propio script es fácil.
>
> root en openwrt:/# vi /etc/init.d/abuso
>
> ########## COMIENZO SCRIPT ##########
>
> #!/bin/sh
>
> if [ "$1" = "" ]; then
> echo "Modo de uso: $0 IP_ABUSADORA"
> exit 1
> fi
>
> /usr/sbin/lighttpd -f /etc/lighttpd_abuso.conf
>
> iptables -t nat -D PREROUTING -s $1 -d 0/0 -p tcp -j REDIRECT --to-port 8888 2> /dev/null
> iptables -t nat -A PREROUTING -s $1 -d 0/0 -p tcp -j REDIRECT --to-port 8888
>
> iptables -L PREROUTING -t nat -n -v
>
> ########## FIN SCRIPT ##########
>
> Démosle permisos de ejecución:
>
> root en openwrt:/# chmod +x /etc/init.d/abuso
>
> CREACIÓN DE SCRIPT PARA AÑADIR CONTROL DE TRAFICO
>
>
> Vale hasta ahora no teníamos control de trafico, ahora con este nuevo script y un par de módulos añadiremos el control deseado.
>
> Necesitaremos instalar TC y y kmod-sched
>
> root en openwrt:/# ipkg install tc
> root en openwrt:/# ipkg install kmod-sched
>
> Crearemos el Script , solo necesitaremos modificar el ancho que queremos modificar, en el ejemplo se están compartiendo 30 KB/s de bajada y 10 KB/S de subida.
>
> Para poder saber que sube y que baja de la red de internet, marcaremos los paquetes con iptables.
>
> root en openwrt:/# vi /etc/init.d/control_trafico
>
> ########## COMIENZO SCRIPT ##########
> #!/bin/sh
> #
> # Todos los anchos están del Kbps
> # ej. 25Kbps == 3.125KB/s
> #
> TC=/usr/sbin/tc
> DNLD=720Kbit # Límite de bajada
> DWEIGHT=240Kbit # Factor de Bajada
> UPLD=240KBit # Límite de Subida
> UWEIGHT=80Kbit # Factor de Subida
>
> IF_SALIDA=vlan0 # La pata de Internet
> IF_ENTRADA=eth1 # La pata de Guadawireless
>
> tc_start() {
>
> # Añadimos Módulos necesarios
>
> insmod sch_cbq
> insmod sch_prio
> insmod sch_htb
> insmod sch_sfq
> insmod sch_ingress
> insmod cls_tcindex
> insmod cls_fw
> insmod cls_route
> insmod cls_u32
>
>
> # Marcamos la Subida de paquetes que van a Internet
> iptables -t mangle -N MARCA_SUBIDA
> iptables -t mangle -A MARCA_SUBIDA -s 10.0.0.0/8 -d 172.16.0.0/16 -j RETURN
> iptables -t mangle -A MARCA_SUBIDA -s 10.0.0.0/8 -d 10.0.0.0/8 -j RETURN
> iptables -t mangle -A MARCA_SUBIDA -s 10.0.0.0/8 -d 0/0 -j MARK --set-mark 3
>
> iptables -t mangle -A FORWARD -s 10.0.0.0/8 -d 0/0 -j MARCA_SUBIDA
>
> # Marcamos los paquetes de bajada que vienen de Internet
> iptables -t mangle -N MARCA_BAJADA
> iptables -t mangle -A MARCA_BAJADA -s 10.0.0.0/8 -d 10.0.0.0/8 -j RETURN
> iptables -t mangle -A MARCA_BAJADA -s 172.16.0.0/16 -d 10.0.0.0/8 -j RETURN
> iptables -t mangle -A MARCA_BAJADA -s 0/0 -d 10.0.0.0/8 -j MARK --set-mark 4
>
> iptables -t mangle -A POSTROUTING -s 0/0 -d 10.0.0.0/8 -j MARCA_BAJADA
>
> # Creamos las colas para TC
>
> $TC qdisc add dev $IF_ENTRADA root handle 11: cbq bandwidth 100Mbit avpkt 1000 mpu 64
> $TC class add dev $IF_ENTRADA parent 11:0 classid 11:1 cbq rate $DNLD weight $DWEIGHT allot 1514 prio 1 avpkt 1000 bounded
> $TC filter add dev $IF_ENTRADA parent 11:0 protocol ip handle 4 fw flowid 11:1
>
> $TC qdisc add dev $IF_SALIDA root handle 10: cbq bandwidth 10Mbit avpkt 1000 mpu 64
> $TC class add dev $IF_SALIDA parent 10:0 classid 10:1 cbq rate $UPLD weight $UWEIGHT allot 1514 prio 1 avpkt 1000 bounded
> $TC filter add dev $IF_SALIDA parent 10:0 protocol ip handle 3 fw flowid 10:1
>
> }
>
> tc_stop() {
> #Borramos Módulos
>
> rmmod sch_cbq
> rmmod sch_prio
> rmmod sch_htb
> rmmod sch_sfq
> rmmod sch_ingress
> rmmod cls_tcindex
> rmmod cls_fw
> rmmod cls_route
> rmmod cls_u32
>
> #Borramos Colas de TC
>
> $TC qdisc del dev $IF_ENTRADA root
> $TC qdisc del dev $IF_SALIDA root
>
> # Borramos subida de Iptables
>
> iptables -t mangle -D FORWARD -s 10.0.0.0/8 -d 0/0 -j MARCA_SUBIDA
>
> iptables -t mangle -D MARCA_SUBIDA -s 10.0.0.0/8 -d 172.16.0.0/16 -j RETURN
> iptables -t mangle -D MARCA_SUBIDA -s 10.0.0.0/8 -d 10.0.0.0/8 -j RETURN
> iptables -t mangle -D MARCA_SUBIDA -s 10.0.0.0/8 -d 0/0 -j MARK --set-mark 3
>
> iptables -t mangle -X MARCA_SUBIDA
>
>
> # Borramos bajada de Iptables
>
> iptables -t mangle -D POSTROUTING -s 0/0 -d 10.0.0.0/8 -j MARCA_BAJADA
>
> iptables -t mangle -D MARCA_BAJADA -s 10.0.0.0/8 -d 10.0.0.0/8 -j RETURN
> iptables -t mangle -D MARCA_BAJADA -s 172.16.0.0/16 -d 10.0.0.0/8 -j RETURN
> iptables -t mangle -D MARCA_BAJADA -s 0/0 -d 10.0.0.0/8 -j MARK --set-mark 4
>
> iptables -t mangle -X MARCA_BAJADA
>
>
>
> }
>
> tc_restart() {
>
> tc_stop
> sleep 1
> tc_start
>
> }
>
> tc_show() {
>
> echo ""
> echo "$IF_ENTRADA:"
> $TC qdisc show dev $IF_ENTRADA
> $TC class show dev $IF_ENTRADA
> $TC filter show dev $IF_ENTRADA
> echo ""
>
> echo "$IF_SALIDA:"
> $TC qdisc show dev $IF_SALIDA
> $TC class show dev $IF_SALIDA
> $TC filter show dev $IF_SALIDA
> echo ""
>
> }
>
> case "$1" in
> start)
> echo -n "Activando control de Ancho de Banda: "
> tc_start
> echo "Hecho"
> ;;
> stop)
> echo -n "Parando control de Ancho de Banda: "
> tc_stop
> echo "Hecho"
> ;;
> restart)
> echo -n "Reiniciando control de Ancho de Banda "
> tc_restart
> echo "Hecho"
> ;;
> show)
> tc_show
> ;;
> *)
> echo "Modo de Uso: /etc/init.d/tc.sh {start|stop|restart|show}"
> exit 1
> ;;
> esac
> exit 0
> ########## FIN SCRIPT ##########
>
> Démosle permisos de ejecución:
>
> root en openwrt:/# chmod +x /etc/init.d/control_trafico
>
> Si os fijais la colocacion de los scripts la he hecho en /etc/init.d, para ejecutarlos al inicio debeis añadirlo en algun script de inicio, en mi caso me creo uno que se llama S99ultimo donde hago configuraciones finales.
>
> Bueno pues con esto podemos tranquilamente montarnos nuestra Red Compartida sin ningún miedo a quedarnos sin ADSL, simplemente darás tus 30 kb sino las estas utilizando.
>
> REDIRECCION DE RUTAS DE USUARIOS A PUERTA DE ENLACE CON INTERNET
>
> Solo nos falta redirigir a los usuarios de otros nodos de Guadawireless hacia el nodo que tiene el adsl compartido, para ello nos hemos currado un script que copia las rutas de la tabla MAIN y las cree exactamente iguales en una nueva tabla, la 200, pero cambiando la puerta de enlace y de esta forma enviar a todos los 10.34 al nodo que queramos.
>
> El script es este:
>
> root en openwrt:/# vi /etc/init.d/rutas_usuarios
>
> ########## COMIENZO SCRIPT ##########
>
> #!/bin/sh
>
> # Variables
> puerta_de_enlace_tabla_200=La ip del nodo donde haya internet
> ruta_adicional_1='ip route add 10.34.159.96/27 via 172.16.98.129'
> fichero_temporal=/tmp/rutas_tabla_main
>
> # Se crea fichero temporal con las rutas sin la puerta de enlace
> ip route show table main | grep -v default > $fichero_temporal
>
> # Se cuentan rutas
> numero_rutas_tabla_main=`cat $fichero_temporal | wc -l`
>
> # Se eliminan rutas tabla 200
> ip route flush table 200
>
> # Se copian rutas de la tabla main
> for linea in `seq 1 $numero_rutas_tabla_main`; do
> ip route add `sed -n ${linea}p $fichero_temporal` table 200
> done
>
> # Añadiremos rutas adiccionales como necesitemos aqui debemos ejecutarlas
> $ruta_adicional_1
>
> # Se crea puerta de enlace para la tabla 200
> ip route add default via $puerta_de_enlace_tabla_200 table 200
>
> # Se eliminan todas las reglas excepto local, main y default
> ip rule show | grep -Ev '^(0|32766|32767):' | while read PRIORIDAD REGLA; do
> ip rule del prio ${PRIORIDAD%%:*} $( echo $REGLA | sed 's|all|0/0|' )
> done
>
> # Se crea la regla de rutas para los usuarios
> ip rule add from 10.0.0.0/8 table 200
>
> ip route show table 200
> ip rule show
> rm $fichero_temporal
>
> ########## FIN SCRIPT ##########
>
> Démosle permisos de ejecución:
>
> root en openwrt:/# chmod +x /etc/init.d/rutas_usuarios
>
> Saludos !!
>
>
>
>
>
> ______________________________________
>
> " Le informamos, en virtud del art.5 de la LO 15/1999 de Proteccion de datos de caracter personal, que sus datos personales forman parte de un fichero de datos informatizado de esta sociedad y empresas de su grupo. Asi mismo, le informamos, de la posibilidad de ejercitar sus derechos de acceso, rectificacion, cancelacion y oposicion de los mismos dirigiendose a la sociedad, C/ Altamira num.1 de Azuqueca de Henares (19200) Guadalajara"
>
> ______________________________________
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> GuadaWireless - http://guadawireless.net
> Para cambios en su suscripcion o darse de baja, pulse aqui:
> http://cpd-server.guadawireless.net/cgi-bin/mailman/listinfo/guadawireless
Más información sobre la lista de distribución guadawireless