Servidor DHCP y NAT

From SoloBSD Wiki

Jump to: navigation, search

Contents

Introducción

En este pequeño tutorial, explicaré como configuré un servidor de DHCP con un cortafuegos y el uso de NAT en un sistema OpenBSD 3.4 para sacar a la red interna a internet. El proceso es bastante sencillo, prácticamente coser y cantar. Para este documento hago la suposición de que el usuario conoce la configuración y manejo básico de la red, ya que omitiré algunos pasos como el reinicio de los servicios de red en el sistema.

Configuración de la Red

Primeramente localizamos nuestras interfaces de red, en mi caso fueron las siguientes: rl0 y rl1 y editamos los archivos:

/etc/hostname.rl0

para indicarle que tomaremos una IP vía DHCP con nuestro proveedor de internet, por lo tanto, añadimos lo siguiente:

dhcp NONE NONE NONE NONE

A continuación vamos con la siguiente y de la misma forma, solo que a esta interfaz le asignaremos una IP para la red interna.

vi /etc/hostname.rl1

inet 192.168.1.1 255.255.255.0 NONE

Listo, ahora tenemos la interfaz rl0 tomando una IP de nuestro proveedor de internet y rl1 con una IP asignada por nosotros, la cual escuchará las peticiones DHCP que nuestros clientes de la red interna hagan al servidor.

A continuación editamos el archivo /etc/sysctl.conf para habilitar el IP Forwarding en nuestro equipo para tratar debidamente los paquetes que vienen de la red interna:

net.inet.ip.forwarding=1

Servidor DHCP

Para poder usar nuestro equipo como servidor DHCP, editaremos el archivo /etc/rc.conf y modificaremos la siguiente línea para que quede de esta forma:

dhcpd_flags="-q"

En seguida ponemos las interfaces que escucharán las peticiones DHCP en el archivo /etc/dhcpd.interfaces en mi caso:

echo rl1 >/etc/dhcpd.interfaces

Luego editamos /etc/dhcpd.conf, el archivo prácticamente viene listo para una configuración básica como la que yo necesitaba, así que le hice cambios mínimos:

       option  domain-name "lili.net";
       option  domain-name-servers 192.168.11.1, 207.248.224.71, 207.248.224.72;

       subnet 192.168.1.0 netmask 255.255.255.0 {
               option routers 192.168.1.1;

               range 192.168.1.32 192.168.1.127;
       }

}

Los parámetros son bastante claros, entre los más importantes están los DNS, el número de nuestra red interna y el rango de IPs que deseamos servir.

Ahora a echar a andar el servicio, esto puede hacerse de dos formas, una de ellas es reiniciar la máquina para que se re-lean los scripts de inicio y otra manera es echarlo a andar manualmente:

touch /var/db/dhcpd.leases dhcpd -q rl1

En este momento ya tenemos nuestro servidor DHCP funcionando. Ahora a reiniciar nuestros clientes y a partir de ese momento, nuestro servidor OpenBSD les asignará IPs dinámicamente y dentro del rango que le hemos especificado. Firewall con NAT

Ahora, lo siguiente es configurar nuestro Firewall con PF (Packet Filter) y añadirle la capacidad de NAT (Network Address Translation) para que nuestro servidor haga las peticiones a internet a nombre de nuestros clientes.

Editamos la siguiente línea en el archivo /etc/rc.conf para que quede de la siguiente forma:

pf=YES

Esto activará PF. Reiniciamos para que surta efecto.

Ahora solamente nos queda editar nuestro archivo /etc/pf.conf y modificamos según nos convenga. Este es un código de muestra que encontré en la red y me sirvió para mis propósitos:

#                $OpenBSD: pf.conf,v 1.21 2003/09/02 20:38:44 david Exp $ 
#
# See pf.conf(5) and /usr/share/pf for syntax and examples.
# Required order: options, normalization, queueing, translation, filtering.
# Macros and tables may be defined and used anywhere.
# Note that translation rules are first match while filter rules are last match. 
# Macros: define common values, so they can be referenced and changed easily.
ext_if="rl0"    # replace with actual external interface name i.e., dc0
int_if="rl1"    # replace with actual internal interface name i.e., dc1
unsafe="rl0"
internal_net="192.168.1.0/24"
external_addr="10.10.173.219"
 
services = "{ ssh, http, domain }"
 
# Tables: similar to macros, but more flexible for many addresses.
#table  { 10.0.0.0/8, !10.1.0.0/16, 192.168.0.0/24, 192.168.1.18 }
 
# Options: tune the behavior of pf, default values are given.
#set timeout { interval 10, frag 30 }
#set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 }
#set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 90 }
#set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
#set timeout { icmp.first 20, icmp.error 10 }
#set timeout { other.first 60, other.single 30, other.multiple 60 }
#set timeout { adaptive.start 0, adaptive.end 0 }
#set limit { states 10000, frags 5000 }
#set loginterface none
#set optimization normal
#set block-policy drop
#set require-order yes
#set fingerprints "/etc/pf.os"
 
