¿Cómo configuro un poderoso router casero con Ubuntu?
En una reunión con obreros del gremio telefónico, Juan Perón explica los 
requerimientos del Movimiento y enseña a los técnicos cómo armar un 
Router casero munido de Ubuntu.

¡Trabajadores!

Existen tareas que por complejas que parezcan, deben poder ser 
realizadas por un Pueblo Justo, Libre y Soberano. Los paños de nuestras 
tres divisas son inmaculados, y como tal ha de ser el camino que hemos 
de seguir en pos de nuestra merecida felicidad.

Sin embargo, no es secreto para nadie que en ocasiones las tareas que 
deberían ser sencillas esconden para sí dificultades que enturbian el 
corazón de los hombres más formidables. El conocimiento permite al 
hombre hacer de si alguien mejor, pero no es algo que pueda adquirirse 
fácilmente en el ámbito individual: el conocimiento ha de lograrse de 
manera colectiva para que realmente sea apropiado y utilizado.

Poco sentido tiene que algo lo sepa uno solo. Ello parecería correcto 
para una sociedad vendida al Capital, pero un Pueblo como el nuestro 
necesita y merece una Comunidad Organizada capacitada no solamente para 
hacer uso del Software y Hardware puesto a su disposición, sino ser 
capaz de darse a sí misma las funcionalidades que le sean necesarias en 
pos de su sano existir.
Vean señores. Dios creó a la Tierra, y en un principio las 
comunicaciones se establecían a los gritos, luego con señales de humo, y 
hasta hace poco de forma descentralizada a través de la línea 
telefónica, empleando un módem telefónico en una modalidad punto a punto 
(síncrona). Con el advenimiento de la llamada "banda ancha", el acceso a 
Internet se hizo más centralizado. La conexión a nivel masivo se logró 
por medio de dispositivos de red hogareños (gateways) otorgados en 
comodato por los proveedores de internet. Estos puertos de entrada 
suelen tener la forma de módem ADSL, cablemódem, módem de fibra óptica, 
antena/suscriber, u otro aparato de para acceso al servicio de Internet. 
La entrada de estos aparatos recibida desde la vía pública varía de 
acuerdo a la tecnología utilizada (cable telefónico, cable coaxil, fibra 
óptica, etc), pero la salida al hogar suele ser un conector normalizado 
RJ45, a través de una interfaz Ethernet.
De un tiempo a esta parte la mayoría de estos puertos de entrada 
hogareños incorporaron también funciones básicas de enrutamiento hacia 
el hogar, e incluso la capacidad de punto de acceso WiFi. No es extraño 
que además hoy estos modem/routers con Wifi tengan funcionalidad VoIP 
para entablar comunicaciones de Voz a través de una suscripción 
Internet, y que la velocidad para la red LAN sea del tipo Gigabit (1000 
Mbps por segundo).

En este escenario ustedes se preguntarán ¿para que podría querer armar 
un router casero? Las respuestas son múltiples. En primer lugar los 
modem/routers hogareños convencionales suelen ser limitados: cuentan con 
una memoria muy escasa (normalmente apenas unos 32MB), amén de un 
microprocesador ARM o MIPS de escasa potencia (400Mhz es una velocidad 
de referencia bastante extendida). Ello los torna ridículos en cualquier 
condición de real alta demanda. No tendremos problemas para compartir 
internet de 10MB entre cuatro o cinco computadoras, pero si nuestro uso 
es más holgado, nos encontraremos en instalaciones comerciales, 
educativas, etc, dicha capacidad puede tornarse en una extremadamente 
constrictiva. Por otro lado, un equipo especialmente armado para la 
función de router casero bien puede operar como servidor local de 
correo, de datos, etc. Algunos routers hogareños de alta gama disponen 
de estas funcionalidades a un nivel muy limitado. Naturalmente que 
podremos superarla con creces.

Por otro lado, también podremos armar un router con un equipo 
previamente descartado, o un equipo nuevo de muy bajo costo.

