xtables-addons: memfilter paket berdasarkan negara



Tugas memblokir lalu lintas dari negara tertentu tampaknya sederhana, tetapi kesan pertama menipu. Hari ini kami akan memberi tahu Anda bagaimana ini dapat diterapkan.



Latar Belakang



Hasil penelusuran di Google tentang topik ini mengecewakan: sebagian besar solusi telah lama "membusuk" dan terkadang tampaknya topik ini telah disimpan dan dilupakan selamanya. Kami telah melalui banyak catatan lama dan siap untuk membagikan instruksi versi modern.

Kami menyarankan Anda membaca seluruh artikel sebelum menjalankan perintah yang ditunjukkan.

Mempersiapkan sistem operasi



Pemfilteran akan dikonfigurasi menggunakan utilitas iptables , yang membutuhkan ekstensi untuk bekerja dengan data GeoIP. Ekstensi semacam itu dapat ditemukan di xtables-addons . xtables-addons menginstal ekstensi iptables sebagai modul kernel mandiri, jadi tidak perlu mengkompilasi ulang kernel OS.



Pada saat penulisan ini, versi xtables-addons saat ini adalah 3.9. Namun, hanya 3.8 yang dapat ditemukan di repositori Ubuntu 20.04 LTS standar, dan 3.0 di repositori Ubuntu 18.04. Anda dapat menginstal ekstensi dari manajer paket dengan perintah berikut:



apt install xtables-addons-common libtext-csv-xs-perl


Perhatikan bahwa ada perbedaan kecil namun penting antara versi 3.9 dan status proyek saat ini, yang akan kita diskusikan nanti. Untuk membangun dari kode sumber, instal semua paket yang diperlukan:



apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl


Gandakan repositori:



git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons


cd xtables-addons-xtables-addons


xtables-addons berisi banyak ekstensi, tetapi kami hanya tertarik pada xt_geoip . Jika Anda tidak ingin menyeret ekstensi yang tidak perlu ke dalam sistem, Anda dapat mengecualikannya dari perakitan. Untuk melakukan ini, Anda perlu mengedit file mconfig . Untuk semua modul yang diinginkan, taruh y , dan semua yang tidak perlu, set n . Kami mengumpulkan:



./autogen.sh


./configure


make


Dan instal dengan hak superuser:



make install


Selama instalasi modul kernel, kesalahan mungkin muncul dengan konten berikut:



INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory


Situasi ini terjadi karena ketidakmampuan untuk menandatangani modul kernel tidak ada yang perlu ditandatangani. Anda dapat mengatasi masalah ini dengan beberapa perintah:



cd /lib/modules/(uname -r)/build/certs


cat <<EOF > x509.genkey


