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:
- edit 20_convert_geolite2 ;
- 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.