Как заблокировать IP-адреса страны на моем брандмауэре с помощью iptables и nftables в Linux

Когда у нас есть сервер, подключенный к Интернету, основная рекомендация - настроить ваш брандмауэр чтобы разрешить только тот трафик, который мы хотим разрешить, и запретить остальной трафик. Во многих случаях мы становимся жертвами атак грубой силы или отказов в обслуживании из других стран, кроме Испании. В подавляющем большинстве случаев рекомендуется разрешать IP-адреса только той страны, в которой вы находитесь или где находится ваша компания, и запрещать по умолчанию любой другой трафик, которого нет в разрешенном списке. Сегодня в этой статье мы научим вас загружать все диапазоны IP-адресов определенной страны, чтобы блокировать их, когда мы захотим, или разрешить одному из них, всегда используя IPv4, поскольку его использование является большинством, если вы собираетесь использовать IPv6. вам придется адаптировать сценарий.

Политики в брандмауэре: разрешающие или ограничительные

Брандмауэры имеют в основном две политики: разрешающая политика разрешает весь трафик, кроме того, что мы специально запретили. В рамках ограничительной политики мы разрешаем только трафик, который мы специально определили. В целях безопасности всегда рекомендуется иметь ограничительную политику в Интернете WAN, чтобы избежать того, что неправильно настроенное правило может вызвать трафик, который мы не хотим вводить в нашу сеть, кроме того, более эффективно иметь (несколько) правил чтобы разрешить определенный трафик и запретить остальной трафик в больших количествах, чем наоборот.

Блокировать IP-адреса страны на моем брандмауэре с помощью iptables и nftables в Linux

Очень хорошая политика в брандмауэре - разрешить только одну или несколько стран и запретить остальные страны по умолчанию. Следовательно, сценарий, который мы представим ниже, можно легко изменить, чтобы разрешить только загруженные IP-адреса или подсети, а затем заблокировать остальные IP-адреса политикой.

Где я могу получить IP-адреса и диапазоны разных стран?

In IPЗапретить вы можете найти все блоки адресов IPv4, которые принадлежат каждой стране, таким образом, мы можем получить все диапазоны IP-адресов в формате CIDR из всех стран мира, у нас будет возможность увидеть диапазоны IP-адресов Испании, Китай, Россия и многие другие. Чем больше страна, тем больше диапазонов адресов IPv4 у нас будет, поэтому нам придется разрешать или запрещать доступ к этим сетям, чтобы позже запретить или разрешить их. В эта другая ссылка у нас есть блоки адресов IPv6 для каждой страны.

Очень важной деталью является то, что IPDeny очень часто обновляет всю базу данных IP-адресов, как IPv4, так и IPv6, чтобы мы не блокировали IP-адреса или диапазоны из одной страны, которая фактически находится в другой. Эта веб-страница обновляется почти ежедневно по мере изменения или добавления блоков адресов IPv4 и IPv6.

Настройка iptables с ipset для блокировки стран

iptables - это Linux брандмауэр по преимуществу, хотя есть некоторые дистрибутивы, которые делают скачок к nftables, который является развитием iptables, намного быстрее, эффективнее и проще в настройке, однако в настоящее время мы все еще используем синтаксис iptables, хотя ниже мы используем nftables , как в последних версиях операционной системы Debian и многих других. Если вы используете iptables, настоятельно рекомендуется использовать расширение ipset, которое позволит нам блокировать или разрешать миллионы IP-адресов, но с более высокой производительностью, чем если бы мы делали это напрямую с IPtables. В случае разрешения или блокировки всей страны настоятельно рекомендуется сделать это через ipset, потому что он явно более эффективен, чем iptables.

Чтобы использовать ipset с iptables, вам необходимо установить его, потому что он не установлен по умолчанию, вы можете установить его следующим образом:

sudo apt install ipset

После установки мы можем начать его использовать.