En este caso emplearemos una MiniPC sin fan (especialmente diseñada 
pensando en un bajo consumo eléctrico empleando disipadores pasivos). La 
placa madre de la misma trae un Intel Celeron 1037u doble núcleo de 
1.8Ghz, dos puertos Ethernet Gigabit, cuatro puertos USB2, y el hardware 
de video video es Intel onboard con salida VGA y HDMI (que no 
utilizaremos normalmente). La memoria es de 2GB de RAM DDR3. Le 
colocaremos un SSD barato de 64GB.

Naturalmente existen opciones mucho más baratas (emplear memorias flash 
SD en lugar de disco rígido, o usar una PC de descarte con una placa LAN 
Ethernet común). Sin embargo, en tal caso tendremos elevado consumo 
eléctrico y generación de calor al ñudo.
¿Que hará el router peronista?
Un router es un dispositivo que acepta paquetes TCP/IP en uno de sus 
conectores (técnicamente interfases), y la reenvía a otra interfaz, de 
modo que esos paquetes estén más cerca de su destino eventual. 
Fundamentalmente debemos saber que el aparato debe entender y manejar 
cuatro cosas: debe rutear (algo que Linux puede hacer perfectamente), y 
tener capacidad DHCP,  DNS y NAT.

DHCP (Protocolo de Control Dinámico de Host) es el protocolo que le 
permite al router asignar a los clientes locales direcciones IP de forma 
dinámica y llevar control de las mismas de forma automática. DNS 
(Sistema de Nombre de Dominio) es un software traductor entre los 
nombres de dominio (ej www.ubuntuperonista.blogspot.com.ar) las 
direcciones IP (numéricas y difíciles de recordar) de dichos servidores. 
Técnicamente, emplea el programa BIND desarrollado en la Universidad 
peronista de Berkley.

Y NAT, en apretado resúmen, nos permite acceder a direcciones ruteables 
en internets desde direcciones locales y privadas no ruteables. Un 
router oficia de nodo aceptando tráfico desde la red local LAN, 
sustituyendo su propia dirección pública otorgada por el proveedor de 
internet - ya sea fija o dinámica (variable) por la dirección IP de la 
LAN desde donde viene el paquete, y enviando dicho paquete a internet. 
Cuando las réplicas del paquete regresan al router, este buscará cuál es 
la dirección IP local desde la cual se solicitó el paquete original, 
pondrá esa dirección IP de nuevo en el paquete en lugar de la suya 
propia, y reenviará el paquete a su destinatario local, a la máquina 
original.
Necesitamos el NAT debido a que no existen suficientes direcciones IP 
públicas para toda computadora personal y dispositivo existente. 
Técnicamente, debemos saber que el router lo hará realidad efectiva por 
medio de la función MASQUERADE del programa iptables.
Software para el Route


Existen varias distribuciones Linux pensadas para operar como router, 
como por ejemplo OpenWRT. En este caso emplearemos la versión LTS de 
Ubuntu Server, la cual descargamos desde su web oficial. Usando un 
pendrive de 2GB creamos el pendrive de instalación. El procedimiento de 
instalación consiste en iniciar la MiniPC desde el pendrive, e instalar 
en el disco SSD Ubuntu Server 16.04.1LTS con todas las opciones por 
defecto. La única opción relevante será ingresar nuestro nombre de 
usuario y contraseña de Conductor, así como si deseamos actualizaciones 
de seguridad automáticas (responderemos afirmativamente). Cuando todo 
finalice reiniciamos la MiniPC, nos logueamos con nuestro usuario y 
contraseña, y nos encontraremos ante el intérprete de comandos (una 
pantalla de solo texto).
Configurar las interfaces de red
Lo primero es asegurarnos cual nomenclatura de interfaz de la miniPC 
corresponde a qué puerto. Lo manera más sencilla es escribirle WAN o LAN 
a los puertos (si es que no están ya marcadas de alguna manera). Para 
averiguar bien conviene conectar el cable Ethernet de nuestro módem al 
conector que querremos usar como puerto WAN, y luego tipear el siguiente 
comando de organización:

ifconfig

...y al presionar Enter nos aseguramos cual de las interfaces que nos 
indique el sistema tiene una dirección IP: ¡y esta será nuestro puerto 
WAN!. En mi caso la MiniPC cuenta con dos puertos Ethernet, y la que 
recibe dirección IP figura como interfaz enp4s0. Naturalmente que la 
otra interfaz (en mi caso enp5s0) será el puerto LAN. Deberán tomar nota 
de cual es cual en vuestro caso particular pues es muy normal que su 
propia nomenclatura sea distinta a la de este ejemplo.

