Linux Guía Router ProxyCaché DNSCaché dhcpd CentOS 7

hpf

Lector entusiasta
Miembro del Equipo
MOD
Se incorporó
7 Mayo 2011
Mensajes
370
NOTA: Guía en edición, en honor al tiempo. Hecha en base la eximia guía con nombre casi homónimo de yakko. Faltan todos los descriptivos de los servicios, y por supuesto, textos y textos de información, incluyendo los divertidos comentarios del creador original de la estructura. Si los enanitos se me arrancaron hacia el bosque en alguna parte, por favor escribir los alcances necesarios.

A pesar de lo anterior, se irá rellenando en el próximo tiempo (dependiendo de la carga laboral, familia, etc.); por el momento, la dejo aquí lo más práctica posible.



I) REQUISITOS MÍNIMOS

PC con:
  • 2 NIC
  • 1 GB RAM
  • 1 Procesador de 1.2 Ghz (x86_64)
  • 10/20 GB Almacenamiento en disco
Prácticamente los requisitos del Sistema Operativo (CentOS 7)


1) INSTALACIÓN


a) Parámetros para interfaces de red

Durante el arranque del DVD, iluminar "Install CentOS 7" y presionar Tab para ingresar parámetros al final de la línea:

Código:
biosdevname=0 net.ifnames=0

Presionar Enter. Esto nos ayudará a que se reconozca el nombre de los dispositivos de red como "eth0", "eth1", etc.

b) Menú

Seleccionamos idioma a instalar, en el caso de esta máquina fue:

LOCALIZATION:

Language Support = Inglés
Date/Time = Americas/Santiago timezone
Keyboard = Spanish; Castilian Latin American (include dead tilde)

SECURITY:

Security Policy = OFF

SOFTWARE:

Installation Source = Local Media
Software Selection = Minimal Install

SYSTEM:

Partitioning = Manual
*Esquema de Particionado:

Se mantiene una partición aparte para /boot, y LVM para el resto de puntos de montaje. Nos basaremos en la guía original de yakko. Gracias a las bondades de LVM, luego podremos redimensionar o asignar el espacio necesario a los servicios que deseemos levantar.

2n19j6c.png


Kdump = Disabled
Network & Hostname = Activar la interfaz WAN. Setear hostname a "home-proxy"


c) Comenzamos la instalación

Mientras está instalando la paquetería, seteamos una contraseña de root.

2) PREPARACIÓN DE LA MÁQUINA

a) Desactivar SELinux

Ya que actúa a muy bajo nivel (llamadas al kernel, red, etc.), afectando directamente el rendimiento de la máquina y por ende, cada proceso y servicio que corra en ella. Es necesario reiniciar para que la configuración surja efecto.

Código:
# vi /etc/sysconfig/selinux

Cambiamos el estado de SELinux de "enforcing" a "disabled". La línea debería quedar así:

Código:
SELINUX=disabled

b) Nombre de la máquina

Si durante la instalación no configuramos el nombre de host de nuestra máquina, o lo quisiéramos cambiar a futuro, se puede hacer con el siguiente comando:

Código:
# hostnamectl set-hostname home-proxy

c) Verificamos los servicios al inicio

Quien haya instalado otro patrón de instalación, o en caso de que existan otros servicios asociados en su máquina, pueden listar todos los que comenzarán durante el arranque del sistema con el siguiente comando:

Código:
# systemctl list-unit-files | grep enabled | less

Presionamos "q" para salir. en caso de querer desactivar un servicio, basta con ingresar:

Código:
# systemctl disable serviciox

Existe una capa de compatibilidad para comandos anteriores.

3) CONFIGURACIÓN DE RED

En esta ocasión utilizaremos NetworkManager,. Aunque también se puede desactivar, y utilizar network.service para que lea nuestros archivos de configuración hechos a mano.

a) Configuración de interfaces

Con la herramienta "nmtui" podemos configurar las interafces de red de forma sencilla. También pueden utilizar nmcli.

eth0 = Configuración IPv4 automática.
Ignoramos configuración para IPv6.

