Introducción
iptables
es una poderosa herramienta utilizada para configurar el firewall integrado del kernel de Linux. Viene preinstalado en la mayoría de las distribuciones de Ubuntu, sin embargo, si está utilizando una versión personalizada de Ubuntu o se está ejecutando dentro de un contenedor, lo más probable es que tenga que instalarlo manualmente.
sudo apt-get install iptables iptables-persistent
Después de la instalación, si se le pregunta si desea guardar sus reglas actuales, no importa en este momento porque va a eliminar o crear nuevas reglas más adelante.
Consejos
Puede usar el netcat
comando (en una computadora diferente a la de su servidor) para probar cuáles de sus puertos están abiertos o cerrados.
nc -z -w5 -v SERVER_IP PORT
nc
es el comando netcat.
-z
solo envíe un paquete sin carga útil.
-w5
Espere hasta 5 segundos para una respuesta.
-v
modo detallado.
- Reemplace
SERVER_IP
con la dirección de su servidor.
- Reemplace
PORT
con el puerto que desea probar si está abierto (por ejemplo 22
).
En su servidor, puede usar el netstat
comando para ver qué puertos están escuchando conexiones actualmente.
sudo netstat -tulpn
Nota: Aunque netstat
es útil para encontrar los puertos con los que desea trabajar, debe conocer las aplicaciones que tiene instaladas actualmente en su servidor y qué puertos están escuchando, no tiene que permitir todos los puertos que encuentre en la netstat
salida .
Sintaxis
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
-A INPUT
agregue una regla a la INPUT
cadena, una cadena es un grupo de reglas, las que más usaremos en esta guía serán INPUT
, OUTPUT
y PREROUTING
.
-p tcp
establecido tcp
como el protocolo al que se aplicará esta regla, también puede usar otros protocolos como udp
, icmp
o all
.
-m tcp
usa el tcp
módulo. iptables
admite funciones adicionales a través de módulos, algunos de los cuales ya vienen preinstalados iptables
y otros, como el geoip
módulo.
--dport 22
los comandos que comienzan con --
indican opciones adicionales para el módulo utilizado anteriormente, en este caso le diremos al tcp
módulo que solo se aplique al puerto 22
.
-m geoip
usa el geoip
módulo. Limitará los paquetes por país (más información en el paso 5).
--src-cc PE
dígale al geoip
módulo que limite los paquetes entrantes a los que vienen de Perú. Para obtener más códigos de país, busque ISO 3166 country codes
en Internet.
-j ACCEPT
El -j
argumento indica iptables
qué hacer si un paquete coincide con las restricciones especificadas en los argumentos anteriores. En este caso, será ACCEPT
esos paquetes, hay otras opciones REJECT
, DROP
y más. Puede encontrar más opciones buscando iptables jump targets
en Internet.
1. Conceptos básicos
Enumera todas las reglas.
sudo iptables -L
Enumere todos los comandos que se usaron para crear las reglas usadas actualmente, útiles para editar o eliminar reglas.
sudo iptables -S
Para eliminar una regla específica, elija una regla sudo iptables -S
y reemplácela -A
por -D
.
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Lista todas las reglas numeradas en la INPUT
cadena.
sudo iptables -L INPUT --line-numbers
Eliminar una regla numerada.
sudo iptables -D INPUT 2
Para borrar todas las reglas.
sudo iptables -F
Advertencia: puede perder la conexión si está conectado por SSH .
Borrar solo las reglas en la OUTPUT
cadena.
sudo iptables -F OUTPUT
2. Crear reglas iniciales
Permitir SSH
en la eth0
interfaz
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-i eth0
aplique la regla a una interfaz específica, para permitir desde cualquier interfaz eliminar este comando.
Para limitar los paquetes entrantes a una IP específica (es decir 10.0.3.1/32
).
sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-s 10.0.3.1/32
especifica una IP / subred para permitir conexiones desde.
Establecer reglas de cadena predeterminadas.
Advertencia: antes de continuar, asegúrese de haber aplicado las reglas SSH correctas si trabaja en un servidor remoto .
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
-P INPUT DROP
niega todos los paquetes entrantes (es decir, nadie podrá conectarse a sus servidores en ejecución como Apache, SQL, etc.).
-P FORWARD DROP
niega todos los paquetes reenviados (es decir, cuando está utilizando su sistema como enrutador).
-P OUTPUT ACCEPT
permite todos los paquetes salientes (es decir, cuando realiza una HTTP
solicitud).
Permitir todo el tráfico en la interfaz de bucle invertido ( recomendado ).
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
3. Hacer reglas persistentes
Guarda las iptables
reglas actuales .
sudo netfilter-persistent save
sudo netfilter-persistent reload
Si está ejecutando dentro de un contenedor, el netfilter-persistent
comando probablemente no funcionará, por lo que debe volver a configurar el iptables-persistent
paquete.
sudo dpkg-reconfigure iptables-persistent
4. Permitir conexiones salientes
Permitir consultas DNS.
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Use el state
módulo para permitir RELATED
y ESTABLISHED
paquetes salientes.
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Permitir los puertos deseados; en este caso, HTTP
puertos.
sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
Más puertos que tal vez quieras usar.
FTP
: tcp en el puerto 21
HTTPS
: tcp en el puerto 443
DHCP
: udp en el puerto 67
NTP
: udp en el puerto 123
Nota: Si desea permitir apt-get
, puede ser necesario permitir FTP
yHTTPS
.
Permitir el tráfico devuelto solo para RELATED
y ya ESTABLISHED
conexiones ( recomendado porque a veces se requiere comunicación bidireccional).
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Otras reglas útiles
Permitir solicitudes de ping desde el exterior.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Reenvíe el tráfico en el eth0
puerto 2200
a 10.0.3.21:22
(útil si desea exponer un servidor SSH que se ejecuta dentro de un contenedor).
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22
Si inicia sesión con éxito en su servidor mediante SSH, se creará una conexión persistente (es decir, no habrá nuevas conexiones, incluso si está conectado durante más de 1 hora). Si falla e intenta iniciar sesión nuevamente, se creará una nueva conexión. Esto bloqueará los intentos continuos de inicio de sesión SSH al limitar las nuevas conexiones por hora.
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP
Redireccionar todas las solicitudes de puerto 443
a puerto 4430
(útil si desea vincular a puerto 443
sin root
).
sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
ens3
La interfaz de red.
-m geoip
módulo de bloque de país (ver paso 5).
Advertencia: no utilice lo
, el sistema operativo descartará todos los paquetes redirigidos a la interfaz de bucle invertido .
5. Permitir o bloquear países enteros
5.1 Instalar xtables-addons
Puede instalar el xtables-addons
módulo utilizando varios métodos, no dude en utilizar el método de instalación que mejor funcione para usted.
-
Instalar usando apt-get
.
sudo apt-get install xtables-addons-common
-
Instalar usando module-assistant
.
sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant --verbose --text-mode auto-install xtables-addons
-
Instalar desde la fuente.
sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
cd xtables-addons
./autogen.sh
./configure
make
sudo make install
Construir una base de datos de "países".
sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv
Reinicie su sistema.
sudo reboot
Una vez que xtables-addons
se haya instalado correctamente, después del primer reinicio, ejecute, de lo depmod
contrario, el bloqueo del país no funcionará correctamente (esto solo es necesario por primera vez).
sudo depmod
Cree un script en /etc/cron.monthly/geoip-updater
para actualizar la geoip
base de datos mensualmente.
#!/usr/bin/env bash
# this script is intended to run with sudo privileges
echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip
echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl
echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater
Hacer /etc/cron.monthly/geoip-updater
ejecutable
sudo chmod +x /etc/cron.monthly/geoip-updater
5.2 Reglas de ejemplo
_Nota: Si recibe un iptables: No chain/target/match by that name
error al intentar aplicar una geoip
regla, es posible que xtables-addons
no se haya instalado correctamente. Pruebe con otro método de instalación.
Bloquee todos los paquetes entrantes de China, Hong Kong, Rusia y Corea.
sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP
Permita los paquetes entrantes en el puerto 80
desde cualquier lugar, excepto los países anteriores.
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Permita los paquetes entrantes en la ens3
interfaz en el puerto 22
solo desde Perú (no dude en elegir el código de país del que desea aceptar paquetes, por ejemplo, US
para Estados Unidos).
sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT
Permitir paquetes entrantes en puerto 443
solo desde Perú.
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT