Linux Networking: “Small Office Home Office”

La idea es construir un equipo que pueda manejar lo siguiente:

  • Gateway
  • Firewall

OpenSSH

Lo primero es instalar el cliente y el servidor sshd en nuestro equipo que va a servir como Gateway y Firewall:

sudo apt-get install openssh-client

sudo apt-get install openssh-server

Configuración

Es importante respaldar el archivo de configuración:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original

sudo chmod a-w /etc/ssh/sshd_config.original

Se puede cambiar el comportamiento del Servidor OpenSSH, para ello hay que editar su archivo de configuración

vi /etc/ssh/sshd_config

Pro ejemplo, se puede cambiar y permitir que:

  • El puerto donde puede escuchar sea: Port 2222
  • Permita credenciales de sesión basados en llave pública: PubkeyAuthentication yes
  • Presente el contenido del archivo /etc/issue.net al inicio de sesión: Banner /etc/issue.net

Reiniciar el servicio sshd

Luego de hacer cambios al archivo de configuración de OpenSSH es necesario reiniciar el servidor sshd para que los cambios tengan efecto:

sudo /etc/init.d/ssh restart

Acceso remoto al gateway

Ahora que el servidor está en camino de convertirse en un gateway, es que se puede usar una estación de trabajo desde la Red LAN, usando SSH desde la terminal de Linux, esto para acceder al servidor con el siguiente comando:

  • (ssh) la aplicación.
  • (chaos) un usuario que puede hacer sudo.
  • (@192.168.0.1) el servidor.
ssh chaos@192.168.0.1

NAT Gateway (Network Address Translation)

  • Se puede configurar NAT en un equipo Linux, con iptables.
  • NAT “Network Address Translation” es una técnica para compartir la conexión a Internet con las redes privadas.
  • El sistema funcionará como puerta de enlace y facilitará el acceso a Internet a muchos equipos de la red del área local, mediante una dirección IP única y pública.

Para configurar un NAT en Linux, el equipo con el Gateway debe tener 2 tarjetas de interfaz de red (NICs), se van a necesitar dos conexiones de red y direcciones IP. Una IP para la red privada y otra IP para la red externa y pública.

El equipo donde se configura NAT, actuará como puerta de enlace para la red privada. Esto se puede hacer con el siguiente equipo y requisitos:

  • Linux Dabian/Ubuntu como Sistema Operativo.
  • Tener al menos 2 tarjetas de red (controladores de interfaz de red). Una para conectarse a Internet y la otra para conectarse a la red privada.
  • Con un Kernel que maneje iptables.

Terminología y conceptos:

  • De manera general, las 2 interfaces en cuestión puden ser eth0 y eth1.
  • eth0 -> Interfaz conectada a Internet.
  • eth1 -> Interfaz que se conecta a la red privada.

 Traducción de direcciones de red es el nombre de un equipo que contiene un grupo de IPs válidas, que puede utilizar en las Interfaces de Internet.

Re-escribiendo tráfico

Cada vez que la Red interna quiere ir a la Internet, se asocia una dirección IP válida de la interfaz de Internet con la dirección IP privada del solicitante inicial. Después de eso, todo el tráfico es re-escrito desde la dirección IP pública del NAT hasta la dirección privada del NAT.

Una vez que la dirección IP pública del NAT se convierte inactiva durante una cierta cantidad de tiempo, la dirección IP pública es devuelta, de nuevo a la piscina NAT pública.

NAT tiene un problema una vez que todas las direcciones IP públicas están utilizadas. Por lo que cualquier solicitud privada de servicios de Internet está fuera, hasta que una dirección NAT pública quede libre.

Administrador en esteroides

La razón por la que hemos instalado el servidor sshd es para poder acceder de manera remota mediante SSH a nuestro Router (Gateway y Firewall). También para administrar el sistema, por ejemplo, para instalar paquetes y para aprender los caminos óptimos alrededor del sistema. El modo “sudo”, nos permite iniciar sesión como un usuario administrador, con los permisos necesarios para ejecutar ciertos comandos. Para iniciar sesión en modo sudo se puede hacer lo siguiente:

sudo -i

man interfaces

El archivo /etc/network/interfaces contiene la información de configuración de la interfaz de red para el comando ifup y el comando ifdown. En este archivo se configura cómo el equipos está conectado a la red.

vi /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# Primary Network Interface (facing the Internet)
auto eth0
iface eth0 inet dhcp

# Secondary Network Interface (facing Local Area Network - LAN)
auto eth1
iface eth1 inet static
address 192.168.0.1
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255

Habilitar enrutamiento IPv4

cp /etc/sysctl.conf /etc/sysctl.conf.original

chmod a-w /etc/sysctl.conf.original

vi /etc/sysctl.conf

Descomentar la línea:

net.ipv4.ip_forward=1

Seguidamente, desde la terminal correr:

sysctl -w net.ipv4.ip_forward=1

Sysadmin script del Firewall

iptables -t filter -L -v --line-numbers
Chain INPUT (policy ACCEPT 77 packets, 6481 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 34 packets, 1930 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 55 packets, 5676 bytes)
num   pkts bytes target     prot opt in     out     source               destination
iptables -t nat -L -v --line-numbers
Chain PREROUTING (policy ACCEPT 3 packets, 233 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 1 packets, 113 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 209 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 6 packets, 329 bytes)
num   pkts bytes target     prot opt in     out     source               destination
iptables -t mangle -L -v --line-numbers
Chain PREROUTING (policy ACCEPT 154 packets, 10695 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 120 packets, 8765 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 34 packets, 1930 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 107 packets, 14204 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 141 packets, 16134 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Hay muchas formas de implementar un Firewall, el libro “Linux Networking Cookbook” explica una manera simple de hacer uno a la medida, lo cual a veces es más flexible. En este caso, de una manera simple, vamos a usar el software de firewall llamado ufw:

apt-get install ufw

ufw status

Archivos de UFW

/usr/sbin/ufw
UI.

/etc/defaults/ufw
Configuración.

/etc/ufw/before[6].rules
Reglas evaluadas antes de que UI agregue reglas.

/etc/ufw/after[6].rules
Reglas evaluadas después de que UI agregó reglas.

/lib/ufw/user[6].rules
Reglas agregadas por UI (no modificar).

/etc/ufw/sysctl.conf
Parámetros ajustables del Kernel.

/lib/ufw/ufw-init
Script de inicio

Cadenas de UFW

UFW utiliza varias cadenas para ser fácil de usar y flexible. El flujo de control a través de las diversas cadenas sucede de la siguiente manera:

INPUT ->
  ufw-before-logging-input ->
  ufw-before-input ->
    ufw-user-input ->
      ufw-user-logging-input (rule specific) ->
  ufw-after-input ->
  ufw-after-logging-input ->
  ufw-reject-input -> return to INPUT

OUTPUT ->
  ufw-before-logging-output ->
  ufw-before-output ->
    ufw-user-output ->
      ufw-user-logging-output (rule specific) ->
  ufw-after-output ->
  ufw-after-logging-output ->
  ufw-reject-output -> return to OUTPUT

FORWARD ->
  ufw-before-logging-forward ->
  ufw-before-forward ->
    ufw-user-forward ->
      ufw-user-logging-forward (not used) ->
  ufw-after-forward ->
  ufw-after-logging-forward ->
  ufw-reject-forward -> return to FORWARD
iptables -L [chain] -n

Script ufw.sh

vi /root/sysadmin/ufw.sh
#!/bin/bash

/lib/ufw/ufw-init flush-all;

#

ufw disable;
ufw --force reset;

ufw default deny incoming;
ufw default allow outgoing;

ufw logging on;

#

ufw allow in on eth1 from 192.168.0.0/24 to any port 22 proto tcp;

#

ufw --force enable;

#

/sbin/iptables -P FORWARD ACCEPT

/sbin/iptables -A POSTROUTING -t nat -s 192.168.0.0/24 -o eth0 -j MASQUERADE

/sbin/iptables -A ufw-before-forward -o eth0 -d 192.168.0.0/24 -j REJECT
chmod 700 /root/sysadmin/ufw.sh

Reglas de iptables para NAT

vi /etc/rc.local

Antes de exit 0, hay que agregar la siguiente línea:

/root/sysadmin/ufw.sh

Seguidamente, desde la terminal correr:

cd /root/sysadmin/

./ufw.sh

ISC DHCP Server

DHCP (Dynamic Host Configuration Protocol) permite que los dispositivos o equipos de sus clientes puedan solicitar y obtener de un servidor una dirección IP, también muchos otros parámetros más.

DHCP de ISC es una de las aplicaciones para servir DHCP más utilizada en la Internet. El mismo software puede ser utilizado para LAN también. Funciona como una solución estable, de nivel empresarial.

Para instalar el Servidor DHCP:

apt-get install isc-dhcp-server

Configurar la interfaz de red:

cp /etc/default/isc-dhcp-server /etc/default/isc-dhcp-server.original

chmod a-w /etc/default/isc-dhcp-server.original

vi /etc/default/isc-dhcp-server
# DHCP server (dhcpd) serve DHCP requests on:
INTERFACES="eth1"

Para cada “subnet” que va a ser servida, y para cada “subnet” conectada al servidor DHCP, tiene que haber una declaración de “subnet”, que le dice al demonio de DHCP como reconocer que una dirección IP es de una “subnet” en específico. Hay que declarar una “subnet” incluso si no hay direcciones que vayan a ser dinámicas en esa “subnet”.

Por ejemplo, hay opciones globales para cada cliente DHCP en la “subnet” con su respectivo rango. Los clientes que soliciten una dirección, es probable que van a recibir una dirección IP libre dentro de ese rango.

cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.orignal

chmod a-w /etc/dhcp/dhcpd.orignal

vi /etc/dhcp/dhcpd.conf
ddns-update-style none;
default-lease-time 3600;
max-lease-time 7200;
authoritative;
log-facility local7;

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.11 192.168.0.100;
option routers 192.168.0.1;
option domain-name-servers 8.8.8.8;
}

