تبدو مهمة منع حركة المرور من بعض البلدان بسيطة، ولكن الانطباعات الأولى قد تكون خادعة. اليوم سنخبرك كيف يمكن تنفيذ ذلك.
قبل التاريخ
نتائج بحث Google حول هذا الموضوع مخيبة للآمال: فمعظم الحلول كانت "فاسدة" منذ فترة طويلة، ويبدو أحيانًا أن هذا الموضوع قد تم وضعه على الرف ونسيانه إلى الأبد. لقد قمنا بتمشيط الكثير من السجلات القديمة ونحن على استعداد لمشاركة نسخة حديثة من التعليمات.
نوصي بقراءة المقالة بأكملها قبل تنفيذ هذه الأوامر.
إعداد نظام التشغيل
سيتم تكوين التصفية باستخدام الأداة المساعدة يبتابليس، الأمر الذي يتطلب امتدادًا للعمل مع بيانات GeoIP. يمكن العثور على هذا الامتداد في
في وقت كتابة هذا التقرير، الإصدار الحالي من xtables-addons هو 3.9. ومع ذلك، يمكن العثور على 20.04 فقط في مستودعات Ubuntu 3.8 LTS القياسية، و18.04 في مستودعات Ubuntu 3.0. يمكنك تثبيت الامتداد من مدير الحزم باستخدام الأمر التالي:
apt install xtables-addons-common libtext-csv-xs-perl
لاحظ أن هناك اختلافات صغيرة ولكنها مهمة بين الإصدار 3.9 والحالة الحالية للمشروع، والتي سنناقشها لاحقًا. للبناء من الكود المصدري، قم بتثبيت كافة الحزم الضرورية:
apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl
استنساخ المستودع:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addons
يحتوي xtables-addons على العديد من الإضافات، ولكننا مهتمون بها فقط xt_geoip. إذا كنت لا ترغب في سحب الملحقات غير الضرورية إلى النظام، فيمكنك استبعادها من الإنشاء. للقيام بذلك تحتاج إلى تحرير الملف mconfig. لجميع الوحدات المطلوبة، قم بتثبيت y، ووضع علامة على كل ما هو غير ضروري n. نجمعها:
./autogen.sh
./configure
make
وتثبيت مع حقوق المستخدم المتميز:
make install
أثناء تثبيت وحدات kernel، قد يحدث خطأ مشابه لما يلي:
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
ينشأ هذا الموقف بسبب استحالة التوقيع على وحدات kernel، لأن لا شيء للتوقيع. يمكنك حل هذه المشكلة باستخدام أمرين:
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
تم تثبيت وحدة kernel المترجمة، لكن النظام لم يكتشفها. لنطلب من النظام إنشاء خريطة تبعية مع مراعاة الوحدة الجديدة، ثم تحميلها:
depmod -a
modprobe xt_geoip
دعونا نتأكد من تحميل xt_geoip في النظام:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tables
بالإضافة إلى ذلك، تأكد من تحميل الامتداد في iptables:
# cat /proc/net/ip_tables_matches
geoip
icmp
نحن سعداء بكل شيء وكل ما تبقى هو إضافة اسم الوحدة إليه / etc / modulesبحيث تعمل الوحدة بعد إعادة تشغيل نظام التشغيل. من الآن فصاعدًا، يفهم iptables أوامر Geoip، لكنه لا يملك بيانات كافية للتعامل معها. لنبدأ في تحميل قاعدة بيانات Geoip.
الحصول على قاعدة بيانات GeoIP
نقوم بإنشاء دليل يتم فيه تخزين المعلومات المفهومة لامتداد iptables:
mkdir /usr/share/xt_geoip
ذكرنا في بداية المقال أن هناك اختلافات بين الإصدار من الكود المصدري والإصدار من مدير الحزم. الفرق الأكثر وضوحًا هو التغيير في بائع قاعدة البيانات والبرنامج النصي xt_geoip_dl، الذي يقوم بتنزيل أحدث البيانات.
نسخة مدير الحزم
يوجد البرنامج النصي في المسار /usr/lib/xtables-addons، ولكن عند محاولة تشغيله، سترى خطأ غير مفيد للغاية:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.
في السابق، تم استخدام منتج GeoLite، المعروف الآن باسم GeoLite Legacy، والموزع بموجب ترخيص، كقاعدة بيانات
أولاً، في يناير 2018
ثانيًا، منذ ديسمبر 2019، ماكس مايند
وبما أننا نريد استخدام منتجهم، فسوف نقوم بالتسجيل في هذه الصفحة.
ستتلقى بعد ذلك رسالة بريد إلكتروني تطلب منك تعيين كلمة مرور. الآن بعد أن قمنا بإنشاء حساب، نحتاج إلى إنشاء مفتاح ترخيص. في حسابك الشخصي نجد هذا البند مفاتيح الترخيص الخاصة بي، ثم انقر على الزر إنشاء مفتاح ترخيص جديد.
عند إنشاء مفتاح، سيتم طرح سؤال واحد فقط علينا: هل سنستخدم هذا المفتاح في برنامج تحديث GeoIP؟ نجيب بالنفي ونضغط على الزر أكد. سيتم عرض المفتاح في نافذة منبثقة. احفظ هذا المفتاح في مكان آمن، لأنه بمجرد إغلاق النافذة المنبثقة، لن تتمكن بعد ذلك من عرض المفتاح بالكامل.
لدينا القدرة على تنزيل قواعد بيانات GeoLite2 يدويًا، لكن تنسيقها غير متوافق مع التنسيق المتوقع بواسطة البرنامج النصي xt_geoip_build. هذا هو المكان الذي تأتي فيه البرامج النصية GeoLite2xtables للإنقاذ. لتشغيل البرامج النصية، قم بتثبيت وحدة 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
بعد ذلك، نقوم باستنساخ المستودع باستخدام البرامج النصية وكتابة مفتاح الترخيص الذي تم الحصول عليه مسبقًا في الملف:
git clone https://github.com/mschmitt/GeoLite2xtables.git
cd GeoLite2xtables
echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license
لنقم بتشغيل البرامج النصية:
# Скачиваем данные 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 حدًا يبلغ 2000 عملية تنزيل يوميًا، ومع وجود عدد كبير من الخوادم، يعرض تخزين التحديث مؤقتًا على خادم وكيل.
يرجى ملاحظة أنه يجب استدعاء ملف الإخراج dbip-country-lite.csv... لسوء الحظ، 20_convert_geolite2 لا ينتج ملفًا مثاليًا. النصي xt_geoip_build يتوقع ثلاثة أعمدة:
- بداية نطاق العنوان؛
- نهاية نطاق العنوان؛
- رمز البلد في ISO-3166-alpha2.
ويحتوي ملف الإخراج على ستة أعمدة:
- بداية نطاق العنوان (تمثيل السلسلة)؛
- نهاية نطاق العنوان (تمثيل السلسلة)؛
- بداية نطاق العنوان (التمثيل الرقمي)؛
- نهاية نطاق العنوان (التمثيل الرقمي)؛
- رمز البلد؛
- اسم البلد.
وهذا التناقض أمر بالغ الأهمية ويمكن تصحيحه بإحدى طريقتين:
- يحرر 20_convert_geolite2;
- يحرر xt_geoip_build.
في الحالة الأولى نقوم بالتقليل
/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
لاحظ أن المؤلف
نسخة المصدر
عند التثبيت من البرامج النصية للتعليمات البرمجية المصدر xt_geoip_* موجودة في الكتالوج /usr/local/libexec/xtables-addons. يستخدم هذا الإصدار من البرنامج النصي قاعدة بيانات
cd /usr/share/xt_geoip/
/usr/local/libexec/xtables-addons/xt_geoip_dl
/usr/local/libexec/xtables-addons/xt_geoip_build
بعد هذه الخطوات، يصبح iptables جاهزًا للعمل.
استخدام Geoip في iptables
وحدة xt_geoip يضيف مفتاحين فقط:
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.
تبقى طرق إنشاء قواعد iptables بشكل عام دون تغيير. لاستخدام مفاتيح من وحدات إضافية، يجب عليك تحديد اسم الوحدة بوضوح باستخدام رمز التبديل -m. على سبيل المثال، قاعدة لمنع اتصالات TCP الواردة على المنفذ 443 وليس من الولايات المتحدة الأمريكية على جميع الواجهات:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
يتم استخدام الملفات التي تم إنشاؤها بواسطة xt_geoip_build فقط عند إنشاء القواعد، ولكن لا يتم أخذها في الاعتبار عند التصفية. وبالتالي، لتحديث قاعدة بيانات Geoip بشكل صحيح، يجب عليك أولاً تحديث ملفات iv*، ثم إعادة إنشاء جميع القواعد التي تستخدم Geoip في iptables.
اختتام
تعد تصفية الحزم بناءً على البلدان بمثابة استراتيجية منسية إلى حد ما مع مرور الوقت. على الرغم من ذلك، يتم تطوير أدوات البرامج لمثل هذه التصفية، وربما، قريبا، سيظهر إصدار جديد من XT_GEOIP مع موفر بيانات GeoIP الجديد في مديري الحزم، مما سيبسط إلى حد كبير حياة مسؤولي النظام.
يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع.
هل سبق لك استخدام التصفية حسب البلد؟
-
59,1%نعم 13
-
40,9%رقم 9
صوَّت 22 مستخدمًا. امتنع 3 مستخدما عن التصويت.
المصدر: www.habr.com