Páginas

Mostrando entradas con la etiqueta ipfw. Mostrar todas las entradas
Mostrando entradas con la etiqueta ipfw. Mostrar todas las entradas

martes, 14 de septiembre de 2021

Firewall IPFW Freebsd

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

Nota: Extensiones imprescindibles Firefox 78.14.0 esr (64-bit)

IPFW - proteger una estación de trabajo freeBSD y permitir acceso remoto vía SSH.

IPFW es un cortafuegos stateful escrito para FreeBSD que soporta tanto IPv4 como IPv6. Está formado por varios componentes: el procesador de reglas de filtrado del kernel y su función integrada de contabilidad de paquetes, la función de registro, NAT, el conformador de tráfico dummynet(4), una función de reenvío, una función de puente y una función ipstealth.

# sysrc firewall_enable="YES"
# sysrc firewall_script="/etc/ipfw.rules"
# sysrc firewall_logging="YES"
# echo "net.inet.ip.fw.verbose_limit=5" >> /etc/sysctl.conf
# sysrc firewall_logif="YES"
# service ipfw start
# sysctl net.inet.ip.fw.verbose_limit=5
% cat /etc/ipfw.rules
###################################
#!/bin/sh
ipfw -q -f flush

LAN="192.168.88.0/24"
cmd="/sbin/ipfw -q add"
pif="re0"

$cmd 00100 allow ip from any to any via lo0
$cmd 00200 deny ip from any to 127.0.0.0/8
$cmd 00300 deny ip from 127.0.0.0/8 to any
$cmd 00400 deny ip from any to ::1
$cmd 00500 deny ip from ::1 to any
$cmd 00600 allow ipv6-icmp from :: to ff02::/16
$cmd 00700 allow ipv6-icmp from fe80::/10 to fe80::/10
$cmd 00800 allow ipv6-icmp from fe80::/10 to ff02::/16
$cmd 00900 allow ipv6-icmp from any to any icmp6types 1
$cmd 01000 allow ipv6-icmp from any to any icmp6types 2,135,136
$cmd 01100 check-state :default
$cmd 01200 allow tcp from me to any established
$cmd 01300 allow tcp from me to any setup keep-state :default
$cmd 01400 allow udp from me to any keep-state :default
$cmd 01500 allow icmp from me to any keep-state :default
$cmd 01600 allow ipv6-icmp from me to any keep-state :default
$cmd 01700 allow udp from 0.0.0.0 68 to 255.255.255.255 67 out
$cmd 01800 allow udp from any 67 to me 68 in
$cmd 01900 allow udp from any 67 to 255.255.255.255 68 in
$cmd 02000 allow udp from fe80::/10 to me 546 in
$cmd 02100 allow icmp from any to any icmptypes 8
$cmd 02200 allow ipv6-icmp from any to any icmp6types 128,129
$cmd 02300 allow icmp from any to any icmptypes 3,4,11
$cmd 02400 allow ipv6-icmp from any to any icmp6types 3
$cmd 02500 allow tcp from $LAN to me 22 in via $pif setup limit src-addr 2
$cmd 65000 count ip from any to any
$cmd 65100 deny { tcp or udp } from any to any 135-139,445 in
$cmd 65200 deny { tcp or udp } from any to any 1026,1027 in
$cmd 65300 deny { tcp or udp } from any to any 1433,1434 in
$cmd 65400 deny ip from any to 255.255.255.255
$cmd 65500 deny ip from any to 224.0.0.0/24 in
$cmd 65500 deny udp from any to any 520 in
$cmd 65500 deny tcp from any 80,443 to any 1024-65535 in
$cmd 65500 deny ip from any to any
$cmd 65535 deny ip from any to any
###################################




FreeBSD es genial!.

martes, 28 de junio de 2016

Samba 4 ipfw en FreeBSD 10.3

Configurar Samba4 e ipfw firewall

Nivel: Avanzado

$ cat /boot/loader.conf
...
autoboot_delay="2"
loader_logo="beastie"
sem_load=YES
mqueuefs_load=YES

Samba es una implementación libre del protocolo de archivos compartidos de Windows (SMB y CIFS) para sistemas de tipo UNIX. De manera que nuestro pc con FreeBSD se vea como servidor de archivos en redes Windows.

Dirección IP del servidor Samba

$ cat /etc/rc.conf | grep ifconfig_em0
ifconfig_em0="inet 192.168.1.110 netmask 255.255.255.0"

