En el artÃculo anterior vimos los conceptos básicos sobre PF , en esta ocasión veremos de forma rápida como NATear una red interna.
Como podemos ver el equipo tiene dos interfaces de red, em0(WAN) y em1(LAN):
ifconfig
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
ether 08:00:27:9d:dd:69
inet 192.168.69.55 netmask 0xffffff00 broadcast 192.168.69.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
em1: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=481009b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,VLAN_HWFILTER,NOMAP>
ether 08:00:27:2f:97:97
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33160
groups: pflog
Habilitamos el forwarding de paquetes entre redes:
sysctl net.inet.ip.forwarding=1
sysctl net.inet6.ip6.forwarding=1
sysctl net.inet6.ip6.forwarding=1
Para que la configuración persista debemos asignar las siguientes variables RC:
sysrc gateway_enable=YES
sysrc ipv6_gateway_enable=YES
sysrc ipv6_gateway_enable=YES
El script es bastante autoexplicativo:
- Al router solo se permiten conexiones ssh entrantes.
- Al router se le permiten todas las conexiones salientes.
- A la red NATeada se le permite todo el tráfico siempre y cuando no intente conectar con el router a un puerto distinto del 22.
vi /etc/pf.conf
ext_if = "em0"
int_if = "em1"
localnet = $int_if:network
set block-policy return
scrub in on $ext_if all fragment reassemble
set skip on lo
nat on $ext_if from $localnet to any -> ($ext_if)
antispoof for $ext_if inet
block log all
pass from $localnet
block from $localnet to ($ext_if)
block from $localnet to ($int_if)
pass out
pass in proto tcp to any port 22
Habilitamos PF en el arranque:
sysrc pf_enable=YES
sysrc pf_rules="/etc/pf.conf"
sysrc pf_rules="/etc/pf.conf"
Habilitamos PF-LOG en el arranque y configuramos el fichero de logs:
sysrc pflog_enable=YES
sysrc pflog_logfile="/var/log/pflog"
sysrc pflog_logfile="/var/log/pflog"
Recargamos la configuración:
pfctl -f /etc/pf.conf