eth1 = Configuramos sólo la dirección IP (192.168.0.1/24)
Ignoramos configuración para IPv6.

En cada una, importante seleccionar la opción para conectar automáticamente.

b) Activar los perfiles

Luego de configurar cada interfaz. Con "nmtui" activamos y desactivamos los perfiles de configuraciones deseados, ingresando a "Activate a connection".

4) ACTIVANDO EL ROUTER

a) Bit de forwarding

Para que nuestra máquina permita el paso de paquetes desde una red a otra, basándose en la tabla de rutas, activamos de forma permanente el parámetro del kernel para reenviar paquetes ipv4.

Código:
# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/10-forwarding.conf

En versiones anteriores de RHEL (o CentOS), editábamos directamente el archivo /etc/sysctl.conf, sin embargo, dentro de los nuevos cambios y buenas prácticas, está el mandato de que sysctl.conf es parte del rpm, y que en una posible actualización, las configuraciones antiguas se pierdan (varios servicios incluyen esta lógica, como httpd, autofs, etc). Ojo que existe la retrocompatibilidad, por lo tanto si se edita el archivo directamente, también obtenemos los resultados deseados.

b) Firewalld

Nuestra interfaz por defecto para netfilter en RHEL 7 / CentOS 7 es firewalld. Configuraremos dos zonas, una interna (lan) y otra externa (wan), y haremos el enmascaramiento utilizando esta herramienta; si es más cómodo para alguien utilizar iptables, tan sólo desactive el servicio y active iptables (yum install iptables-services -y && systemctl stop firewalld ; systemctl disable firewalld && systemctl start iptables ; systemctl enable iptables).

Para el servicio de firewalld, utilizamos una herramienta llamada "firewall-cmd", con la cual realizamos los mandatos para configurar todo a gusto. Cuando se trata de crear reglas más complejas, existen métodos para introducir reglas de iptables sin perder las configuraciones creadas.

a) Primero, asignamos cada interfaz a una zona específica.

Código:
# firewall-cmd --change-interface=eth0 --zone=external --permanent
# firewall-cmd --change-interface=eth1 --zone=internal --permanent

Comprobamos que lo anterior esté correctamente asignado.

Código:
# firewall-cmd --get-active-zones

En caso de que las interfaces estén todavía en la zona por defecto (public), como pasa con algunas tarjetas intel, hay que editar directamente los archivos de configuración y agregar la línea de zona:

Código:
# echo "ZONE=external" >> /etc/sysconfig/network-scripts/ifcfg-eth0; echo "ZONE=internal" >> /etc/sysconfig/network-scripts/ifcfg-eth1; ifdown eth0 && ifup eth0 && ifdown eth1 && ifup eth1

b) Añadir el enmascaramiento

Para que todas las peticiones hacia la WAN sean realizadas utilizando NAT, designamos el masquerade en la zona externa.

Código:
# firewall-cmd --add-masquerade --zone=external --permanent
# firewall-cmd --query-masquerade --zone=external

5) Configurando el caché DNS

La solución recomendada por Red Hat para el servicio de DNS caché, es Unbound. Si alguien gusta de otro programa para este efecto (BIND, dnsmasq, etc), bienvenido sea.

a) Instalación y configuración del servicio

Procedemos a instalar la paquetería necesaria.

Código:
# yum install unbound -y

Configuramos el servicio para que sea iniciado durante el arranque.

Código:
# systemctl enable unbound

b) Configuración DNSSEC

Para crear de forma automática las llaves y certificados de validación DNSSEC para las peticiones/respuestas que Unbound realiza, usaremos el siguiente comando.

Código:
# unbound-control-setup

Ojo, Unbound trabaja con estándares de seguridad por encima de otro software por defecto, por lo tanto, el no realizar el paso anterior puede provocar problemas con las solicitudes DNS.

c) Editar el archivo de configuración

La configuración de Unbound está en un solo archivo, lo editaremos.

Código:
# vi /etc/unbound/unbound.conf

Añadiremos los siguientes parámetros. Considerando el NS de google como nuestro forwarder.

