تبدو مهمة منع حركة المرور من بلدان معينة بسيطة ، لكن الانطباع الأول مخادع. سنخبرك اليوم كيف يمكن تنفيذ ذلك.
خلفية
نتائج البحث على Google حول هذا الموضوع مزعجة: معظم الحلول "فاسدة" منذ فترة طويلة ويبدو أحيانًا أن هذا الموضوع قد تم تأجيله ونسيانه إلى الأبد. لقد مررنا بالعديد من السجلات القديمة ومستعدون لمشاركة الإصدار الحديث من التعليمات.
نوصي بقراءة المقال بأكمله قبل تنفيذ الأوامر المشار إليها.
تحضير نظام التشغيل
سيتم تكوين التصفية باستخدام الأداة المساعدة iptables ، والتي تتطلب امتدادًا للعمل مع بيانات GeoIP. يمكن العثور على هذا الامتداد في ملحقات xtables . يقوم xtables-addons بتثبيت امتدادات iptables كوحدات kernel مستقلة ، لذلك ليست هناك حاجة لإعادة ترجمة نظام التشغيل kernel.
في وقت كتابة هذا التقرير ، كان الإصدار الحالي من xtables-addons هو 3.9. ومع ذلك ، يمكن العثور على 3.8 فقط في مستودعات Ubuntu 20.04 LTS القياسية ، و 3.0 في مستودعات Ubuntu 18.04. يمكنك تثبيت الامتداد من مدير الحزم باستخدام الأمر التالي:
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 ، الموزع بموجب ترخيص Creative Commons ASA 4.0 بواسطة MaxMind . مع هذا المنتج ، حدث حدثان في وقت واحد ، مما أدى إلى "كسر" التوافق مع امتداد iptables.
أولاً ، في يناير 2018 ، أعلنوا عن انتهاء دعم المنتج ، وفي 2 يناير 2019 ، تمت إزالة جميع الروابط الخاصة بتنزيل الإصدار القديم من قاعدة البيانات من الموقع الرسمي. يُنصح المستخدمون الجدد باستخدام منتج GeoLite2 أو نسخته المدفوعة GeoIP2.
ثانيًا ، منذ ديسمبر 2019 ، أعلنت شركة MaxMindحول تغيير كبير في الوصول إلى قواعد البيانات الخاصة بهم. للامتثال لقانون حماية المستهلك في كاليفورنيا ، قررت MaxMind "التستر" على توزيع GeoLite2 عن طريق التسجيل.
نظرًا لأننا نريد استخدام منتجهم ، فسنقوم بالتسجيل في هذه الصفحة.
بعد ذلك ، ستصل رسالة إلى البريد تتضمن طلبًا لتعيين كلمة مرور. الآن وقد أنشأنا حسابًا ، نحتاج إلى إنشاء مفتاح ترخيص. في حسابك الشخصي ، ابحث عن العنصر مفاتيح الترخيص الخاصة بي ، ثم انقر فوق الزر إنشاء مفتاح ترخيص جديد .
عند إنشاء مفتاح ، سيتم طرح سؤال واحد فقط: هل سنستخدم هذا المفتاح في برنامج GeoIP Update؟ نجيب بالنفي ونضغط على زر التأكيد . سيتم عرض المفتاح في النافذة المنبثقة. احفظ هذا المفتاح في مكان آمن ، لأنه بعد إغلاق النافذة المنبثقة لن تتمكن بعد ذلك من رؤية المفتاح بالكامل.
لدينا القدرة على تنزيل قواعد بيانات 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 .
في الحالة الأولى ، نختصر printf إلى التنسيق المطلوب ، وفي الحالة الثانية ، نغير تخصيص المتغير $ cc إلى $ row -> [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
لاحظ أن مؤلف GeoLite2xtables لا يعتبر نصوصه جاهزة للإنتاج ويقترح عليك متابعة تطوير البرامج النصية الأصلية xt_geoip_ *. لذلك ، دعنا ننتقل إلى البناء من المصدر ، حيث تم تحديث هذه البرامج النصية بالفعل.
نسخة المصدر
عند التثبيت من المصدر ، توجد البرامج النصية xt_geoip_ * في الدليل / usr / local / libexec / xtables-addons . يستخدم هذا الإصدار من البرنامج النصي قاعدة بيانات IP to Country Lite . الترخيص - ترخيص 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 مع موفر بيانات جغرافي جديد في مديري الحزم ، مما يبسط بشكل كبير حياة مسؤولي النظام.