Reiniciar el servicio de DHCP

service isc-dhcp-server restart

Reiniciar el servicio de Red

service networking restart

Verificar las Interfaces

ifconfig -a
eth0      Link encap:Ethernet  HWaddr 01:23:45:67:87:ab  
          inet addr:192.168.ddd.dd  Bcast:192.168.ddd.ddd  
          Mask:255.255.255.0

eth1      Link encap:Ethernet  HWaddr 01:23:45:67:88:ab 
          inet addr:192.168.0.1  Bcast:192.168.0.255  
          Mask:255.255.255.0

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 01:23:45:67:87:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.ddd.dd/24 brd 192.168.ddd.ddd scope global eth0

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 01:23:45:67:88:ab brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global eth1

Depurando progresivamente el Firewall

Estas son algunas pruebas rápidas que se pueden correr para ver la reglas iptables activas del firewall:

iptables -t filter -L -v --line-numbers
iptables -t nat -L -v --line-numbers
iptables -t mangle -L -v --line-numbers

Nmap se puede usar para conocer como se ve el Firewall desde afuera:

apt-get install nmap traceroute
nmap 192.168.0.1

nmap -P0 192.168.0.1

Para ver las conexiones TCP y UDP que están abiertas y escuchando por nuevas conexiones:

netstat -untap

Introducción a IPTables

Linux Journal: Linux viene con un potente firewall incorporado, aunque su interfaz puede ser un poco intimidante. Este es el primer paso para dominar las funciones básicas y no tan básicas de IPTables para ir creando un Servidor seguro.

Netfilter es un framework disponible en el núcleo Linux que permite interceptar y manipular paquetes de red. Dicho framework permite realizar el manejo de paquetes en diferentes estados del procesamiento. Netfilter es también el nombre que recibe el proyecto que se encarga de ofrecer herramientas libres para cortafuegos basados en Linux.