วิธีบล็อก IP ของประเทศบนไฟร์วอลล์ของฉันด้วย iptables และ nftables บน Linux

เมื่อเรามีเซิร์ฟเวอร์ที่สัมผัสกับอินเทอร์เน็ตคำแนะนำพื้นฐานคือการกำหนดค่าไฟล์ ไฟร์วอลล์ เพื่ออนุญาตเฉพาะการเข้าชมที่เราต้องการอนุญาตและปฏิเสธการเข้าชมที่เหลือ หลายครั้งเราตกเป็นเหยื่อของการโจมตีด้วยกำลังดุร้ายหรือการปฏิเสธการโจมตีบริการจากประเทศอื่นที่ไม่ใช่สเปน ในโอกาสส่วนใหญ่ขอแนะนำให้อนุญาตเฉพาะที่อยู่ IP ของประเทศที่คุณอยู่หรือธุรกิจของคุณและปฏิเสธการเข้าชมอื่น ๆ ที่เราไม่มีในรายการที่อนุญาตโดยค่าเริ่มต้น วันนี้ในบทความนี้เราจะสอนให้คุณดาวน์โหลดช่วง IP ทั้งหมดของประเทศใดประเทศหนึ่งเพื่อบล็อกเมื่อใดก็ตามที่เราต้องการหรืออนุญาตให้ใช้ IPv4 เสมอเนื่องจากการใช้งานเป็นส่วนใหญ่หากคุณจะใช้ IPv6 คุณจะต้องปรับบท

นโยบายในไฟร์วอลล์: อนุญาตหรือ จำกัด

ไฟร์วอลล์มีสองนโยบายส่วนใหญ่นโยบายที่อนุญาตจะอนุญาตการรับส่งข้อมูลทั้งหมดยกเว้นสิ่งที่เราปฏิเสธโดยเฉพาะ ในนโยบายที่เข้มงวดเราจะอนุญาตเฉพาะการเข้าชมที่เรากำหนดไว้โดยเฉพาะเท่านั้น เพื่อความปลอดภัยขอแนะนำให้มีนโยบายที่ จำกัด บนอินเทอร์เน็ต WAN เสมอเพื่อหลีกเลี่ยงไม่ให้กฎที่ตั้งไว้ไม่ดีอาจทำให้เกิดการรับส่งข้อมูลที่เราไม่ต้องการเข้าสู่เครือข่ายของเรานอกจากนี้การมีกฎ (ไม่กี่) กฎจะมีประสิทธิภาพมากกว่า เพื่อให้มีการจราจรที่แน่นอนและปฏิเสธส่วนที่เหลือเป็นกลุ่มมากกว่าทางอื่น ๆ

บล็อก IP ของประเทศบนไฟร์วอลล์ของฉันด้วย iptables และ nftables บน Linux

นโยบายที่ดีมากในไฟร์วอลล์คือการอนุญาตเพียงหนึ่งประเทศหรือมากกว่านั้นและปฏิเสธประเทศอื่น ๆ โดยปริยาย ดังนั้นสคริปต์ที่เราจะนำเสนอด้านล่างนี้สามารถแก้ไขได้อย่างง่ายดายเพื่อให้อนุญาตเฉพาะที่อยู่ IP ที่ดาวน์โหลดหรือเครือข่ายย่อยและบล็อกที่อยู่ IP ที่เหลือตามนโยบายในภายหลัง

ฉันจะหาที่อยู่ IP และช่วงของประเทศต่างๆได้จากที่ใด

In IPDeny คุณสามารถค้นหาบล็อกที่อยู่ IPv4 ทั้งหมดที่เป็นของแต่ละประเทศด้วยวิธีนี้เราสามารถรับช่วงที่อยู่ IP ทั้งหมดในรูปแบบ CIDR จากทุกประเทศในโลกเราจะมีความเป็นไปได้ที่จะเห็นช่วง IP ของสเปน จีนรัสเซียและอื่น ๆ อีกมากมาย ยิ่งประเทศมีขนาดใหญ่เท่าใดเราก็จะมีที่อยู่ IPv4 มากขึ้นดังนั้นเราจะต้องอนุญาตหรือปฏิเสธการเข้าถึงเครือข่ายเหล่านั้นเพื่อห้ามหรืออนุญาตในภายหลัง ใน ลิงค์อื่น ๆ นี้ เรามีบล็อกที่อยู่ IPv6 ของแต่ละประเทศ

รายละเอียดที่สำคัญมากคือ IPDeny อัปเดตฐานข้อมูลที่อยู่ IP ทั้งหมดบ่อยมากทั้ง IPv4 และ IPv6 เพื่อป้องกันไม่ให้เราบล็อกที่อยู่ IP หรือช่วงจากประเทศหนึ่งที่อยู่ในอีกประเทศหนึ่งจริงๆ หน้าเว็บนี้ได้รับการอัปเดตเกือบทุกวันเนื่องจากมีการเปลี่ยนแปลงการบล็อกที่อยู่ IPv4 และ IPv6 หรือมากกว่านั้น

การกำหนดค่า iptables ด้วย ipset เพื่อบล็อกประเทศ

iptables คือไฟล์ ลินุกซ์ ความเป็นเลิศของไฟร์วอลล์แม้ว่าจะมีการแจกแจงบางอย่างที่ก้าวกระโดดไปสู่ ​​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 ได้รับการติดตั้งแล้วในลีนุกซ์ส่วนใหญ่แม้ว่าเราจะใช้ไวยากรณ์ของ 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 มาโดยตลอด