[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Modules

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF


openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem


Modul kernel yang dikompilasi telah diinstal, tetapi sistem tidak mendeteksinya. Mari kita minta sistem untuk membuat peta dependensi berdasarkan modul baru, lalu memuatnya:



depmod -a


modprobe xt_geoip


Pastikan xt_geoip dimuat ke dalam sistem:



# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables


Selain itu, pastikan ekstensi dimuat ke iptables:



# cat /proc/net/ip_tables_matches 
geoip
icmp


Semuanya cocok untuk kita dan yang tersisa hanyalah menambahkan nama modul ke / etc / modules sehingga modul tersebut akan berfungsi setelah reboot OS. Pada titik ini, iptables memahami perintah geoip, tetapi kekurangan data untuk dikerjakan. Mari mulai memuat database geoip.



Dapatkan Database GeoIP



Buat direktori yang akan menyimpan informasi untuk ekstensi iptables:



mkdir /usr/share/xt_geoip


Di awal artikel ini, kami menyebutkan bahwa ada perbedaan antara versi sumber dan versi manajer paket. Perbedaan yang paling mencolok adalah perubahan penyedia database dan skrip xt_geoip_dl , yang mendownload data sebenarnya.



Versi dari manajer paket



Skrip terletak di sepanjang jalur / usr / lib / xtables-addons, tetapi ketika Anda mencoba memulai, Anda mungkin melihat kesalahan yang tidak terlalu informatif:



# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.


Sebelumnya, database menggunakan produk GeoLite, sekarang dikenal sebagai GeoLite Legacy, didistribusikan di bawah lisensi Creative Commons ASA 4.0 oleh MaxMind . Dengan produk ini, dua peristiwa terjadi sekaligus, yang "merusak" kompatibilitas dengan ekstensi untuk iptables.



Pertama, pada Januari 2018, mereka mengumumkan berakhirnya dukungan untuk produk tersebut, dan pada 2 Januari 2019, semua tautan untuk mengunduh versi lama database dihapus dari situs web resmi. Pengguna baru disarankan untuk menggunakan produk GeoLite2 atau versi berbayar GeoIP2.



Kedua, sejak Desember 2019, MaxMind mengumumkantentang perubahan signifikan dalam akses ke database mereka. Untuk mematuhi undang-undang perlindungan konsumen California, MaxMind telah memutuskan untuk "menutupi" distribusi GeoLite2 dengan pendaftaran.



Karena kami ingin menggunakan produk mereka, kami akan mendaftar di halaman ini.





Setelah itu, pesan akan dikirim ke email dengan permintaan untuk menyetel kata sandi. Sekarang kita telah membuat akun, kita perlu membuat kunci lisensi. Di akun pribadi Anda, temukan item Kunci Lisensi Saya , lalu klik tombol Buat Kunci Lisensi baru .



Saat membuat kunci, kami hanya akan ditanya satu pertanyaan: akankah kami menggunakan kunci ini dalam program Pembaruan GeoIP? Kami menjawab di negatif dan klik tombol Konfirmasi . Kunci tersebut akan ditampilkan di jendela pop-up. Simpan kunci ini di tempat yang aman, karena setelah menutup jendela pop-up, Anda tidak dapat lagi melihat kunci lengkap.





Kami memiliki kemampuan untuk mengunduh basis data GeoLite2 secara manual, tetapi formatnya tidak kompatibel dengan format yang diharapkan oleh skrip xt_geoip_build. Di sinilah skrip GeoLite2xtables masuk. Agar skrip berfungsi, instal modul NetAddr :: IP perl:



wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz


tar xvf NetAddr-IP-4.079.tar.gz


cd NetAddr-IP-4.079


perl Makefile.PL


make


make install


Selanjutnya, kami menggandakan repositori dengan skrip dan menulis kunci lisensi yang diperoleh sebelumnya ke file:



git clone https://github.com/mschmitt/GeoLite2xtables.git


cd GeoLite2xtables


echo YOUR_LICENSE_KEY=\’123ertyui123\' > geolite2.license


Kami meluncurkan skrip:



#   GeoLite2
./00_download_geolite2
#     (  )
./10_download_countryinfo
#  GeoLite2    GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv
MaxMind memberlakukan batas 2000 unduhan per hari dan, dengan sejumlah besar server, menawarkan untuk menyimpan pembaruan ke cache di server proxy.
Harap dicatat bahwa file keluaran harus diberi nama dbip-country-lite.csv . Sayangnya 20_convert_geolite2 tidak menghasilkan file yang sempurna. Skrip xt_geoip_build mengharapkan tiga kolom:



  • awal rentang alamat;
  • akhir rentang alamat;
  • kode negara dalam iso-3166-alpha2.


Dan file keluaran berisi enam kolom:



  • awal rentang alamat (representasi string);
  • akhir rentang alamat (representasi string);
  • awal rentang alamat (numerik);
  • akhir rentang alamat (numerik);
  • kode negara;
  • nama negara.


Perbedaan ini sangat penting dan dapat diperbaiki dengan salah satu dari dua cara berikut:



  1. edit 20_convert_geolite2 ;
  2. edit xt_geoip_build .


Dalam kasus pertama, kami mempersingkat printf ke format yang diperlukan, dan dalam kasus kedua, kami mengubah tugas variabel $ cc menjadi $ baris -> [4] . Setelah itu, Anda dapat membangun:



/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip


. . .
 2239 IPv4 ranges for ZA
  348 IPv6 ranges for ZA
   56 IPv4 ranges for ZM
   12 IPv6 ranges for ZM
   56 IPv4 ranges for ZW
   15 IPv6 ranges for ZW


Perhatikan bahwa penulis GeoLite2xtables tidak menganggap skripnya siap untuk produksi dan menyarankan agar Anda mengikuti pengembangan skrip xt_geoip_ * asli. Oleh karena itu, mari lanjutkan ke membangun dari sumber, di mana skrip ini telah diperbarui.



Versi sumber



Saat menginstal dari sumber, skrip xt_geoip_ * terletak di direktori / usr / local / libexec / xtables-addons . Versi skrip ini menggunakan database IP ke Country Lite . Lisensi - Lisensi Atribusi Creative Commons, dan dari data yang tersedia, itu adalah tiga kolom paling penting. Unduh dan kumpulkan database:



cd /usr/share/xt_geoip/


/usr/local/libexec/xtables-addons/xt_geoip_dl


/usr/local/libexec/xtables-addons/xt_geoip_build


Setelah langkah-langkah ini, iptables siap digunakan.



Menggunakan geoip di iptables



Modul xt_geoip hanya menambahkan dua kunci:



geoip match options:
[!] --src-cc, --source-country country[,country...]
	Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
	Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.


Cara aturan iptables terbentuk umumnya tetap tidak berubah. Untuk menggunakan sakelar dari modul tambahan, Anda harus secara eksplisit menentukan nama modul dengan sakelar -m. Misalnya, aturan untuk memblokir koneksi TCP masuk di port 443 dari non-AS di semua antarmuka:



iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP


File yang dihasilkan oleh xt_geoip_build hanya digunakan saat membuat aturan, tetapi tidak dipertimbangkan untuk pemfilteran. Jadi, untuk memperbarui database geoip dengan benar, Anda harus memperbarui file iv * terlebih dahulu, lalu membuat ulang semua aturan yang menggunakan geoip di iptables.

Kesimpulan



Memfilter paket menurut negara adalah strategi yang agak terlupakan. Meskipun demikian, alat perangkat lunak untuk pemfilteran semacam itu sedang berkembang dan, mungkin, segera versi baru xt_geoip dengan penyedia data geoip baru akan muncul di manajer paket, yang akan sangat menyederhanakan kehidupan administrator sistem.






All Articles