Nuestra acción siguiente será configurar las interfaces de red 
modificando el archivo /etc/network/interfaces, con el comando:

sudo nano /etc/network/interfaces

...se abrirá el editor GNU Nano con un archivo que ya contendrá 
configuraciones en forma de texto. La sección loopback debería ya estar 
allí, y es probable que a continuación también aparezca algo 
correspondiente para nuestras interfaces de red (enp4s0 y enp5s0 en este 
caso). Hemos de modificar/agregar las secciones para enp4s0 (nuestro 
puerto de salida a internet WAN) y enp5s0 (nuestro puerto local LAN) 
como se indica:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# La interfaz loopback de la red
auto lo
iface lo inet loopback

# La interfaz WAN a internet, aparece nomenclada LAN1 en la placa madre.
auto enp4s0
iface enp4s0 inet dhcp

# La interfaz LAN (red local), aparece nomenclada LAN2 en la placa 
madre.
auto enp5s0
iface enp5s0 inet static
 address 192.168.99.1
 netmask 255.255.255.0


Quienes conocer Linux dominan ya que las líneas que se inician con el 
carácter numeral ("#") no son procesadas por el sistema y se emplean 
como comentarios; son líneas que se agregaron como referencia al equipo 
en particular, y son importantes como anotaciones para futuras 
referencias. Siempre conviene comentar lo que intentamos hacer en 
nuestros archivos de configuración. Guardaremos los cambios con Ctrl+o y 
saldremos del editor Nano con Ctrl+x.
Habilitar el enrutamiento en /etc/sysctl.conf
Para que Linux sea capaz de enrutar paquetes debemos permitir el reenvío 
de los mismos entre las distintas interfaces del router. Esto será 
realmente simple. Ingresamos el comando:

sudo nano /etc/sysctl.conf

...y descomentamos (borramos el símbolo numeral "#") la línea que dice  
#net.ipv4.ip_forward=1, de modo que quede como se indica a continuación 
(sin el "#"):

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1


Luego presionamos Ctrl+o, y Ctrl+x a fin de guardar los cambios al 
fichero de configuración y salir del editor.


Los cambios que hagamos se harán efectivos cuando reiniciemos el router 
con:

sudo reboot
Crear e iniciar un conjunto de reglas esqueleto
Conforme el sistema sepa que debe ser un router, el siguiente paso será 
asegurarnos de escoger qué tipo de información reenviará y cuando lo 
hará. Para ello debemos crear un conjunto de reglas de contrafuego 
(firewall), y asegurarnos que entren en vigencia antes de que las 
interfaces de red del router se activen. Primero ingresamos el comando

sudo nano /etc/network/if-pre-up.d/iptables 

...para crear un guión de inicio y le agregamos el siguiente contenido:

#!/bin/sh
/sbin/iptables-restore < /etc/network/iptables


Luego de guardar los cambios y salir del editor con Ctrl+o y Ctrl+x, 
ingresamos:

sudo chown root /etc/network/if-pre-up.d/iptables ; chmod 755 
/etc/network/if-pre-up.d/iptables

Esto le dice al sistema que el guión es propiedad del root (conductor y 
administrador del sistema) y luego se le informa al sistema que sólo el 
root puede escribirlo y leerlo, pero que puede ser ejecutado cualquier 
usuario. Ya que nuestro guión fue creado en el directorio if-pre-up.d, 
será ejecutado antes que las interfases de red se inicien, asegurándonos 
que nunca quedaremos online sin reglas de cortafuego que nos protejan.

Archivo /etc/network/iptables

Para iniciar, vamos a crear un esqueleto mínimo de reglas necesarias 
para que  iptables-restore no sea gorila. Creamos un nuevo conjunto de 
reglas con el comando

sudo nano /etc/network/iptables
...y lo completamos de la siguiente manera:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Reglas de servicio
-A INPUT -j DROP

# Reglas de reenvío
-A FORWARD -j DROP

COMMIT