Código:
interface: 192.168.0.1
access-control: 192.168.0.0/24 allow
forward-zone:
   name: "."
   forward-addr: 8.8.8.8

Chequeamos la configuración.

Código:
# unbound-checkconf
unbound-checkconf: no errors in /etc/unbound/unbound.conf

Iniciamos el servicio, y lo dejamos listo para iniciar en el arranque.

Código:
# systemctl start unbound
# systemctl status unbound

Añadimos las reglas en el firewall.

Código:
# firewall-cmd --add-service=dns --permanent
# firewall-cmd --reload

6) Configurando el servicio DHCP

a) Instalación de la paquetería

Código:
#yum install dhcp

b) Archivo de Configuración

Editamos manualmente el archivo de configuración.

Código:
# vi /etc/dhcp/dhcpd.conf

Ingresamos la siguientes opciones. El nombre de dominio "casa.cl" puede ser reemplazado a gusto.

Código:
authoritative;

subnet 192.168.0.0 netmask 255.255.255.0 {
   range 192.168.0.100 192.168.0.200;
   option domain-name-servers 192.168.0.1, 8.8.8.8;
   option domain-name "casa.cl";
   option routers 192.168.0.1;
   option broadcast-address 192.168.0.255;
   default-lease-time 600;
   max-lease-time 7200;
}

c) Inicio del servicio y reglas de firewall

Para iniciar el servicio de inmediato, y luego activar el mismo cuando arranque el sistema, ingresamos.

Código:
# systemctl start dhcpd
# systemctl enable dhcpd

Añadimos las reglas del firewall.

Código:
# firewall-cmd --add-service=dhcp --zone=internal --permanent
# firewall-cmd --reload

7) Configuración de squid (proxy)

a) Instalación del servicio

Código:
# yum install squid -y

b) Editando el archivo de configuración

Con nuestro editor favorito, ingresamos a.

Código:
# vi /etc/squid/squid.conf

Los parámetros a editar tienen directa relación con el espacio de almacenamiento de nuestra máquina, siendo, por ejemplo, la memoria caché utilizada 3/4 de la RAM de nuestro equipo.

La acl localnet viene por defecto con varias redes privadas por defecto, hacemos match en la nuestra, que posee máscara 24.

Código:
acl localnet src 192.168.0.0/24

http_access allow localnet

http_port 192.168.0.1:3128 intercept
http_port 192.168.0.1:8080

cache_dir ufs /var/spool/squid 10000 16 256

visible_hostname home-proxy.casa.cl
cache_mem 768 MB
maximum_object_size_in_memory 128 KB
maximum_object_size 10240 KB

En esta versión de squid, para trabajar en modo transparente, incluímos dos sockets con el parámetro http_port.

c) Reglas del firewall

Para que el proxy trabaje de manera transparente (sin intervención en las máquinas de los clientes), realizamos una redirección de puertos interna con nuestro firewall.

Código:
# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=192.168.0.1 --zone=internal --permanent
# firewall-cmd --add-port=3128/tcp --zone=internal --permanent
# firewall-cmd --reload

FIN
 
Última modificación:

hpf

Lector entusiasta
Miembro del Equipo
MOD
Se incorporó
7 Mayo 2011
Mensajes
370
Ya instalé el nuevo server, así que para empezar, pequeña corrección a la guía, en sección 4, activando el router:

Código:
# firewall-cmd --query-masquerade --zone=external

debería ser:

Código:
# firewall-cmd --query-masquerade --zone=external --permanent

Y no olvidar un firewall-cmd --reload dp de!

Lo otro: para que todo funcione, tb tuve que hacer lo siguiente:

Código:
[root@server ~]# cat /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
  [ <rule ipv="ipv4" table="filter" chain="FORWARD_direct" priority="0"> -i internet -o intranet -j ACCEPT </rule> ]
</direct>

Obviamente reemplazar "internet" por su interfaz que da a internet e "intranet" por la interfaz que da hacia la intranet.

De todas formas, pequeño tip: yo los nombré así, eso se hace creando un archivo:
Código:
[root@server ~]# cat /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:25:64:XX:XX:XX", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="p128p1", NAME="internet"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:10:18:XX:XX:XX", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="p131p1", NAME="intranet"