Следующий сценарий, который мы запрограммировали, состоит из блокировки страны или нескольких, добавления всех ее подсетей, загруженных с IPdeny, и включения всех подсетей в ipset для последующего вызова этого ipset и блокировки его в iptables. Таким образом, iptables будет намного эффективнее, чем если бы вы делали это без расширения ipset.

#!/bin/bash
# El objetivo de este script es BLOQUEAR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos BLOQUEAR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a iptables (cortafuegos), ipset (extension de IPTABLESables), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que iptables no pueda interpretar ###
IPTABLES=/sbin/iptables
IPSET=/sbin/ipset
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/iptables-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPSET flush paisbloqueado
$IPSET destroy paisbloqueado
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que IPTABLES interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el IPset nuevo para bloquear el pais
$IPSET create paisbloqueado hash:net
for ipbloqueo in $FILTROIPS
do
$IPSET add paisbloqueado $ipbloqueo
done
done
#Denegamos el tráfico del ipset creado.
$IPTABLES -I INPUT -m set --match-set paisbloqueado src -j DROP
#Permitimos todo el resto del trafico. CUIDADO CON ESTO
$IPTABLES -A INPUT -j ACCEPT
exit 0

Теперь мы можем увидеть статус iptables, указав следующее, и мы увидим, что он использует настроенный ipset:

iptables -L

Чтобы увидеть статус ipset, мы ставим следующее:

ipset list

Каждый раз, когда мы хотим заблокировать новую страну, вам придется снова запустить скрипт, и автоматически все содержимое ipset будет удалено, а все новые подсети будут добавлены с нуля. Это наиболее рекомендуется, поскольку различные базы данных IP-адресов и диапазонов в разных странах постоянно обновляются. Мы должны отметить, что в таких странах, как Китай, существует большое количество блоков IP-адресов, поэтому для применения всех правил к брандмауэру потребуется несколько минут, если мы попытаемся использовать только «рекламу», это произойдет почти мгновенно, потому что у нас их очень мало.

Благодаря этому скрипту, если наш интернет-сервис работает только в Испании, мы можем запретить все другие страны, но мы должны помнить, что если пользователь из Испании использует прокси или VPN из другой страны, доступ запрещен.

Конфигурация iptables с ipset, чтобы разрешить Испанию и заблокировать остальные

В этом скрипте мы сделаем прямо противоположное предыдущему: мы загрузим базу данных IP-адресов Испании, добавим ее в новый созданный ipset и разрешим доступ. По умолчанию он запрещает весь другой трафик из других стран. Если ваш бизнес находится в Испании, и вы хотите, чтобы они подключились только в Испании, это лучший и самый эффективный способ, который вы можете сделать, потому что вы будете разрешать только одну страну и не будете специально блокировать остальной мир.

#!/bin/bash
# El objetivo de este script es PERMITIR todo el tráfico del pais que nosotros definamos.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos PERMITIR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a iptables (cortafuegos), ipset (extension de IPTABLESables), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que iptables no pueda interpretar ###
IPTABLES=/sbin/iptables
IPSET=/sbin/ipset
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/iptables-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPSET flush paispermitido
$IPSET destroy paispermitido
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que IPTABLES interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el IPset nuevo para bloquear el pais
$IPSET create paispermitido hash:net
for ippermitir in $FILTROIPS
do
$IPSET add paispermitido $ippermitir
done
done
#Permitimos el tráfico del ipset creado.
$IPTABLES -I INPUT -m set --match-set paispermitido src -j ACCEPT
#DENEGAMOS todo el resto del trafico.
$IPTABLES -A INPUT -j DROP
exit 0

Теперь мы можем увидеть статус iptables, указав следующее, и мы увидим, что он использует настроенный ipset:

iptables -L

Чтобы увидеть статус ipset, мы ставим следующее:

ipset list

Как вы видели, действительно легко заблокировать или разрешить стране использовать ipset из iptables, кроме того, это намного эффективнее, чем делать это напрямую с iptables, поэтому мы рекомендуем всегда использовать ipset для такого рода действий. .

Конфигурация Nftables для блокировки стран

