Bueno, este mes de julio he dispuesto de más tiempo para poder instalar y configurar en una de las aulas de informática el ordenador del profesor como PROXY TRANSPARENTE y servidor DHCP en Ubuntu 13.04 32 bits.
Para este caso dispongo de un servidor con dos tarjetas de red, una de ellas será la que esté conectada al router que nos da acceso a Internet (eth0) y la otra estará de cara al aula, la red interna (eth1).
En primer lugar debemos configurar nuestras interfaces de red, la primera, eth0 se configurará por DHCP desde el router, y la segunda, eth1, tendrá una IP estática a nuestra elección, para mi caso 192.168.0.1, como puerta de enlace la misma y DNS para navegar.
DHCP
Una vez configuradas las tarjetas de red, empezamos con el DHCP. Para instalar ejecutamos desde una consola el siguiente comando.
$ sudo apt-get install isc-dhcp-server
En algunos casos puede ser que funcione dhcp3-server (obsoleto) en vez de isc-dhcp-server.
Seguidamente debemos especificar la interfaz por la que serviremos las direcciones IP a nuestros clientes, recordar, la interfaz interna. Editamos el fichero /etc/default/isc-dhcp-server con nuestro editor favorito y buscamos la opción INTERFACES para indicar cual será la nuestra.
$ sudo gedit /etc/default/isc-dhcp-server
Dejándolo como se muestra a continuación.
# Defaults for isc-dhcp-server initscript # sourced by /etc/init.d/isc-dhcp-server # installed at /etc/default/isc-dhcp-server by the maintainer scripts # # This is a POSIX shell fragment # # Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf). #DHCPD_CONF=/etc/dhcp/dhcpd.conf # Path to dhcpd's PID file (default: /var/run/dhcpd.pid). #DHCPD_PID=/var/run/dhcpd.pid # Additional options to start dhcpd with. # Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead #OPTIONS="" # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth1"
Ahora debemos configurar los parámetros del servicio DHCP, para eso vamos a /etc/dhcp y antes de nada hacemos un backup de dhcpd.conf.
$ sudo cp dhcpd.conf dhcpd.conf.original
Y editamos el fichero.
$ sudo gedit dhcpd.conf
Lo podemos borrar por completo y añadir únicamente nuestra configuración, aquí dejo la que he utilizado yo para el aula.
option domain-name "server-inf01.public";
option domain-name-servers ns1.server-inf01.public, ns2.server-inf01.public;
default-lease-time 600;
max-lease-time 7200;
# AulaInformatica
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.10 192.168.0.40;
option domain-name-servers tu_DNS1, tu_DNS2;
option domain-name "inf01.server.public";
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
default-lease-time 600;
max-lease-time 7200;
}
Guardamos y ya podemos reiniciar el servicio y comprobar.
$ sudo service isc-dhcp-server restart
En ocasiones, puede ser que necesitemos hacer reservas de direcciones IP, asignar la misma IP siempre al mismo equipo. En el mismo fichero de configuración, /etc/squid/dhcpd.conf, podemos añadir las siguientes líneas.
#Reservas
host inf01-13 {
hardware ethernet 00:1d:60:96:53:85;
fixed-address 192.168.0.13;
option routers 192.168.0.1;
option domain-name "inf01.server.public";
}
Deberemos tener este conjunto de líneas por cada una de las reservas que queramos tener.
Ya tenemos el segundo paso terminado.
PROXY TRANSPARENTE SQUID
En primer lugar debemos instalar Squid en nuestra máquina, desde un terminal ejecutamos el siguiente comando.
$ sudo apt-get install squid3
El siguiente paso será configurar nuestro Squid, editamos el fichero squid.conf que encontraremos en /etc/squid3.
$ sudo gedit /etc/squid3/squid.conf
Deberemos modificar las siguientes opciones.
http_port 3128
por esta otra
http_port 192.168.0.1:3128 transparent
3128 es el puerto de Squid y debemos indicar la dirección IP del servidor, la que se encuentre en la parte interna.
Si nuestra máquina tiene suficiente memoria, le quitamos la almohadilla a la opción cache_men, y utilizamos un valor coherente a nuestra máquina, en mi caso la he dejado como se muestra.
cache_mem 512 MB
Buscamos la opción cache_dir y la ajustamos como en la siguiente línea, aunque aquí los valores de caché dependerán de nuestras preferencias y máquina.
cache_dir ufs /var/spool/squid3 2048 16 256
Y activamos las siguientes opciones, para asegurar que ningún usuario pueda acceder a los recursos gestionados por Squid.
cache_effective_user proxy cache_effective_group proxy
Descomentamos la opción half_closed_clients y la dejamos en off, esto permitirá a Squid cerrar las peticiones de los clientes que se queden a medias cuando cierran la conexión TCP.
half_closed_clients off
Ahora limitamos el tamaño máximo de los objetos que se guardarán en memoria, esto puede ahorrarnos problemas con el tamaño de la caché. Descomentamos la siguiente línea y la dejamos en 1024 KB.
maximum_object_size 1024 KB
También vamos a indicar cuando debe Squid vaciar la caché, esto nos permitirá un mejor mantenimiento. Descomentamos las siguientes líneas.
cache_swap_low 90 cache_swap_high 95
En mi caso dejo los valores que nos dan por defecto. Como última modificación en las opciones de configuración de Squid, buscamos la opción memory_pools, la descomentamos y la ponemos en off.
memory_pools off
Esta opción, hará que Squid libere la memoria RAM que no esté utilizando.
Por último, tras la siguiente línea,
# # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS #
Añadiremos la regla para permitir el acceso a Internet de nuestra red interna.
acl mi_red src 192.168.0.0/24 http_access allow mi_red
Y con esto ya podemos reiniciar Squid.
$ sudo service squid3 restart
IPTABLES
Ya sólo nos faltan las IPTABLES, estas son muy duras de entender y no es que las domine, pero podemos encontrar varios scripts por internet que hacen lo que necesitamos.
Yo me he quedado con el siguiente que se adapta bastante a lo que necesito.
#!/bin/sh # IP del servidor SQUID SQUID_SERVER="192.168.0.1" # Interface conectada a Internet INTERNET="eth0" # Interface interna LAN_IN="eth1" # Puerto Squid SQUID_PORT="3128" # Limpia las reglas anteriores iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X # Carga los modulos IPTABLES para NAT e IP con soporte conntrack modprobe ip_conntrack modprobe ip_conntrack_ftp echo 1 > /proc/sys/net/ipv4/ip_forward # Politica de filtro por defecto iptables -P INPUT DROP iptables -P OUTPUT ACCEPT # Acceso ilimitado a loop back iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Permite UDP, DNS y FTP pasivo iptables -A INPUT -i $INTERNET -m state --state ESTABLISHED,RELATED -j ACCEPT # Establece el servidor como router para la red iptables --table nat --append POSTROUTING --out-interface $INTERNET -j MASQUERADE iptables --append FORWARD --in-interface $LAN_IN -j ACCEPT # acceso ilimiato a la LAN iptables -A INPUT -i $LAN_IN -j ACCEPT iptables -A OUTPUT -o $LAN_IN -j ACCEPT # Redirige las peticiones de la red interna hacia el proxy iptables -t nat -A PREROUTING -i $LAN_IN -p tcp --dport 80 -j DNAT --to $SQUID_SERVER:$SQUID_PORT # Redirige la entrada al proxy iptables -t nat -A PREROUTING -i $INTERNET -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT # Registrar todo iptables -A INPUT -j LOG iptables -A INPUT -j DROP
Podéis encontrar el original aquí.
El inconveniente está en que las IPTABLES debes ejecutarlas cada vez que arranquemos la máquina, por eso crearemos un script y haremos que se ejecute siempre al iniciar el equipo.
Copiamos el script en /etc/init.d/.
$ sudo cp iptables_proxy.sh /etc/init.d
Cambiamos el propietario y los permisos del script.
$ sudo chown root:root iptables_proxy.sh $ sudo chmod 700 iptables_proxy.sh
A continuación editamos el fichero /etc/init.d/rc.local.
$ sudo gedit /etc/init.d/rc.local
Y añadimos las siguientes líneas bajo ### END INIT INFO.
### END INIT INFO cd /etc/init.d ./iptables_proxy.sh
Ya podremos reiniciar nuestra máquina y comprobar que se ejecuta y realiza su función correctamente, espero os sirva de ayuda.
Au!!
Fuentes:
Sebest
Ubuntu Server Guide
tldp.org
Deja una respuesta