Anterior Siguiente Inicio

1. Scripts
        Esto son una serie de scripts que hice para cambiar más facilmente las rutas y reglas de iptables según la conexión a internet que usara. Además incluyo scripts de inicio de mi servidor

Conexión a internet
Rutas estáticas
Red inalámbrica
Iptables
Openvpn
Autoconfiguración de la red con ifplugd y guessnet

Conexión a internet:

#!/bin/bash
#A este script tenemos que pasarle como argumentos: "modem" ó "wireless", según la conexión
#que queramos usar
PROVIDER="terra"         #Mi proveedor de internet vía modem

case $1 in

        modem)
                echo Conectando a $PROVIDER

                ##Borramos puerta de enlace por defecto (si existe) y NAT
                if [ `route -n |grep UG | awk '{print $2}' |wc -l` > 0 ];then           #Si hay puerta de enlace definida
                        route del default gw `route -n |grep UG | awk '{print $2}'`     #La borramos
                fi

                iptables -t nat -F                                                      #Limpiamos reglas de NAT

                #Desconectamos el módem en caso de estar usándolo
                PPD=`ps aux |grep pppd | wc -l` #Numero de procesos de pppd
                while [ $PPD -gt 0 ];   #Mientras haya algún ppd ejecutándose...
                do
                        killall pppd -9
                        PPD=`ps aux |grep pppd | wc -l`;
                done

                #Conectamos tarifa plana
                pon terra
                #Hacemos nat para ppp0
                iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
                ;;

        wireless)

                #Desconectamos el módem en caso de estar usándolo
                PPD=`ps aux |grep pppd | wc -l` #Numero de procesos de pppd
                while [ $PPD -gt 0 ];   #Mientras haya algún ppd ejecutándose...
                do
                        killall pppd -9
                        PPD=`ps aux |grep pppd | wc -l`;
                done
                #Configuramos red wireless y añadimos puerta de enlace
                iwconfig wlan0 essid ACME mode managed
                ifconfig wlan0 172.16.0.8 netmask 255.255.255.0
                route add default gw 172.16.0.5
                #Hacemos nat para wlan0
                iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wlan0 -j MASQUERADE
                ;;

        *)
                echo "Usage: $0 {modem|wireless}"
                ;;
esac


Rutas estáticas:


# Fichero en deshuso mientras no tengamos más redes
# Por el momento no tenemos más redes que las de nuestros interfaces eth0, ppp0, wlan0

#!/bin/bash

#No activamos ip_forward ya que lo activamos en /etc/network/options
#echo 1 > /proc/sys/net/ipv4/ip_forward

case $1 in
        start)

                #Rutas estáticas
                route add -net 172.16.0.0/16 gw 192.168.2.100
                route add -net 192.168.1.0/24 gw 192.168.2.100
                ;;

        stop)
                # Por hacer
                # Sería algo como un "while `route -n | wc -l > 0`; then route del -net `route -n |awk....`";done
                ;;
        restart)
                # stop && start :D
                ;;
        *)
        echo "Usage: $0 {start|stop|restart}"
esac


Red inalámbrica:

#!/bin/bash
# Con este script iniciamos y configuramos la red inalámbrica
ESSID=ACME

case $1 in


        start)
                modprobe ndiswrapper
                sleep 6   # necesario mientras se carga el driver
                iwconfig wlan0 essid $ESSID mode managed
                ifup wlan0   # tenemos las ip's configuradas en /etc/network/interfaces
                ;;
        stop)
                ifconfig wlan0 down
                rmmod ndiswrapper
                ;;
        restart)
                ifconfig wlan0 down
                rmmod ndiswrapper
                modprobe ndiswrapper
                sleep 6
                iwconfig wlan0 essid $ESSID mode managed
                ifup wlan0
                ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                ;;
esac

Iptables:

modprobe ip_nat_irc ports=6667
modprobe ip_nat_ftp
iptables -F
iptables -t nat -F

#Hacemos nat para las ip's de la 192.168.0.102 a la 110


IP=102  #IP desde la cual comienza la pila para NAT


for (( IP=101; IP<110; IP=$IP+1 )); do

        iptables -t nat -A POSTROUTING -s 192.168.0.$IP -j MASQUERADE;
done

Openvpn:
Con este script iniciamos o paramos el demonio openvpn (tenemos la vpn configurada para que haga bridge)
Lo linkamos a /etc/rcS/S39openvpn, para que se ejecute antes que S40networking, ya que en networking se le asigna la ip a br0
Este es mi openvpn.conf

