Достатньо простий скрипт на python. Повертає ISO код країни для IP-адреси. Використовується для визначення чи належить ip-адреса до українського сегмента. Я цей скрипт використав у конфіг-файлі поштового сервера Exim4 (приклад нижче скрипту)
#!/usr/bin/env python3
import sys
import geoip2.database
# path to your GeoIP database file
# from https://db-ip.com/db/download/ip-to-country-lite
GEOIP_DB_FILE = '/opt/geolocate/ipdb202305.mmdb'
# Open the GeoIP database file
geoip_reader = geoip2.database.Reader(GEOIP_DB_FILE)
# Get the IP address from the command-line arguments
ip_address = sys.argv[1]
try:
# Look up the IP address in the GeoIP database
# Get the country code from the GeoIP response
country_code = geoip_reader.country(ip_address).country.iso_code.strip() # .name
except geoip2.errors.AddressNotFoundError:
# IP address not found in the GeoIP database
country_code = 'unknown'
# Output the country code
print(country_code, end = '')
Зауваження до скрипту: треба перевірити що скрипт не повертає зайвих знаків, для цього у country_code .iso_code.strip()
а у принта end = ''
Фрагмент конфігу Exim4 /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
блокує не-UA smtp-клієнтів
# UA check policy
# Retrieve the country code of the client's IP address using the Python script
# Replace /opt/geolocate/geoip_lookup.py with the actual path to the script
# Make sure that the script is executable (chmod +x /opt/geolocate/geoip_lookup.py )
# /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
warn
condition = ${if !eq{${run{/opt/geolocate/geoip_lookup.py $sender_host_address}}}{UA}{yes}{no}}
message = Your SMTP session is blocked because you are not located in Ukraine IP address is $sender_host_address.
# Block the sender's SMTP session if the country code is not UA (Ukraine)
deny
message = Your SMTP session is blocked because you are not located in Ukraine (UA). IP address is $sender_host_address.
!hosts = +relay_from_hosts
condition = ${if !eq{${run{/opt/geolocate/geoip_lookup.py $sender_host_address}}}{UA}{yes}{no}}
після збереження скрипта у /etc/exim4 виконати
sudo update-exim4.conf -v
service exim4 restart
service exim4 status
Перевірка виконання умов в конфігах exim4. Цей вираз відповідає на питання “блокувати?” якщо адреса UA то поверне “no”
sudo exim -be '${if !eq{${run{/opt/geolocate/geoip_lookup.py 11.11.11.11}}}{UA}{yes}{no}}'
[…] коли адреса ідентифікується як українська то ок, але у конфігах для коректного виконання виглядає так: condition = ${if !eq{${run{/opt/geolocate/geoip_lookup.py $sender_host_address}}}{UA}{yes}{no}} скрипт повертає тільки код країни. Подробиці тут. […]