Tomémonos un momento para comprender el esqueleto de nuestro conjunto de 
reglas antes de agregarle músculos y órganos. Hemos creado dos 
secciones, *nat y *filter. Cada sección comienza con una *declaración 
apropiada y termina con COMMIT ("Consignar, proceder"). Si no hacemos 
esto bien (o sea, si omitimos algunas de las secciones, escribimos mal 
su nombre, o no agregamos la orden COMMIT al final) el conjunto de 
reglas directamente fracasarán. Y ello será gorila.

Por ahora, este esqueleto básico realmente no cumple demasiado, pero 
constituirá el marco sobre el cual construiremos los mejores años para 
hacer de nuestro equipo un excelente Router Peronista. Entender esto 
ahora, antes de echar las carnes, nos facilitará mucho el trabajo que 
nos demandará en breve.
Activar el NAT
En este punto tenemos una MiniPC que sabe cómo aceptar un paquete en una 
interfaz, y si está dirigido a una dirección en otra interfaz, 
reenviarlo allí. Debido a que por el momento no hemos consignado nuestro 
conjunto de reglas aún, el router peronista no va a discriminar sobre de 
quién viene, qué es, o a quién va. Solamente rutea. Tampoco realiza una 
Traducción de Dirección de Red (NAT, Network Address Translation),

Ahora que sabemos cual puerto es cual, hemos de activarlos y comentarlos 
en nuestro conjunto de reglas iptables. También procederemos a insertar 
una regla que active la NAT. Para ello ingresamos:

 sudo nano /etc/network/iptables

...y editamos el archivo de modo que quede: 

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# enp4s0 es la interfaz internet WAN, #enp5s0 es la interfaz local LAN
-A POSTROUTING -o enp4s0 -j MASQUERADE

COMMIT

Aquí lo tenemos. Una interfaz es la LAN, la otra es la WAN, y tenemos la 
Traducción de Dirección de Redes operando entre ambas. Aún no estamos 
demasiado listos para conectarnos a la Internet, pero falta menos. 
Probablemente querremos que nuestro Router Peronista otorgue direcciones 
IP a través de la interfaz LAN, como podría otorgar privilegios a 
nuestros niños. Para ello aplicamos el conjunto de reglas con NAT 
activado adecuado, por medio del comando de organización:

sudo /etc/network/pre-up.d/iptables

...esto refrescará el conjunto de reglas iptables con cualquier cosa 
nueva que hayamos incorporado al archivo /etc/network/iptables.
Este mismo comando  

sudo /etc/network/pre-up.d/iptables 
...es el que habremos de ejecutar toda vez que querremos modificar y 
aplicar el conjunto de reglas activo.
Configurar DHCP y DNS
Configurar nuestro router para que cumpla con la tarea de DHCP es 
sencillo. Ingresamos el comando:

sudo apt-get install isc-dhcp-server

...y lo configuramos con el comando:

sudo nano /etc/dhcp/dhcpd.conf

...modificándolo para que quede similar a:

subnet 192.168.99.0 netmask 255.255.255.0 {
 range 192.168.99.100 192.168.99.199;
 option routers 192.168.99.1;
 option domain-name-servers 192.168.99.1;
 option broadcast-address 192.168.99.255;
}

Probablemente ya puedan figurarse el significado. La red local será 
192.168.99.x, el router mismo tendrá la IP 192.168.99.1, el router 
servirá DNS por sí mismo, y la dirección de emisión irá donde siempre 
debe ir. Para aplicar las configuraciones ingresamos el comando:

sudo /etc/init.d/isc-dhcp-server restart.

Ya estaremos entregando direcciones IP de forma dinámica.
Aun así nos falta proveernos de DNS locales, lo cual nuestro servidor 
DHCP promete otorgarnos gratuitamente. Hacer esto realidad efectiva es 
incluso más sencillo:  Ingresamos:

sudo apt-get install bind9.

...y no se requieren configuraciones adicionales
Habilitar a clientes acceso DNS y DHCP
En este punto básicamente tenemos todo configurado, pero nuestro router 
está completamente paranoiqueado. Esencialmente sabe cómo resolver 
interrogantes DNS, entregar direcciones IP a eventuales clientes y 
reenviarles tráfico, pero se niega categóricamente a hacerlo. Para que 
nuestro sistema proceda a hacerlo habremos de crear algunas reglas 
claras sobre lo que se permitirá reenviar y lo que se debe permitir 
aceptar. Para ello ingresamos:

sudo nano  /etc/network/iptables

...y le sumamos un conjunto de reglas de servicio como se indica:

# Reglas de servicio

# reglas de aceptación básicas - ICMP, loopback, traceroute, 
establecidas como "acepto todo"
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT

# permitir que salgan rechazos de traceroute
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with 
icmp-port-unreachable

# DNS - aceptarlo desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i enp5s0 -p udp --dport 53 -j ACCEPT

# SSH - aceparlo desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 22 -j ACCEPT

# pedidos de IP desde clientes de DHCP - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p udp --dport 67:68 -j ACCEPT

# descartar (DROP) todo otro tráfico recibido
-A INPUT -j DROP

Con esta configuración aún el router permanece muy paranoico como para 
dejar que el tráfico salga al exterior (la Internet), pero al menos 
ahora dejará que los equipos de nuestra LAN obtengan direcciones IP por 
sí mismos y resuelvan los nombres de host DNS. También permitirá 
funciones como los pings y traceroutes (en este caso, únicamente desde 
cualquier interfaz local). Finalmente, una regla especial permite el 
acceso Secure Shell (SSH) desde la LAN hacia el router, lo cual es útil 
pues ya no tendremos que conectar físicamente monitor y teclado al 
router peronista cada vez que querramos hacer un cambio, sino que 
podremos operarlo a través de SSH en la red local, con el comando:

ssh root@192.168.99.1

Si estáis copiando y pegando a lo puntero político, recuerden 
simplemente una cosa:  enp5s0 es mi interfaz local LAN, pero podría ser 
distinta en vuestro caso. Revisen sus notas para saber cuál interfaz es 
la que les corresponde en particular.
Permitir que el tráfico salga a Internet
Vamos a hacer esto supersencillo. Todas las máquinas tendrán permitido 
salir a internet y hacer lo que les venga en gana:

# Reglas de reenvío

# reenviar paquetes a lo largo de las conexiones 
establecidas/relacionadas
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# reenviar desde la el area local LAN (enp5s0) to internet WAN (enp4s0)
-A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT

# descartar (DROP) todo otro tráfico recibido
-A FORWARD -j DROP

En este punto ya tenemos un Router Peronista y creíble. La MiniPC 
entrega direcciones IP dinámicamente, resuelve pedidos DNS, enruta 
tráfico desde los puertos LAN e internet y viceversa. Además, nada de lo 
que venga de internet tiene permitido el acceso a la LAN. Aún así, 
debemos agregar una característica más antes de considerar al proyecto 
finalizado.

Reenvío de Puertos desde Internet a la LAN
Honestamente, este es la única parte dificultosa de hacer nuestro router 
peronista: crear reenvío en base a puertos, o sea, crear "filtros" desde 
Internet a los clientes conectados en la LAN. Normalmente los routers 
comunes cuentan con una interfaz web que lo hacen sencillo: escogemos 
una IP local, escogemos un protocolo y puerto, y lo configuramos 
"permitir tráfico para el puerto TCP n a la IP local xxx.xxx.xxx.xxx". 
Al emplear iptables será algo más difícil pues requerimos dos entradas 
separadas para cada servicio de reenvio. En este ejemplo, vamos a enviar 
el puerto de TCP número 80 (el servicio HTTP) a través del router) para 
una IP local. Esto es necesario si queremos evaluar la salida de WAN a 
la LAN de un router.

En primer lugar, creamos una entrada en la sección *nat:

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# enp4s0 es la interfaz de internet WAN, #enp5s0 es la interfaz local 
LAN
-A POSTROUTING -o enp4s0 -j MASQUERADE

# filtro NAT: HTTP desde WAN a LAN
-A PREROUTING -p tcp -m tcp -i enp4s0 --dport 80 -j DNAT 
--to-destination 192.168.99.100:80

COMMIT