# hostname
root@fbsdsmb

Instalar samba42
# pkg search samba
# pkg install samba42

Un solo usuario accediendo a su directorio personal

La forma más fácil de configurar un cliente es crear una cuenta Unix y su correspondiente directorio personal para el cliente en el servidor, luego  notificar a Samba la existencia de ese usuario. Posteriormente en el fichero de configuración de Samba se creará un recurso de disco compartido que apunte al directorio personal del usuario y a traves de valid users restringiremos su acceso.

# adduser
...

# smbpasswd -a luca

[luca]
path = /home/luca
comment = Luca's Home Directory
writeable = yes
valid users = luca

o puedes referirte al directorio personal del usuario usando la variable %H. También puedes utilizar las variables de nombre de usuario Unix %u y de nombre de usuario cliente %U.

[luca]
comment = %U Home Directory
writeable = yes
valid users = luca
path = %H

Estos dos ejemplos funcionan mientras el usuario Unix que Samba utiliza para referirse al cliente tiene derechos de lectura/escritura sobre el directorio al que se refiere la opcion path.

Agregar usuario luca a Samba
# smbpasswd -a luca

Acceso de grupo a un recurso compartido

Si estás creando un directorio compartido para acceso de grupo, hay varios pasos adicionales a realizar. Vamos a echar un vistazo a un recurso compartido para el departamento de Contabilidad en el fichero smb4.conf:

[contabilidad]
comment = Directorio Departmento de Contabilidad
writeable = yes
valid users = @cuenta
path = /srv/accounting
create mode = 0660
directory mode = 0770

@account como el usuario válido en lugar de uno o más nombres de usuario individuales es un atajo para decir que los usuarios válidos están  representados por el grupo Unix cuenta. Estos usuarios necesitan ser añadidos al grupo cuenta en el fichero de grupos del sistema (/etc/group) para ser reconocidos como parte del grupo. Una vez que lo son, Samba los reconocerá como usuarios válidos para el recurso compartido. Necesitarás crear un directorio compartido para que los miembros del grupo tengan acceso, que será mapeado a través de la opción de configuración path.


# mkdir /srv/accounting
# chgrp cuenta /srv/accounting
# chmod 770 /srv/accounting

Crear grupo cuenta
# pw groupadd cuenta

Agregar usuario luca al grupo cuenta
# pw groupmod cuenta -M luca

Ejemplos de usuarios, grupos y comparticiones

Crear los directorios
# mkdir -p /svr/p
# mkdir /svr/s
# mkdir /svr/t
# mkdir /srv/public

Añadir los usuarios al sistema FreeBSD
# adduser
Username: prof
...
# adduser
Username: super
...
# adduser
Username: argo
...
# adduser
Username: invitado
...
# adduser
Username: susiaxel

Establecer los usuarios propietarios de los directorios

# chown -R prof:prof /svr/p
# chown -R super:super /svr/s
# chown -R argo:prof /svr/t
# chown -R invitado:invitado /svr/public

Crear nuevos grupos

# pw groupadd stp
# pw groupadd tp

Agregar usuario super al grupo stp

# pw groupmod stp -M super

Agregar usuarios argo y prof al grupo tp

# pw groupmod tp -M argo,prof

Agregar usuarios invitado y susiaxel al grupo invitado

# pw groupmod invitado -M invitado,susiaxel
# pw groupshow tp
tp:*1009:prof,argo
# pw groupshow invitado
invitado:*:1007:invitado,susiaxel

Archivo de configuración de Samba /usr/local/etc/smb4.conf

##############INICIO###############
[global]

invalid users = root bin daemon adm sync shutdown \
halt mail news uucp operator gopher
workgroup = MYOFFICE
server string = My Office Server
dos charset = cp850
unix charset = UTF-8
fstype = NTFS
security = user
encrypt passwords = yes
wins support = yes
name resolve order = wins lmhosts hosts bcast
max open files = 16384
use mmap = yes
unix extensions = no
hosts allow = 192.168.1. 192.168.3. localhost

# Debug logging information
log level = 2
log file = /var/log/samba4/samba.log.%m
max log file = 100
debug timestamp = yes

# Browsing election options
os level = 34
local master = yes

[homes]

comment = Home Directories
browseable = no
writeable = yes
directory mask = 0750
create mask = 0644

[luca]

comment = %U Home Directory
writeable = yes
valid users = luca path = %H

[contabilidad]

