Tugas memblokir lalu lintas dari negara-negara tertentu tampaknya sederhana, namun kesan pertama bisa menipu. Hari ini kami akan memberi tahu Anda bagaimana hal ini dapat diterapkan.
prasejarah
Hasil pencarian Google mengenai topik ini mengecewakan: sebagian besar solusi telah lama “busuk” dan terkadang topik ini tampaknya telah disimpan dan dilupakan selamanya. Kami telah menyisir banyak catatan lama dan siap membagikan instruksi versi modern.
Kami menyarankan Anda membaca seluruh artikel sebelum menjalankan perintah ini.
Persiapan sistem operasi
Pemfilteran akan dikonfigurasi menggunakan utilitas iptables, yang memerlukan ekstensi untuk bekerja dengan data GeoIP. Ekstensi ini dapat ditemukan di
Pada saat penulisan, versi xtables-addons saat ini adalah 3.9. Namun, hanya 20.04 yang dapat ditemukan di repositori standar Ubuntu 3.8 LTS, dan 18.04 di repositori Ubuntu 3.0. 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 bahas 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
Kloning 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 build. Untuk melakukan ini, Anda perlu mengedit file mconfig. Untuk semua modul yang diinginkan, instal y, dan tandai semua yang tidak diperlukan n. Kami mengumpulkan:
./autogen.sh
./configure
make
Dan instal dengan hak pengguna super:
make install
Selama instalasi modul kernel, kesalahan serupa berikut ini mungkin terjadi:
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 muncul karena ketidakmungkinan menandatangani modul kernel, karena 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 ketergantungan dengan mempertimbangkan modul baru, lalu memuatnya:
depmod -a
modprobe xt_geoip
Mari 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
Kami senang dengan semuanya dan yang tersisa hanyalah menambahkan nama modul / etc / modulesagar modul berfungsi setelah me-reboot OS. Mulai sekarang, iptables memahami perintah geoip, tetapi tidak memiliki cukup data untuk digunakan. Mari mulai memuat database geoip.
Mendapatkan Basis Data GeoIP
Kami membuat direktori di mana informasi yang dapat dimengerti oleh ekstensi iptables akan disimpan:
mkdir /usr/share/xt_geoip
Di awal artikel, kami telah menyebutkan bahwa ada perbedaan antara versi dari kode sumber dan versi dari pengelola paket. Perbedaan yang paling mencolok adalah perubahan vendor database dan script xt_geoip_dl, yang mengunduh data terbaru.
Versi manajer paket
Skrip ini terletak di jalur /usr/lib/xtables-addons, tetapi ketika Anda mencoba menjalankannya, Anda akan 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, produk GeoLite, sekarang dikenal sebagai GeoLite Legacy, didistribusikan di bawah lisensi, digunakan sebagai database
Pertama, pada bulan Januari 2018
Kedua, sejak Desember 2019 MaxMind
Karena kami ingin menggunakan produk mereka, kami akan mendaftar di halaman ini.
Anda kemudian akan menerima email yang meminta Anda untuk mengatur kata sandi. Sekarang kita telah membuat akun, kita perlu membuat kunci lisensi. Di akun pribadi Anda, kami menemukan item tersebut Kunci Lisensi Saya, lalu klik tombolnya Hasilkan Kunci Lisensi baru.
Saat membuat kunci, kita hanya akan ditanyai satu pertanyaan: apakah kita akan menggunakan kunci ini dalam program Pembaruan GeoIP? Kami menjawab negatif dan menekan tombol Memastikan. Kuncinya akan ditampilkan di jendela pop-up. Simpan kunci ini di tempat yang aman, karena setelah Anda menutup jendela pop-up, Anda tidak dapat lagi melihat seluruh kunci.
Kami memiliki kemampuan untuk mengunduh database GeoLite2 secara manual, namun formatnya tidak kompatibel dengan format yang diharapkan oleh skrip xt_geoip_build. Di sinilah skrip GeoLite2xtables membantu. Untuk menjalankan skrip, 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 mengkloning repositori dengan skrip dan menulis kunci lisensi yang diperoleh sebelumnya ke sebuah file:
git clone https://github.com/mschmitt/GeoLite2xtables.git
cd GeoLite2xtables
echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license
Mari kita jalankan skripnya:
# Скачиваем данные 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 batasan 2000 unduhan per hari dan, dengan jumlah server yang besar, menawarkan untuk menyimpan pembaruan dalam cache di server proxy.
Harap dicatat bahwa file keluaran harus dipanggil dbip-negara-lite.csv... Sayangnya, 20_convert_geolite2 tidak menghasilkan file yang sempurna. Naskah xt_geoip_build mengharapkan tiga kolom:
- mulai dari rentang alamat;
- akhir rentang alamat;
- kode negara di iso-3166-alpha2.
Dan file keluaran berisi enam kolom:
- awal rentang alamat (representasi string);
- akhir rentang alamat (representasi string);
- awal rentang alamat (representasi numerik);
- akhir rentang alamat (representasi numerik);
- kode negara;
- nama negara.
Perbedaan ini sangat penting dan dapat diperbaiki dengan salah satu dari dua cara berikut:
- memerintah 20_convert_geolite2;
- memerintah xt_geoip_build.
Dalam kasus pertama kita mengurangi
/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
Versi sumber
Saat menginstal dari skrip kode sumber xt_geoip_* terletak di katalog /usr/local/libexec/xtables-addons. Versi skrip ini menggunakan 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 bekerja.
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.
Metode untuk membuat aturan untuk iptables, secara umum, tetap tidak berubah. Untuk menggunakan kunci dari modul tambahan, Anda harus secara eksplisit menentukan nama modul dengan tombol -m. Misalnya, aturan untuk memblokir koneksi TCP masuk pada port 443 bukan dari AS di semua antarmuka:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
File yang dibuat oleh xt_geoip_build hanya digunakan saat membuat aturan, tetapi tidak diperhitungkan saat memfilter. 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 berdasarkan negara adalah strategi yang agak terlupakan seiring berjalannya waktu. Meskipun demikian, perangkat lunak untuk pemfilteran tersebut sedang dikembangkan dan, mungkin, versi baru xt_geoip dengan penyedia data geoip baru akan segera muncul di pengelola paket, yang akan sangat menyederhanakan kehidupan administrator sistem.
Hanya pengguna terdaftar yang dapat berpartisipasi dalam survei.
Pernahkah Anda menggunakan pemfilteran berdasarkan negara?
-
59,1%Ya13
-
40,9%No9
22 pengguna memilih. 3 pengguna abstain.
Sumber: www.habr.com