La verdad es que me gusta más colocar el propósito de la nic como nombre, ya que es más rápido para saber cuál tarjeta es en alguna herramienta donde se puede monitorear tráfico (por ejemplo nload o a través de munin).

Finalmente, pequeño detalle: con esto funcionará internet en los equipos de la red interna, pero en mi caso, curiosamente no tenía internet en el server mismo. Me había equivocado con el gateway en /etc/sysconfig/network-scripts/ifcfg-intranet , así que pongan atención a eso. El gateway de esa interfaz tiene que quedar apuntando a la ip de la interfaz internet de ese equipo. Puede ser que con nmcli no tengan este problema, a mi me gusta configurar las interfaces directamente, pero obviamente uno puede cometer este tipo de errores.

Anyway, con la máquina ya andando ahora tengo que configurar todos los servicios, paja paja :p

Saludos.

PD:
Otras cosas que pueden ser útiles:

Al terminar de instalar la máquina, me di cuenta que me faltaba una unidad. Resulta que en el equipo anterior tenía espacio para 5 discos, en el nuevo sólo 4. (Gabinete server vs gabinete normal).

Como tal, me quedé corto de un disco, así que quería probar instalando la máquina no en un disco, pero en un pendrive. El truco para poder hacer esto es en la pantalla de bienvenida del sistema de instalación, customizar el booteo (apretar "e") y ponerle "expert" al final. Con eso se habilita la opción para poder instalar en otros dispositivos que no sean discos internos. Con uno de 16GiB basta, no sé si se podrá hacer en pendrives más chicos, en teoría, uno de 4 creo que ya sería suficiente.

El resultado? Pues es LENTO. Cualquier operación que tenga que ver con escritura es lento y costoso en cuanto a CPU. Lo que terminé haciendo fue crear particiones para /tmp, /var/log y /home (que son las particiones que más escritura y disco necesitan). Swap lo dejé en la misma unidad pq casi nunca se ocupa, aunque esto queda por verse todavía.

Lo otro que me tinca es que la extensión que va de la placa madre al conector usb propiamente tal es USB1.0, con iotop no vi en ningún momento una escritura superior a 1.2MBps, llegando a la casa lo voi a enchufar en los puertos USB que están soldados a la placa para ver si eso acelera un poco el bicho.

Otro dato útil: a mi me gusta mantener activado SELinux, y hasta el momento no me he topado con nada que pueda representar algún problema con SELinux. Eso si, en vez de unbound usé bind (ya tenía toda la conf. del server anterior), y squid lo dejé para dp pq de todas formas no es algo que ocupe así bruto que tanto. Instalando todo desde los repos oficiales no debería dar problema de todas formas.

Saludos.

Recién acabo de tener un tiempito libre :D He tenido que trabajar estos días, mis disculpas.

Lo de:
Código:
# firewall-cmd --query-masquerade --zone=external --permanent

Es erróneo, ya que es para realizar una comprobación de que está habilitado; el "--add-masquerade" corresponde al argumento para enmascarar y debe ser usado con "--permanent".

Para que funcione, probé el mismo procedimiento en máquina real y varias máquinas virtuales con distintas isos. La guía me funkó; obviamente pueden realizar incluso las redirecciones de puertos usando archivos xml e invocando reglas de iptables.

Muy buenísimos tips. Para configuraciones menos genéricas.

SELinux no es para nada difícil, pero para máquinas más modestas, es mucha la diferencia.

Para la caché, la otra vez dejé en casa un tmpfs para que manejara la caché. Aumentó considerablemente el rendimiento. (Obviamente cambiando los parámetros de mínimo y máximo de objetos en caché, y cantidad de RAM general).