comment = Directorio Departmento de Contabilidad
writeable = yes
valid users = @cuenta
path = /srv/accounting
create mode = 0660
directory mode = 0770

[public]

comment = public
path = /srv/public
public = no
writeable = yes
write list = @invitado
directory mask = 0770
create mask = 0660

[super]

comment = super
path = /srv/s
public = no
writeable = yes
write list = super
directory mask = 0750
create mask = 0644

[profesores]

comment = Profesores
path = /srv/p
public = no
writeable = yes
write list = prof, @stp
directory mask = 0750
create mask = 0644

[alumnos]

comment = alumnos
path = /srv/t
public = no
writeable = yes
write list = super, @tp
directory mask = 0770
create mask = 0660
#############FINAL###############

Habilitar Samba server

# echo 'samba_server_enable="YES"'>>/etc/rc.conf

Iniciar el servicio
# service samba_server start

Opciones de ficheros de registro

Hemos añadido un fichero de registro de usuario que reporta información de depuración de nivel 2. El nivel 2 nos proporcionará información útil sin ocupar mucho espacio en disco en el sevidor.

Este fichero está localizado en el directorio /var/log/samba4 definido con la opción log file del fichero de configuración. Podemos usar una de las variables proporcionada por Samba para crear ficheros de registro independientes para cada cliente, como la variable %m.
log file = /var/log/samba4/samba.log.%m

Aislar los mensajes de registro puede resultar útil en el momento de tener que rastrear un error de red si el problema viene de una máquina o cliente determinado. Ninguno de ellos puede exceder en tamaño de 100 kb, indicado en la opción log size.

La fecha y la hora de la depuración en los registros nos la proporciona la opción debug timestamp, el cual es el valor por defecto. Coloca una cadena de fecha y hora en el formato timestamp junto a cada mensaje en el fichero de registro.


Recurso compartido homes

La sección [homes] puede representar cualquier cuenta en la máquina, esto no es deseable. Por ejemplo, podría crear un recurso compartido para root, bin, uucp y similares. La opción invalid users protege frente a esto.

Si un usuario intenta conectar a un recurso compartido ordinario que no aparece en el fichero smb.conf, Samba va a buscar el recurso compartido [homes]. Si no existe, el nombre del recurso compartido enviado a Samba se asume como un nombre de usuario y se busca como tal su contraseña en la base de datos (/etc/passwd) del servidor Samba. Si aparece, Samba asume que el cliente es un usuario Unix intentando conectar a su directorio personal.

Si susi esta intentando conectar a un recurso compartido llamado [susi] en el servidor Samba. Existe un recurso compartido [homes], No hay un recurso compartido con ese nombre en el fichero de configuración, el usuario susi está presente en la base de datos de contraseñas entonces, Samba crea un nuevo recurso compartido llamado [susi] con el  especificado en la seccion, Samba la inicializa a su directorio personal. Samba inicializa las opciones del nuevo recurso a partir de las opciones por defecto de la sección [globals], por último conecta al cliente susi a este nuevo recurso.

Aumentar la seguridad

Hemos visto que ocurre cuando especificas usuarios válidos, también puedes establecer una lista de usuarios no válidos, a los que nunca les será permitido acceder a Samba o a sus recursos. Esto se hace con la opción invalid users. Un valor por defecto relacionado con la sección [homes] para asegurar que determinados usuarios y superusuarios del sistema no pueden ser manipulados o alterados para conseguir acceso a éste.

[global]

invalid users = root bin daemon adm sync shutdown \
halt mail news uucp operator gopher

Por conveniencia, decidimos habilitar la opción del fichero Samba hosts allow = 192.168.1. 192.168.3. localhost que permite conectar con nuestro servidor desde las redes: 192.168.3.0/25 y 192.168.1.0/24. Una vez hecho esto cambiaremos la dirección IP del servidor a la dirección 192.168.3.110 para que quede detrás de nuestro firewall basado en openbsd, soekris y pf, configurado en un artículo anterior cuya IP es 192.168.3.1 y con DHCP activado.

Cambiar IP y puerta de enlace del servidor:

# ee /etc/rc.conf
ifconfig_em0="inet 192.168.3.110 netmask 255.255.255.128"
defaultrouter="192.168.3.1"
...

Cambios en el Firewall ipfw

A continuación añadimos estas dos líneas al fichero de configuración del firewall /etc/ipfw.rules

