
تبدو مهمة منع حركة المرور من بعض البلدان بسيطة، ولكن الانطباعات الأولى قد تكون خادعة. اليوم سنخبرك كيف يمكن تنفيذ ذلك.
قبل التاريخ
نتائج بحث Google حول هذا الموضوع مخيبة للآمال: فمعظم الحلول كانت "فاسدة" منذ فترة طويلة، ويبدو أحيانًا أن هذا الموضوع قد تم وضعه على الرف ونسيانه إلى الأبد. لقد قمنا بتمشيط الكثير من السجلات القديمة ونحن على استعداد لمشاركة نسخة حديثة من التعليمات.
نوصي بقراءة المقالة بأكملها قبل تنفيذ هذه الأوامر.
إعداد نظام التشغيل
سيتم تكوين التصفية باستخدام الأداة المساعدة يبتابليس، الأمر الذي يتطلب امتدادًا للعمل مع بيانات GeoIP. يمكن العثور على هذا الامتداد في . يقوم xtables-addons بتثبيت ملحقات iptables كوحدات نواة مستقلة، لذلك ليست هناك حاجة لإعادة ترجمة نواة نظام التشغيل.
في وقت كتابة هذا التقرير، الإصدار الحالي من 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./configuremakeوتثبيت مع حقوق المستخدم المتميز:
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/certscat <<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
EOFopenssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pemتم تثبيت وحدة kernel المترجمة، لكن النظام لم يكتشفها. لنطلب من النظام إنشاء خريطة تبعية مع مراعاة الوحدة الجديدة، ثم تحميلها:
depmod -amodprobe 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، والموزع بموجب ترخيص، كقاعدة بيانات شركة . حدث حدثان مع هذا المنتج في وقت واحد مما أدى إلى "كسر" التوافق مع ملحق iptables.
أولاً، في يناير 2018 حول إنهاء دعم المنتج، وفي 2019 يناير 2، تمت إزالة جميع روابط تنزيل الإصدار القديم من قاعدة البيانات من الموقع الرسمي. يُنصح المستخدمون الجدد باستخدام منتج GeoLite2 أو نسخته المدفوعة GeoIPXNUMX.
ثانيًا، منذ ديسمبر 2019، ماكس مايند حول تغيير كبير في الوصول إلى قواعد البيانات الخاصة بهم. للامتثال لقانون خصوصية المستهلك في كاليفورنيا، قررت MaxMind "تغطية" توزيع GeoLite2 بالتسجيل.
وبما أننا نريد استخدام منتجهم، فسوف نقوم بالتسجيل في هذه الصفحة.

ستتلقى بعد ذلك رسالة بريد إلكتروني تطلب منك تعيين كلمة مرور. الآن بعد أن قمنا بإنشاء حساب، نحتاج إلى إنشاء مفتاح ترخيص. في حسابك الشخصي نجد هذا البند مفاتيح الترخيص الخاصة بي، ثم انقر على الزر إنشاء مفتاح ترخيص جديد.
عند إنشاء مفتاح، سيتم طرح سؤال واحد فقط علينا: هل سنستخدم هذا المفتاح في برنامج تحديث GeoIP؟ نجيب بالنفي ونضغط على الزر أكد. سيتم عرض المفتاح في نافذة منبثقة. احفظ هذا المفتاح في مكان آمن، لأنه بمجرد إغلاق النافذة المنبثقة، لن تتمكن بعد ذلك من عرض المفتاح بالكامل.

لدينا القدرة على تنزيل قواعد بيانات GeoLite2 يدويًا، لكن تنسيقها غير متوافق مع التنسيق المتوقع بواسطة البرنامج النصي xt_geoip_build. هذا هو المكان الذي تأتي فيه البرامج النصية GeoLite2xtables للإنقاذ. لتشغيل البرامج النصية، قم بتثبيت وحدة NetAddr::IP perl:
wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gztar xvf NetAddr-IP-4.079.tar.gzcd NetAddr-IP-4.079perl Makefile.PLmakemake installبعد ذلك، نقوم باستنساخ المستودع باستخدام البرامج النصية وكتابة مفتاح الترخيص الذي تم الحصول عليه مسبقًا في الملف:
git clone https://github.com/mschmitt/GeoLite2xtables.gitcd GeoLite2xtablesecho 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.
في الحالة الأولى نقوم بالتقليل إلى التنسيق المطلوب، وفي الثانية - نغير الإسناد إلى المتغير $ سم مكعب في صف $->[4]. بعد ذلك يمكنك بناء:
/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_*. لذلك، دعنا ننتقل إلى التجميع من أكواد المصدر، حيث تم بالفعل تحديث هذه البرامج النصية.
نسخة المصدر
عند التثبيت من البرامج النصية للتعليمات البرمجية المصدر xt_geoip_* موجودة في الكتالوج /usr/local/libexec/xtables-addons. يستخدم هذا الإصدار من البرنامج النصي قاعدة بيانات . الترخيص هو ترخيص Creative Commons Attribution، ومن البيانات المتاحة توجد الأعمدة الثلاثة الضرورية للغاية. تنزيل وتجميع قاعدة البيانات:
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