# Normalization: reassemble fragments and resolve or reduce traffic ambiguities.
scrub in all
 
# Queueing: rule-based bandwidth control.
altq on $ext_if priq bandwidth 2Mb queue { highpri_q, default_q }
queue highpri_q priority 7
queue default_q priority 1 priq(default)
#queue marketing  bandwidth 15%
 
# Translation: specify how addresses are to be mapped or redirected.
# nat: packets going out through $ext_if with source address $internal_net will
# get translated as coming from the address of $ext_if, a state is created for
# such packets, and incoming packets will be redirected to the internal address.
nat on $ext_if from $internal_net to any -> ($ext_if)
 
# rdr: packets coming in on $ext_if with destination $external_addr:1234 will
# be redirected to 10.1.1.1:5678. A state is created for such packets, and
# outgoing packets will be translated as coming from the external address.
#rdr on $ext_if proto tcp from any to $external_addr/32 port 1234 -> 10.1.1.1 port 5678
 
# rdr outgoing FTP requests to the ftp-proxy
#rdr on $int_if proto tcp from any to any port ftp -> 127.0.0.1 port 8021
 
# spamd-setup puts addresses to be redirected into table .
#table  persist
#no rdr on { lo0, lo1 } from any to any
#rdr inet proto tcp from  to any port smtp -> 127.0.0.1 port 8025
 
# Filtering: the implicit first two rules are
pass in all
pass out all
 
pass out quick on lo0 from any to any
pass in quick on lo0 from any to any 

pass out quick on $int_if from any to any
pass in quick on $int_if from any to any
  
# block all incoming packets but allow ssh, pass all outgoing tcp and udp
# connections and keep state, logging blocked packets.
#block in log all
#pass  in  on $ext_if proto tcp from any to $ext_if port 22 keep state
#pass  out on $ext_if proto { tcp, udp } all keep state
 
block in log quick on $unsafe inet proto icmp from any to any icmp-type redir
  
# pass incoming packets destined to the addresses given in table .
#pass in on $ext_if proto { tcp, udp } from any to  port 80 keep state
 
pass in quick on $unsafe inet proto icmp from any to any icmp-type { echorep, echoreq, timex, unreach }
block in log quick on $unsafe inet proto icmp from any to any
 
pass in quick on $ext_if inet proto tcp from any to any port $services flags S/SA keep state queue (default_q, highpri_q)
 
pass in quick on $unsafe inet proto udp from any to any port domain
pass in quick on $unsafe inet proto icmp from any to any icmp-type { echorep, echoreq, timex, unreach }
block in log quick on $unsafe inet proto icmp from any to any
 
pass in quick on $ext_if inet proto tcp from any to any port $services flags S/SA keep state queue (default_q, highpri_q)
 
pass in quick on $unsafe inet proto udp from any to any port domain
                                                                                
pass out quick on $ext_if inet proto tcp from any to any flags S/SA keep state queue (default_q, highpri_q)
pass out quick on $ext_if inet proto udp all keep state
pass out quick on $ext_if inet proto icmp from any to any keep state
 
block return-rst in log quick on $unsafe inet proto tcp from any to any
block return-icmp in log quick on $unsafe inet proto udp from any to any
block in quick on $unsafe all
# pass incoming ports for ftp-proxy
#pass in on $ext_if inet proto tcp from any to $ext_if user proxy keep state
 
# assign packets to a queue.
#pass out on $ext_if from 192.168.0.0/24 to any keep state queue developers
#pass out on $ext_if from 192.168.1.0/24 to any keep state queue marketing 

Noten la línea que hace el NAT:

nat on $ext_if from $internal_net to any -> ($ext_if)

Es una forma bastante simple y sencilla para indicar que se realice el NAT sobre la interfaz rl0 ($ext_if) de cualquier paquete que venga de la red interna 192.168.1.0/24 ($internal_net) y que reemplace la IP de orígen por la que tenga rl0.

Solo nos queda reiniciar y listo, nuestro servidor está preparado para alimentar nuestra red de una manera muy efectiva con internet usando una sola IP que nos proporcione nuestro ISP. Este método es muy recomendable para personas que solo cuentan con una dirección IP y quieren compartir el internet con más equipos.

Conclusiones

Este documento muestra la manera en la que logré configurar un equipo Pentium a 200Mhz y 40Mb en RAM, con Disco Duro de 1 Gb. aproximadamente y lo sencillo que es dar estos servicios usando un servidor OpenBSD 3.4 para servir de internet a un cibercafé de 7 equipos a bajo costo, con el mínimo de esfuerzo y usando solamente una dirección IP tomada vía DHCP de nuestro proveedor de internet, en este caso usando conexión por cable.

Personal tools