Probaste usando un USB con 2.0 o 3.0? Qué tal andará el rendimiento? No estoy en casa como para probar :(


Saludos!
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.601
Recién acabo de tener un tiempito libre :D He tenido que trabajar estos días, mis disculpas.

Lo de:
Código:
# firewall-cmd --query-masquerade --zone=external --permanent

Es erróneo, ya que es para realizar una comprobación de que está habilitado; el "--add-masquerade" corresponde al argumento para enmascarar y debe ser usado con "--permanent".

Para que funcione, probé el mismo procedimiento en máquina real y varias máquinas virtuales con distintas isos. La guía me funkó; obviamente pueden realizar incluso las redirecciones de puertos usando archivos xml e invocando reglas de iptables.

Cueck jajajaj bueh, no cachaba para qué era el query-masquerade, según yo con el add-masquerade era suficiente pero ahora sé cuál es la diferencia, gracias! :D

Muy buenísimos tips. Para configuraciones menos genéricas.

SELinux no es para nada difícil, pero para máquinas más modestas, es mucha la diferencia.

Para la caché, la otra vez dejé en casa un tmpfs para que manejara la caché. Aumentó considerablemente el rendimiento. (Obviamente cambiando los parámetros de mínimo y máximo de objetos en caché, y cantidad de RAM general).

Probaste usando un USB con 2.0 o 3.0? Qué tal andará el rendimiento? No estoy en casa como para probar :(


Saludos!

USB2.0, la placa no tiene para 3.0... lo malo es que la placa es socket 1156 y estuve revisando para cambiarla por otra mejorcita (la placa era de un dell vostro 430) y las placas 1156 son más caras que la csm, onda mínimo €200! Ponerle una tarjeta USB 3.0 y comprar un pendrive USB3.0 sale como €50 y tb lo encuentro caro, siendo que un SSD de 128GiB me sale menos de USD30:
No será la panacea de rápido comparado con otros SSD's, pero le saca la xuxa de seguro a cualquier pendrive.

La verdad es que dadas las circunstancias puedo vivir con que a veces esté lento, mientras alcance para hacer transcoding para la chromecast, pueda escuchar música en otro dispositivo y pueda navegar al mismo tiempo (todas operaciones que no necesitan mucho acceso al sistema base) estoy feliz.

Hasta el momento, mi veredicto con instalar el OS en un pendrive es: "Mala idea". Puede sonar muy bonito en papel, pero en la vida real es lento. En particular un yum update que normalmente toma unos 5 minutos toma una hora por ejemplo para que te hagas una idea xD

Saludos.

PD: Me compré el SSD :uy estaba en oferta por USD20 así que aproveché xD
 
Última modificación:
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
Normalmente el pendrive será lento si no se desactivan las escrituras innecesarias (con noatime en el fstab), y con eso el resto de procesos si genera muchas escrituras igual será más lento que otros medios, como un hdd mecánico o un disco en red :xd

Enviado desde mi HUAWEI KII-L23 mediante Tapatalk
 
Upvote 0

K3rnelpanic

non serviam
Miembro del Equipo
MOD
Se incorporó
1 Octubre 2007
Mensajes
6.065
Podriamos agregarle un wpad o nofre? :zippyte,digo porque ultimamente la mayoria de las paginas usa https y no http, volviendo obsoleto a un squid transparente :zippyte
 
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.402
seria util, pero quizas como una guia separada o como punto opcional, ya que igual algunos dispositivos podrian no usarlo, asi que tampoco es 100% seguro que lo activen (a menos que se bloquee el https o limite para fomentar su activacion )
hablo de la opcion de "obtener configuracion del proxy de forma automatica", asi que para algunos casos el resultado podria ser parcial
 
Upvote 0

K3rnelpanic

non serviam
Miembro del Equipo
MOD
Se incorporó
1 Octubre 2007
Mensajes
6.065
seria util, pero quizas como una guia separada o como punto opcional, ya que igual algunos dispositivos podrian no usarlo, asi que tampoco es 100% seguro que lo activen (a menos que se bloquee el https o limite para fomentar su activacion )
hablo de la opcion de "obtener configuracion del proxy de forma automatica", asi que para algunos casos el resultado podria ser parcial
Se me ocurre cómo hacerla, tipo guía separada :zippyte

Enviado desde mi MotoE2 mediante Tapatalk
 
Upvote 0
Subir