nftables - это новый брандмауэр Linux, лучше, быстрее и интуитивно понятнее, чем популярные iptables, которые мы всегда использовали. nftables уже установлен в большинстве дистрибутивов Linux, даже если мы используем синтаксис iptables. Если вы используете последние версии Debian, вы уже будете использовать nftables, не зная об этом, но мы не сможем использовать синтаксис самого nftables.

Чтобы иметь возможность использовать nftables на 100%, нам нужно будет установить его прямо из репозиториев, выполнив следующую команду:

sudo apt install nftables

После установки мы можем приступить к настройке nftables с помощью команды «nft». Синтаксис радикально отличается от iptables, поэтому, если вы не использовали его, потребуется некоторое время, чтобы приспособиться к новому синтаксису.

Следующий сценарий, который мы запрограммировали, состоит из блокировки страны или нескольких, добавления всех ее подсетей, загруженных с IPdeny, и включения всех подсетей в nftables, чтобы заблокировать их в брандмауэре. Мы должны помнить, что nftables намного эффективнее, чем iptables, и будет работать очень хорошо.

#!/bin/bash
# El objetivo de este script es BLOQUEAR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos BLOQUEAR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a nftables (cortafuegos), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que NFT no pueda interpretar ###
NFT=/sbin/nft
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/NFT-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$NFT flush set filter ips_baneadas
$NFT flush chain ip filter INPUT
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que NFT interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el set de ips_baneadas de tipo IPv4.
$NFT add set ip filter ips_baneadas {type ipv4_addr; flags interval;}
#Metemos en el set todos los rangos de IP.
for ipbloqueo in $FILTROIPS
do
$NFT add element ip filter ips_baneadas { $ipbloqueo }
done
done
#Bloqueamos todo lo que coincida con el SET anteriormente creado.
$NFT add rule ip filter INPUT ip saddr @ips_baneadas counter drop
$NFT list ruleset > /etc/nftables.conf
systemctl restart nftables.service
exit 0

Теперь мы можем увидеть состояние nftables, поместив следующее, и мы увидим, что он использует настроенный ipset:

nft list ruleset

Настройка nftables для разрешения стран

Следующий сценарий, который мы запрограммировали, состоит в разрешении страны, добавлении всех ее подсетей, загруженных с IPdeny, и включении всех подсетей в nftables, чтобы разрешить это в брандмауэре, остальной трафик будет запрещен. Мы должны помнить, что nftables намного эффективнее, чем iptables, и будет работать очень хорошо.

#!/bin/bash
# El objetivo de este script es PERMITIR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos PERMITIR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a nftables (cortafuegos), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que NFT no pueda interpretar ###
NFT=/sbin/nft
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/NFT-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$NFT flush set filter ips_permitidas
$NFT flush chain ip filter INPUT
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que NFT interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el set de ips_permitidas de tipo IPv4.
$NFT add set ip filter ips_permitidas {type ipv4_addr; flags interval;}
#Metemos en el set todos los rangos de IP.
for ippermitida in $FILTROIPS
do
$NFT add element ip filter ips_permitidas { $ippermitida }
done
done
#Permitimos todo lo que coincida con el SET anteriormente creado.
$NFT add rule ip filter INPUT ip saddr @ips_permitidas counter accept
#Bloqueamos todo lo demas en cadena base
$NFT add chain ip filter INPUT '{ policy drop; }'
#Guardamos y reiniciamos servicio
$NFT list ruleset > /etc/nftables.conf
systemctl restart nftables.service
exit 0

Теперь мы можем увидеть состояние nftables, поместив следующее, и мы увидим, что он использует настроенный ipset:

nft list ruleset

До сих пор мы пришли с этим руководством по iptables и ipset для блокировки или разрешения IP-адресов из разных стран, мы также увидели, как это сделать с помощью nftables, нового брандмауэра Linux с новым синтаксисом, который намного более интуитивно понятен, но это будет стоить нам нужно немного поработать, чтобы привыкнуть к этому, если мы всегда работали с iptables.