add 5139 allow tcp from 192.168.3.0/25 to any 139 keep-state setup
add 5300 allow ip from 192.168.3.0/25 to 192.168.3.0/25

Conexiones físicas

Conectamos los cables ethernet al router Soekris de las máquinas involucradas. En este caso nuestro servidor, la máquina win xp, la máquina win 7, cualquier otra máquina conectadas directamente al router cuya ip es 192.168.1.1 (proveedor ISP) también podrá acceder a los recursos del servidor como ya hemos visto.

# service samba_server restart
# service ipfw restart

El servidor Samba está actuando como visualizador maestro local para la actual subred

nmbd/nmbd_become_lmb.c:become_local_master_stage2
*****
Samba name server FBSDSMB is now a local master browser for
workgroup MYOFFICE on subnet 192.168.3.110
****

write list - Una lista de usuarios o grupos (nombres de grupo tienen el prefijo @) que será capaz de escribir a este recurso compartido. Los permisos de usuarios adecuados todavía tienen que ser establecidos en el directorio.

directory mask - por defecto - 0755
create mask - por defecto - 0744
force create mode - por defecto - 000
force directory mode - por defecto - 0000

En Samba en lugar de definir lo que está restringido, define lo que está permitido.

Los siguientes valores de las opciones definidas de un recurso compartido en smb4.conf :

directory mask = 0700
create mask = 0600

directory mask. Permite al usuario propietario permisos de lectura, escritura y ejecución. Al grupo y otros no les permite ni leer, ni escribir, ni ejecutar (no tendrán acceso a este directorio).

create mask. Permisos de lectura, escritura al usuario propietario. El grupo y otros no tienen permisos de lectura ni escritura.

create mask = 744

Por ejemplo, la opción create mask forzará que los permisos de un archivo creado por un cliente Windows sean, como mucho, 744

mientras que la opción directory mask que mostramos a continuación forzará los permisos de un recién creado directorio a, como mucho, 755:

directory mask = 755

directory mask - Recomendamos la máscara 0750 o rwxrx, eliminando la posibilidad de acceso al resto de usuarios que no son tú, y no pertenecen a tu grupo. 

create mask - Si necesitas cambiarlo a archivos no ejecutables, recomendamos 0644, o rw−r−r−.

Como ejemplo, considere los siguientes valores de las opciones definidas de un recurso compartido en smb4.conf :

create mask = 0770
directory mask = 0770

Esto permitiría ambos, archivos y directorios leer, escribir y ejecutar permisos para usuario y grupo, pero no a otros. Al mismo tiempo, obliga al grupo permisos leer y escribir para archivos y de lectura, escritura y ejecución para los directorios.

testparm comprueba la existencia de errores en el fichero de configuración del servidor Samba

# testparm

Solucionar errores 

# sysctl kern.maxfilesperproc=16384
kern.maxfilesperproc: 14040 -> 16384
# sysctl kern.maxfiles=16384
kern.maxfiles: 14040 -> 16384

Hacer permanente los cambios

# echo 'kern.maxfilesperproc=16384'>>/etc/sysctl.conf
# echo 'kern.maxfiles=16384'>>/etc/sysctl.conf

Que está ofreciendo el servidor a la red

# smbclient -U% -L localhost


Sincronizar usuarios

Esto se puede resolver de tres maneras: en primer lugar al mantener manualmente los usuarios de FreeBSD y sincronizar con una base de datos de usuario Samba - específica mediante la utilidad smbpasswd. Esta utilidad se comporta de manera similar a la utilidad "pw". Es la solución más simple y se recomienda para pequeñas instalaciones con varios usuarios, que muy rara vez cambian sus contraseñas. Tenga en cuenta que primero tendrá que añadir un usuario a FreeBSD (shell-nologin), y luego añadir un usuario Samba con el mismo nombre usando "smbpasswd -a".

Despúes de añadir usuarios a FreeBSD lo agregamos a Samba 

# smbpasswd -a super
# smbpasswd -a prof
# smbpasswd -a argo
# smbpasswd -a invitado
# smbpasswd -a susiaxel


Implementación del firewall ipfw

Los firewalls de red bloquean (previenen) a ciertos tipos de paquetes de red llegar a determinados servicios del sistema. la práctica moderna de seguridad es en realidad para bloquear todos los paquetes excepto un pequeño conjunto de elegidos, con el fin de reducir al mínimo la superficie de ataque, o el número y el alcance de los servicios que están expuestos a la red.