Esta línea de pre-enruteamiento le dice al router que un tráfico 
arbitrario desde la internet (tráfico que aún no está asociado con una 
conexión de salida desde la LAN) dirigido al puerto 80, debe ser 
reenviado a la máquina local en la dirección IP 192.168.99.100. Sin 
embargo, ya que tenemos una regla de descarte por defecto (DROP) en 
nuestro conjunto de reglas de reenvío, también necesitamos una regla 
allí que nos permita que este tráfico sea reenviado ahora que sabemos 
cómo reenviarlo:

# Reglas de reenvío

# reenviar paquetes a lo largo de las conexiones 
establecidas/relacionadas
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# reenviar desde LAN local enp5s0 a internet WAN (enp4s0)
-A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT

# permite el tráfico desde nuestro filtro NAT
-A FORWARD -p tcp -d 192.168.99.100 --dport 80 -j ACCEPT

# descartar (DROP) todo otro tráfico reenviado
-A FORWARD -j DROP

Si le erramos a esto (si olvidamos la regla PREROUTING o la regla 
FORWARD, o si ponemos la regla PREROUTING en la seccion *filter de la 
regla FORWARD, o la regla FORWARD en la sección *nat), nuestro router se 
pondrá gorila y se negará a cargar el conjunto de reglas o fracasará 
directamente al reenviar el tráfico hacia donde debe dirigirse a través 
del filtro. No es excesivamente difícil, pero si es algo estructurado 
que debemos conocer, por ello es que he recurrido a colores para indicar 
las interfaces, y a comentarios que explican todo.
El conjunto de reglas finalizado y completo
Ha sido necesario avanzar lentamente sobre cada sección de nuestro 
conjunto de reglas para asegurarnos de explicar y entender qué estamos 
haciendo. Aqui pasaré en limpio el conjunto de reglas completo, en una 
sola pieza y con comentarios para el beneficio de la Masa Popular, que 
es la más maravillosa música.

Por favor recuerden que sus nombres de interfaz probablemente sean 
diferentes al mío. ¡No copien a lo Tamborini-Mosca enp4s0 y enp5s0 y se 
pregunten porque no funcionan!.


*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# enp4s0 es la interfaz internet WAN, #enp5s0 es la interfaz local LAN
-A POSTROUTING -o enp4s0 -j MASQUERADE

# Filtro NAT: HTTP desde internet WAN enp4s0 a la local LAN
-A PREROUTING -p tcp -m tcp -i enp4s0 --dport 80 -j DNAT 
--to-destination 192.168.99.100:80

COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Reglas de Servicio

# reglas de aceptación básicas - ICMP, loopback, traceroute, 
establecidas como "acepto todo"
-A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT

# permitir que salgan rechazos de traceroute
-A INPUT -p udp -m udp --dport 33434:33523 -j REJECT --reject-with 
icmp-port-unreachable

# DNS - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 53 -j ACCEPT
-A INPUT -i enp5s0 -p udp --dport 53 -j ACCEPT

# SSH - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p tcp --dport 22 -j ACCEPT

# pedidos de IP desde clientes de DHCP - aceptarlos desde la LAN
-A INPUT -i enp5s0 -p udp --dport 67:68 -j ACCEPT

# descartar (DROP) todo otro tráfico recibido
-A INPUT -j DROP

# Reglas de Reenvío

# reenviar paquetes a lo largo de las conexiones 
establecidas/relacionadas
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# reenviar desde LAN local enp5s0 a internet WAN (enp4s0)
-A FORWARD -i enp5s0 -o enp4s0 -j ACCEPT

# permite el tráfico desde nuestro filtro NAT
-A FORWARD -p tcp -d 192.168.99.100 --dport 80 -j ACCEPT

# descartar (DROP) todo otro tráfico reenviado
-A FORWARD -j DROP

COMMIT

Una vez que estamos seguros de tener todo el conjunto de reglas y que 
está adaptado adecuadamente a nuestras interfaces de red y equipamiento, 
es tiempo de aplicar todo con el comando: 

sudo /etc/network/if-pre-up.d/iptables

Con esto, finalmente tendremos nuestra MiniPC operando como excelente 
router y además, tendremos dicha máquina para operar como servidor. Con 
un poco de ingenio podremos montar un servidor Apache para dar servicio 
a páginas Web, MySQL para dar servicio de bases de datos relacionales, 
incluso hasta servidores de BBS. ¡Y todo gracias al Justicialismo!