Linuxでiptablesとnftablesを使用してファイアウォールで国のIPをブロックする方法

サーバーがインターネットに公開されている場合、基本的な推奨事項は、 ファイアウォール 許可したいトラフィックのみを許可し、残りのトラフィックを拒否します。 多くの場合、私たちはスペイン以外の国からのブルートフォース攻撃やサービス拒否攻撃の犠牲者です。 ほとんどの場合、あなたがいる国またはあなたのビジネスがある国のIPアドレスのみを許可し、許可リストにない他のトラフィックはデフォルトで拒否することをお勧めします。 今日この記事では、特定の国のすべてのIP範囲をダウンロードして、必要なときにブロックするか、IPv4を使用する場合は、IPv6を使用することが多いため、常にIPvXNUMXを使用できるようにする方法を説明します。スクリプトを適応させる必要があります。

ファイアウォールのポリシー:許容的または制限的

ファイアウォールには主にXNUMXつのポリシーがあり、許容ポリシーは、特に拒否したものを除くすべてのトラフィックを許可します。 制限付きポリシーでは、具体的に定義したトラフィックのみを許可します。 セキュリティのために、インターネットWANに制限的なポリシーを設定することを常にお勧めします。これは、ルールが正しく設定されていないと、ネットワークに入れたくないトラフィックが発生する可能性があることを回避するためです。さらに、(少数の)ルールを設定する方が効率的です。特定のトラフィックを許可し、他の方法よりも残りを一括で拒否します。

LinuxのiptablesとnftablesでファイアウォールのカントリーIPをブロックする

ファイアウォールの非常に優れたポリシーは、XNUMXつ以上の国のみを許可し、デフォルトで残りの国を拒否することです。 したがって、以下に示すスクリプトは、ダウンロードされたIPアドレスまたはサブネットのみを許可し、後でポリシーによって残りのIPアドレスをブロックするように簡単に変更できます。

さまざまな国のIPアドレスと範囲はどこで入手できますか?

In IP拒否 各国に属するすべてのIPv4アドレスブロックを見つけることができます。このようにして、世界中のすべての国からCIDR形式ですべてのIPアドレス範囲を取得できます。スペインのIP範囲を確認できる可能性があります。中国、ロシア、その他多数。 国が大きいほど、IPv4アドレスの範囲が広がるため、後でそれらのネットワークを禁止または許可するには、これらのネットワークへのアクセスを許可または拒否する必要があります。 に この他のリンク 各国のIPv6アドレスブロックを利用できます。

非常に重要な詳細は、IPDenyがIPv4とIPv6の両方のIPアドレスデータベース全体を非常に頻繁に更新して、実際には別の国にあるある国のIPアドレスまたは範囲をブロックしないようにすることです。 このWebページは、IPv4およびIPv6アドレスブロックが変更されるか、それ以上が追加されると、ほぼ毎日更新されます。

国をブロックするためのipsetを使用したiptablesの構成

iptablesは Linux ファイアウォール並みの卓越性、iptablesの進化であるnftablesに飛躍しているいくつかのディストリビューションがありますが、はるかに高速で効率的で構成が簡単ですが、以下ではnftablesを使用していますが、現在はiptables構文を使用しています、Debianオペレーティングシステムの最新バージョンや他の多くのように。 iptablesを使用する場合は、ipset拡張機能を使用することを強くお勧めします。これにより、数百万のIPアドレスをブロックまたは許可できますが、IPtablesを直接使用する場合よりもパフォーマンスが向上します。 国全体を許可またはブロックする場合は、iptablesよりも明らかに効率的であるため、ipsetを使用して行うことを強くお勧めします。

ipsetをiptablesで使用するには、デフォルトではインストールされていないため、インストールする必要があります。次の方法でインストールできます。

sudo apt install ipset

インストールすると、使用を開始できます。

私たちがプログラムした次のスクリプトは、XNUMXつまたは複数の国をブロックし、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 他の国からのアクセスは許可されません。

スペインを許可し、残りをブロックするためのipsetを使用したiptablesの構成

このスクリプトでは、前のスクリプトとは正反対のことを行います。スペインのIPアドレスのデータベースをダウンロードし、作成した新しいIPセットに追加して、アクセスを許可します。 デフォルトでは、他の国からの他のすべてのトラフィックを拒否します。 あなたのビジネスがスペインにあり、スペインでのみ接続したい場合、これはあなたができる最善かつ最も効率的なことです。なぜなら、あなたはXNUMXつの国だけを許可し、他の国を特にブロックしないからです。

#!/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

これまで見てきたように、iptablesからipsetを使用する国をブロックまたは許可するのは非常に簡単です。さらに、iptablesを直接使用するよりもはるかに効率的であるため、この種のアクションには常にipsetを使用することをお勧めします。 。

国をブロックするためのNftables構成

nftablesは新しいLinuxファイアウォールであり、これまで使用してきた一般的なiptablesよりも優れており、高速で、直感的です。 nftablesは、iptables構文を使用している場合でも、ほとんどのLinuxディストリビューションにすでにインストールされています。 最新バージョンのDebianを使用している場合は、知らないうちにすでにnftablesを使用していますが、nftables自体の構文を使用することはできません。

nftablesを100%使用できるようにするには、次のコマンドを実行して、リポジトリから直接インストールする必要があります。

sudo apt install nftables

インストールしたら、「nft」コマンドを使用してnftablesの構成を開始できます。 構文はiptablesとは根本的に異なるため、使用していない場合は、新しい構文に順応するのにしばらく時間がかかります。

私たちがプログラムした次のスクリプトは、XNUMXつまたは複数の国をブロックし、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

これまで、さまざまな国のIPをブロックまたは許可するiptablesとipsetに関するこのチュートリアルを提供してきました。また、はるかに直感的な新しい構文を備えた新しいLinuxファイアウォールであるnftablesを使用してそれを行う方法も確認しましたが、コストがかかります。常にiptablesを使用している場合は、いくつかの作業に慣れています。