En este caso permitimos todo tráfico IP mediante la interfaz loopback, ssh, http, https, samba-cifs, permitir todos los paquetes IP independientemente del protocolo o cualquier otro detalle de todas las direcciones en una red local a todas las direcciones en la misma red, Niega todos los demás paquetes de red y los registra en syslog.

# cat /etc/ipfw.rules

###########INICIO####################
add 500 allow ip from any to any via lo0

add 1000 allow icmp from any to any

add 2000 allow tcp from me to any setup keep-state

add 2001 allow udp from me to any keep-state

add 4022 allow tcp from any to me 22 setup keep-state

add 4080 allow tcp from any to me 80, 443 setup keep-state

add 4139 allow tcp from 192.168.1.0/24 to any 139 keep-state setup

add 5000 allow ip from 192.168.1.0/24 to 192.168.1.0/24

add 5139 allow tcp from 192.168.3.0/25 to any 139 keep-state setup

add 5300 allow ip from 192.168.3.0/25 to 192.168.3.0/25

add 65400 deny log ip from any to any
###############FINAL#####################

# echo 'firewall_enable="YES"'>>/etc/rc.conf
# echo 'firewall_type="/etc/ipfw.rules"'>>/etc/rc.conf

# service samba_server restart
# service ipfw restart

# netstat -a | grep ipv4
# ipfw list


Eleccion de Visualizador

Samba puede usar una elección de visualizador para una variedad de resultados, incluyendo el ser siempre el visualizador maestro local de la subred o no serlo nunca. Por ejemplo, las siguientes opciones (sección global), asegurará que Samba siempre gane la elección de visualizador maestro local, sin importar qué otras máquinas estén presentes en la red:

# Browsing election options
os level = 34
local master = yes

Saber si una máquinan es el visualizador maestro local

Usando el comando nbtstat puedes saber si una máquina es el visualizador maestro local. Coloca el nombre NetBIOS de la máquina que quieras interrogar tras la opción −a:

C:\> nbtstat -a fbsdsmb


La línea que estás buscando es ..__MSBROWSE__.<01>. Indica que el servidor está actuando como el visualizador maestro local para la actual subred. 

Conectar con un recurso compartido desde un ordenador con Windows XP. 

En este caso utilizando el nombre del servidor y el nombre del recurso compartido (alumnos), que pertenece al usuario argo. El nombre de usuario y la contraseña que fueron creadas en el cliente deben coincidir con la combinación usuario/contraseña del servidor.


Desde un ordenador con Windows 7 conectamos con un recurso compartido. Los usuarios solo podrán acceder a los archivos y carpetas cuyos permisos sean establecidos en el archivo smb4.conf.


Referencias:
https://wiki.freebsd.org/Samba
https://www.freebsd.org/doc/faq/
http://es.tldp.org/Manuales-LuCAS/USANDO-SAMBA/usando-samba.pdf

Unix es genial!.

martes, 20 de mayo de 2014

FreeBSD Server NAT IPFW


FreeBSD Server NAT IPFW

Nuestro servidor FreeBSD está dotado con dos tarjetas de red.

em0 interface LAN IP 192.168.3.1/24
em1 interface WAN (internet) 192.168.1.250/24

Algunos pasos adicionales son necesarios para que el servidor FreeBSD se convierta en router intermedario entre Internet y la red interna.

Después de intalar FreeBSD 9.1-RELEASE tendremos que recompilar el KERNEL para Habilitar NAT + FIREWALL, no sin antes tener las fuentes del núcleo instaladas.

Instalar las fuentes del kernel:
Si el directorio /usr/src/sys no existe quiere decir que las fuentes del kernel no están instaladas.

# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/9.1-RELEASE/src.txz

Descomprimir el archivo en /usr/src:

# tar -C / -xvzf src.txz

Ahora desde el directorio arch/conf copiar el archivo de configuración GENERIC utilizando cualquier nombre:

# cp /usr/src/sys/amd64/conf/GENERIC /usr/src/amd64/conf/MYKERNEL

Añadir las siguientes opciones a /usr/src/sys/amd64/conf/MYKERNEL
# ee /usr/src/sys/amd64/conf/MYKERNEL
...
options    IPFIREWALL
options    IPFIREWALL_VERBOSE
options    IPFIREWALL_VERBOSE_LIMIT=5
options    IPFIREWALL_DEFAULT_TO_ACCEPT
options    IPDIVERT
...

Recompilar el kernel:
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL

El nuevo kernel se copiará al directorio raíz como /kernel y el viejo kernel tendrá de nombre kernel.old.

Reiniciar el sistema con el nuevo kernel.

Nos conectamos vía SSH para comprobar el nuevo kernel:
$ ssh -p 2222 remoto@freebsdsvr
Password:

$ hostname
freebsdsvr.linux.bcn

$ uname -a


Archivos de configuración:

$ cat /etc/rc.conf
gateway_enable="YES"     # igual que net.inet.ip.forwarding=1
natd_enable="YES" # Habilita NAT
natd_interface="em1" # nombre de la interfaz NIC conecta a Internet
natd_flags="-dynamic -m" # -m = preserve port numbers; additional
firewall_enable="YES"    # activa ipfw firewall
firewall_type="simple"   # protege red interna (LAN)
firewall_logging="YES"   # habilita log
firewall_script="/etc/rc.firewall" # path scrip IPFW

$ cat /boot/loader.conf
ipfw_load="YES"
ipdivert_load="YES"
autoboot_delay="2"
loader_color="YES"

FreeBSD - The power to Serve!

http://www.pl.freebsd.org/doc/handbook/firewalls-ipfw.html

Unix es genial!.

domingo, 17 de noviembre de 2013

FreeBSD server NAT IPFW dhcp-server dnsmasq squid

 Me encanta FreeBSD. Este servidor local es una pequeña máquina con un consumo muy bajo e incluye nat, firewall, dhcp-server, dnsmasq y squid y será el intermediario entre la red local e Internet. El sistema perfecto para esta tarea es FreeBSD.

Nuestro servidor FreeBSD está dotado con dos tarjetas de red.

em0 interface LAN IP 192.168.3.1/24
em1 interface WAN (internet) 192.168.1.254/24

Compilar kernel personalizado. Habilitar NAT + FIREWALL

Todo lo que existe dentro de un directorio de una arquitectura en particular, es específico para dicha arquitectura, el resto del código es común para todas las plataformas en las que FreeBSD funciona.

Si el dirctorio /usr/src/sys no existe quiere decir que las fuentes del kernel no están instaladas.

Es necesario tener el codigo fuente completo de FreeBSD para poder compilar el kernel.

Descargar las fuentes del kernel 9.1-RELEASE:

Instalar wget
# pkg_add -r wget

$ cd ~/descargas
$ fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/9.1-RELEASE/src.txz

Descomprimir el archivo a /usr/src:
# tar -C / -xzvf src.txz

Ahora desde el directorio arch/conf copiar el archivo de configuración GENERIC utilizando cualquier nombre:

# cp /usr/src/sys/amd64/conf/GENERIC /usr/src/amd64/conf/NEWGENERIC

Añadir las siguientes opciones a /usr/src/sys/amd64/conf/NEWGENERIC
# ee /usr/src/sys/amd64/conf/NEWGENERIC
...
options IPFIREWALL
options IPDIVERT

options IPFIREWALL_VERBOSE
...

# cd /usr/src
# make buildkernel KERNCONF=NEWGENERIC

# make installkernel KERNCONF=NEWGENERIC

El nuevo kernel se copiará al directorio raíz como /kernel y el viejo kernel tendrá de nombre kernel.old.

Reiniciar el sistema con el nuevo kernel.

Archivos de configuración:

$ cat /boot/loader.conf
ipfw_load="YES"
ipdivert_load="YES"
autoboot_delay="2"

$ cat /etc/rc.conf
hostname="freebsdsvr.linux.bcn"
keymap="spanish.iso.kbd"

# interface con acceso a Internet
ifconfig_em1="DHCP"
defaultrouter="192.168.1.1"
sshd_enable="YES"

# interface LAN
ifconfig_em0="inet 192.168.3.1 netmask 255.255.255.0"
moused_enable="NO"

# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"

gateway_enable="YES"
firewall_enable="YES"
firewall_logging="YES"
natd_enable="YES"
natd_interface="em1"
natd_flags="-f /etc/natd.conf"

# reglas personalizadas
# firewall_script="/etc/ipfw.rules"

# activer reglas dinamicas protegiendo LAN
firewall_script="/etc/rc.firewall"
firewall_type="simple"

$ ee /etc/natd.conf
use_sockets yes
same_ports yes
unregistered_only yes
dynamic yes

redirect_port tcp 192.168.3.60:80 8080
redirect_port tcp 192.168.3.60:22 2222

Guardar y salir

Reiniciar el servidor para comprobar que no tenemos mensajes de error.

# shutdown -r now

Todo perfecto. Seguimos con dhcp-server dnsmasq y squid:

Intalar y configurar dhcp-server

# pkg_add -r isc-dhcp41-server
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-9.1-release/Latest/isc-dhcp41-server.tbz... Done.
===> Creating users and/or groups.
Creating group 'dhcpd' with gid '136'.
Creating user 'dhcpd' with uid '136'.

Así quedará el archivo dhcpd.conf:

# sed -e '/^[ ]*#/d' -e '/^$/d' /usr/local/etc/dhcpd.conf
option domain-name "linux.bcn";
option domain-name-servers 192.168.3.1, 192.168.1.1;
option subnet-mask 255.255.255.0;
default-lease-time 3600;
max-lease-time 86400;
ddns-update-style none;
subnet 192.168.3.0 netmask 255.255.255.0 {
 range 192.168.3.40 192.168.3.50;
 option routers 192.168.3.1;

}
Para iniciar dhcp-server con el sistema

agregar al archivo rc.conf:
dhcpd_enable="YES" # dhcpd enabled?
dhcpd_flags="-q" # command option(s)
dhcpd_conf="/usr/local/etc/dhcpd.conf" # configuration file
dhcpd_ifaces="em0"    # ethernet interface(s)
dhcpd_withumask="022"   # file creation mask

Iniciar el servidor dhcp:
# /usr/local/etc/rc.d/isc-dhcpd start
Starting dhcpd.

Dnsmasq

Instalar dnsmasq
$cd /usr/ports
$ make search name=dnsmasq
$ cd /usr/ports/dns/dnsmasq/
# make install clean

cp /usr/local/etc/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf

Archivo de configuración dnsmasq.conf
Filtrando dnsmasq.conf con sed para eliminar líneas que empiezan con un espacio, líneas que comienzan con almohadilla y líneas vacías.

sed -e '/^[ ]*#/d' -e '/^$/d' /etc/dnsmasq.conf
port=53
domain-needed
bogus-priv
strict-order
interface=em0
listen-address=127.0.0.1
expand-hosts
domain=linux.bcn

