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