martes, 1 de febrero de 2022

Router doméstico con FreeBSD 13 e IPFW, opción in-kernel NAT

 En la presente entrada mostramos un "How to" para poder compartir la conexión a internet a través de nuestro servidor FreeBSD.

En el tutorial utilizaremos para NAT la implementación "in-kernel NAT", es reciente y en esta versión 13 no necesita realizar otras acciones que las que se indican aquí. 

Note: probado (test) sobre FreeBSD 12.3 y FreeBSD 13

Escenario:

Internet---Proveedor(modem/router)---(em0)[FreeBSD 13](em1,em2)---Switch LAN

Donde em0, em1, em2 son las interfaces ethernet (cableada) de nuestro sistema operativo FreeBSD 13; los segmentos de red respectivamente para las interfaces son como sigue:

em0-> 192.168.1.0/24 y la ipv4 para la interfaz em0 es 192.168.1.5/24

em1-> 192.168.2.0/24 y la ipv4 para la interfaz em1 es 192.168.2.5/24

em2-> 192.168.3.0/24 y la ipv4 para la interfaz em2 es 192.168.2.5/24

Luego de instalar FreeBSD, realizamos algunos ajustes para nuestro caso, como observamos tenemos 3 interfaces ethernet, agregamos dos interfaces ethernet en el archivo /etc/rc.conf, utilizamos a ee como editor de texto.

#ee /etc/rc.conf

##Network

ifconfig_em0="inet 192.168.1.5 netmask 255.255.255.0"

ifconfig_em1="inet 192.168.2.5 netmask 255.255.255.0"

ifconfig_em2="inet 192.168.3.5 netmask 255.255.255.0"

##Gateway by default

defaultrouter="192.168.1.1"

##Firewall

gateway_enable="YES"                   #para ser puerta de enlace a redes LAN

firewall_enable="YES"                    #habilitamos el firewall nativo a FreeBSD

firewall_nat_enable="YES"             #habilitamos nat  

firewall_script="/etc/ipfw.rules"     #ipfw.rules es un nombre cualquiera.

Como observamos tenemos 254 ipv4 utilizables para cada segmento de red, son segmentos diferentes.

Reiniciamos la red de datos:

#service netif restart 

#ifconfig        #debe mostrarse las nuevas ipv4 en las interfaces lan y hacerle ping a cada ipv4

#service routing restart     #algunas veces es necesario cuando se reinicia las interfaces

 Creamos un archivo con nombre /etc/ipfw.rules, para ello usamos el editor ee (nativo en FreeBSD)

#ee /etc/ipfw.rules

#!/bin/sh

##limpiamos reglas

ipfw -q -f flush

##asignamos un nombre a cada interface

cmd="ipfw -q add"

##interfaces con variabes

pif0="em0"    #wan

pif1="em1"    #Lan 1

pif2="em2"    #Lan 2

##habilitamos a las interfaces

$cmd 005 allow all from any to any via $pif1

$cmd 006 allow all from any to any via $pif2

##para la interface loopback, interface interna

$cmd 010 allow all from any to any via lo0

##reensamblar los paquetes entrantes

$cmd 099 reass  all from any to any in

##Disable one_pass it is necessary or mandatory to NAT, in-kernel NAT

ipfw disable one_pass

##NAT, in-kernel NAT

ipfw -q  nat 1 config if $pif0 same_ports unreg_only reset 

$cmd 100 nat 1 ip from any to any in via $pif0

$cmd 1000 nat 1 ip from any to any out via $pif0

##It is necessary to do ping between interfaces when you use FreeBSD terminal

$cmd 1001 allow ip from any to any

Deshabilitar opciones en /etc/sysctl.conf, necesario para in-kernel NAT

#ee /etc/sysctl.conf

net.inet.tcp.tso="0"

Iniciar el servicio IPFW

#service ipfw start

Listar las reglas escritas, observar que hay una última regla que deniega todo al final

#ipfw list

 Si por algún motivo no ha escrito alguna línea en /etc/rc.conf, por ejemplo te olvidaste de escribir gateway_enable="YES", entonces para que funciones como puerta de enlace a la redes internas, hacer un reboot :D.

#reboot

Al iniciar todo debe estar bien, disfruta de tu enrutador :D

Se puede personalizar bastante, eso depende del conocimiento de ipfw, bloquear, permitir entre otros, en este tutorial se ha puesto interés en hacer NAT, que funcione, no fue de interés hacer un firewall seguro. 

Pruebas: los clientes conectados a las interfaces em1 y em2 utilizan la puerta de enlace de FreeBSD, ipv4 en las interfaces em1 y em2, conociendo defautlrouter en FreeBSD, entonces desde el cliente debe hacer ping, si es así ya esta enrutando y puede hacer ping a otras redes como internet y dominios en internet (el cliente para resolver nombres debe usar un servidor dns)

Referencia: https://docs.freebsd.org/en/books/handbook/firewalls/#firewalls-ipfw

1 comentario:

Cambiar el puerto de SSH en Derivados Red Hat Enterprise Linux 8

 En esta entrada mostraremos una forma de cambiar el puerto por defecto del servicio ssh en Rocky Linux 8. En primer lugar debemos de editar...