También podemos utilizar dnsmasq como dns  + dhcp y prescindir del servidor isc-dhcp; en cuyo caso el archivo /usr/local/etc/dnsmasq.conf quedaría más o menos como sigue: (Acto seguido se detiene el servidor dhcd # killall dhcpd, comentar las líneas que hacen referencia a dchp en el archivo /etc/rc.conf y reiniciar el servicio dnsmasq:

port=53
domain-needed
bogus-priv
strict-order
interface=em0
listen-address=127.0.0.1
expand-hosts
domain=linux.bcn
dhcp-range=192.168.3.40,192.168.3.50,12h
dhcp-host= 00:21:9b:e2:cd:44,192.168.0.60,infinite

Iniciar dnsmasq
# /usr/local/etc/rc.d/dnsmasq start
Starting dnsmasq.

Iniciar dnsmasq con el sistema
agregar esta línea al archivo /etc/rc.conf
dnsmasq_enable="YES"

Archivo resolv.conf del servidor

#permite a las maquinas locales obtener información DNS.
nameserver 127.0.0.1

#OpenDNS
nameserver 208.67.222.222
nameserver 208.67.220.220

# Otra opcion es utilizar los DNS del proveedor ISP.
# nameserver 192.168.1.1

Impedir cambios en el fichero resolv.conf
Añadir esta línea al archivo de configuración de resolv.conf (resolvconf.conf)
# ee /etc/resolvconf.conf
resolv_conf="/dev/null"

Archivo resolv.conf de las máquinas cliente: $ cat /etc/resolv.conf
# Archivo inmutable resolv.conf
search linux.bcn
nameserver 192.168.3.1

Realizar consultas desde un cliente, comprobar que dnsmasq funciona:
$ nslookup # sustituido por drill en FreeBSD 10
> freebsdsvr
Server:        192.168.3.1
Address:    192.168.3.1#53

Non-authoritative answer:
Name:    freebsdsvr.linux.bcn
Address: 67.215.65.132

Squid

Instalar squid como paquete
# pkg_add -r squid
# squid -v
Version 2.7.STABLE9

Archivo de configuración squid.conf
Copiar archivo squid.conf
# cp /usr/local/etc/squid/squid.conf.default /usr/local/etc/squid/squid.conf

Filtrando el archivo /usr/local/etc/squid/squid.conf para ver las opciones del archivo de configuración de squid.:
Utilizando las opciones por defecto squid en freebsd funcionará a la primera.

# sed -e '/^[ ]*#/d' -e '/^$/d' /usr/local/etc/squid/squid.conf
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80  # http
acl Safe_ports port 8080  # also http
acl Safe_ports port 21  # ftp
acl Safe_ports port 443  # https
acl Safe_ports port 70  # gopher
acl Safe_ports port 210  # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280  # http-mgmt
acl Safe_ports port 488  # gss-http
acl Safe_ports port 591  # filemaker
acl Safe_ports port 777  # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /var/squid/logs/access.log squid
refresh_pattern ^ftp:  1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern .  0 20% 4320
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
coredump_dir /var/squid/cache
cache_log /var/squid/logs/cache.log
logfile_rotate 10
minimum_object_size 0 KB
maximum_object_size 1024 MB
request_body_max_size 0
cache_dir ufs /var/squid/cache 5000 16 256
cache_mem 32 MB
visible_hostname freebsdserver

Crear los directorios swap
# squid -z

Desactivar test DNS inicial
# squid -D

Iniciar con el sistema.
Agregar al archivo /etc/rc.conf
squid_enable="YES"

El proxy ha sido configurado como transparent de manera que no hace falta configurar el navegador de los clientes:
Comprobar puertos abiertos:
# sockstat -4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS     
carlos   sshd       1572  3  tcp4   192.168.3.1:2222      192.168.3.60:41422
root     sshd       1569  3  tcp4   192.168.3.1:2222      192.168.3.60:41422
root     sendmail   1496  3  tcp4   127.0.0.1:25          *:*
root     sshd       1493  4  tcp4   *:2222                *:*
squid    squid      1483  6  udp4   *:14091               *:*
squid    squid      1483  13 tcp4   192.168.3.1:3128      *:*
squid    squid      1483  14 tcp4   192.168.3.1:8080      *:*
squid    squid      1483  15 udp4   *:3130                *:*
dhcpd    dhcpd      1470  7  udp4   *:67                  *:*
nobody   dnsmasq    1368  3  udp4   *:53                  *:*
nobody   dnsmasq    1368  4  tcp4   *:53                  *:*
root     syslogd    1356  7  udp4   *:514                 *:*
root     natd       1318  3  div4   *:8668                *:*

Descargar e instalar parches de seguridad:

# freebsd-update fetch
# freebsd-update install

Si al kernel se ha aplicado algún parche tendrá que reiniciar. A partir de este momento el sistema está parcheado. freebsd-update puede ejecutarse utilizando cron con una entrada en /etc/crontab:

@daily  root  freebsd-update cron

Esta línea hará que una vez al día se ejecutr freebsd-update. El argumento cron pasado a freebsd-update intentará saber si existen actualizaciones. Si hay parches disponibles automáticamente los descargará al disco local sin instalarlos. El usuario root recibirá un mail informándole que puede aplicarlos.

Si algo ha fallado freebsd-update puede dar marcha atrás (roolback) hasta el último conjunto de cambios con la siguiente orden:

# freebsd-update rollback

Instalar portaudit

# pkg_add -r portaudit
Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-9.1-release/Latest/portaudit.tbz... Done.

===>  To check your installed ports for known vulnerabilities now, do:

      /usr/local/sbin/portaudit -Fda

# portaudit -Fda                     auditfile.tbz                                   0% of   90 kB    0  Bpauditfile.tbz                                 100% of   90 kB  222 kBps
New database installed.
Database created: Sat Nov 16 20:10:00 CET 2013
Affected package: perl-5.14.2_2
Type of problem: perl -- denial of service via algorithmic complexity attack on hashing routines.
Reference: http://portaudit.FreeBSD.org/68c1f75b-8824-11e2-9996-c48508086173.html

Affected package: squid-2.7.9_1
Type of problem: squid -- denial of service.
Reference: http://portaudit.FreeBSD.org/c37de843-488e-11e2-a5c9-0019996bc1f7.html

2 problem(s) in your installed packages found.

You are advised to update or deinstall the affected package(s) immediately.

Para una lista de todas las reglas de funcionamiento de ipfw en secuencia:
# ipfw list




Para una lista de reglas dinámicas, además de reglas estáticas:
 


Unix es genial!.