#!/bin/bash
OPENVPN=/usr/sbin/openvpn

case "$1" in

start)
        echo Starting openvpn
        $OPENVPN --config /etc/openvpn/openvpn.conf --daemon
        echo Configuring bridge
        ifconfig eth0 0.0.0.0
        ifconfig tap0 0.0.0.0
        brctl addbr br0
        brctl addif br0 tap0
        brctl addif br0 eth0
        ;;

stop)
        echo Killing openvpn daemon
        killall openvpn -9
        break
        ;;

restart)
        echo Killing openvpn daemon
        kill -9 `ps aux |grep openvpn |grep nobody |awk '{print $2}'`
        echo Starting openvpn
        $OPENVPN --config /etc/openvpn/openvpn.conf --daemon
        ifconfig tap0 0.0.0.0
        brctl addif br0 tap0
        ;;
*)
        echo "Usage: $0 {start|stop|restart}"
        ;;
esac

exit 0

Ifplugd y guessnet:
Cuando nos conectamos a diversas redes con un portátil, vendría bien un sistema que detectara la red en la que nos encontramos en cada momento, y configurase nuestra tarjeta de red acorde con el lugar en que nos encontramos. Además sería genial que lo hiciera cuando enchufamos el cable de red, o cuando nos asociamos a un punto de acceso en caso de una red inalámbrica. Para ello combinaremos ifplugd y guessnet.
Ifplugd detecta el cable de red y levanta el interface de red, o lo detiene cuando se quita el cable de red.
Guessnet realiza pruebas sobre la red para escoger entre distintos perfiles el que se adecúa al lugar en que nos encontramos.

En la instalación de ifplugd nos preguntará sobre qué interfaces debe monitorizar. Si se trata de interfaces pcmcia o usb, los debemos poner en la sección "Hotplug interfaces".

La configuración de guessnet se realiza sobre el fichero interfaces de configuración de red.
Veamos un ejemplo:

auto lo
auto eth0
iface lo inet loopback

mapping eth0

        script guessnet-ifupdown
        map timeout: 3
        # List of maps to scan for
        # If none specified, guessnet scans for all
        map work home

mapping eth1

        script guessnet-ifupdown
        map timeout: 3
        # List of maps to scan for
        # If none specified, guessnet scans for all
        map home
        # Profile to select when all tests fail

        map default: none

iface work inet static

        address 192.168.0.6
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        test peer address 192.168.0.1 mac 00:0F:90:E9:D7:EC source 192.168.0.0

iface home inet static

        test peer address 192.168.0.101 mac 00:01:03:15:B5:0F source 192.168.0.0
        address 192.168.0.106
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1

# Si ninguna es encontrada, prueba DHCP
iface none inet dhcp

De este modo le decimos que monitorice los interfaces físicos eth0 y eth1 (mapping), y que para eth0 compruebe los perfiles "home" y "work", mientras que para eth1 compruebe sólo el peril "home". Esto es así ya que la tarjeta de red con cable la uso indistintamente en casa o en el trabajo, pero la inalámbrica solo la utilizo en casa. Especificamos un timeout de 3 segundos, de modo que si pasado ese tiempo no encuentra nada, o bien deja sin configurar ese interface, o bien configura el perfil por defecto especificado.
La configuración de la red es la de siempre, salvo la línea test que es la usada para comprobar en qué red estamos. Esto se realiza comprobando que la mac especificada corresponda con la red especificada. En los casos en que no nos detecte bien dicho test, puede deberse a que el paquete se genera desde la dirección de red. En este caso podemos especificar una ip no usada en el campo "source".

Fuente: https://drupal.gulic.org/node/412

Detección del cable de red al iniciar
Al iniciar el equipo se levantan los interfaces de red seleccionados como "auto" aunque no tengan el cable conectado. Para evitar esto, modificamos el script /etc/init.d/networking y cambiamos la sección "start" por esta:
(Especificar los interfaces de red adecuados. En mi caso lo y eth0)
start)
process_options
log_action_begin_msg "Configuring network interfaces"
if [ "`ifplugstatus |grep eth0 | awk '{print $2}'`" == "link" ] ; then
log_action_end_msg $?
ifup lo eth0
else
ifup lo
log_action_end_msg $?

fi
;;



Anterior Siguiente Inicio