Вопрос или проблема
У меня есть VPS на базе контейнеров (Ubuntu 22.04, ядро 4.4.0), и я хочу добавить некоторые правила на основе гео-IP в его таблицу маршрутизации. К сожалению, все руководства, которые я смог найти, полагаются на xtables-addons
, который требует модуль ядра xt_geoip
. Я не могу обновить ядро на своем VPS, поэтому не могу установить модуль. Это не вариант.
Существуют ли другие способы сделать то же самое? Или мне придется вручную добавить множество диапазонов адресов, используя обычные правила iptables?
Ответ или решение
Чтобы выполнить маршрутизацию на основе GeoIP на Ubuntu без использования модулей ядра, таких как xtables-addons
, вам понадобится использовать альтернативные методы. Поскольку вы не можете обновить ядро вашего VPS и установить необходимые модули, вы можете воспользоваться подходом с использованием правил iptables
и баз данных IP-адресов.
Вот шаги, которые помогут вам организовать гео-IP маршрутизацию:
Шаг 1: Установка необходимых инструментов
Убедитесь, что у вас установлены следующие инструменты:
sudo apt update
sudo apt install iptables iproute2 curl
Шаг 2: Получение базы данных GeoIP
Вам понадобится база данных, чтобы соотнести IP-адреса с географическими регионами. Вы можете использовать такие базы данных, как MaxMind GeoLite2. Вы можете загрузить GeoLite2-Country.mmdb, используя следующий команду:
mkdir -p /usr/share/GeoIP
curl -o /usr/share/GeoIP/GeoLite2-Country.mmdb https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
gunzip /usr/share/GeoIP/GeoLite2-Country.mmdb.gz
Шаг 3: Составление правил iptables
Теперь, когда у вас есть база данных, вы можете использовать скрипт на Python или другом языке, чтобы прочитать эту базу данных и извлечь IP-диапазоны для стран, которые вас интересуют.
Пример скрипта на Python:
import geoip2.database
import subprocess
# Путь к вашей GeoLite2 базе данных
db_path = '/usr/share/GeoIP/GeoLite2-Country.mmdb'
# Инициализация базы данных
reader = geoip2.database.Reader(db_path)
# Список стран, для которых вы хотите настроить правила
countries = {
'US': '192.0.2.0/24', # Пример IP диапазона, изменение требуется
# Добавьте другие страны и их диапазоны
}
# Удаление существующих правил
subprocess.call('iptables -F', shell=True)
for country_code, ip_range in countries.items():
# Установка правил iptables для заданного диапазона
subprocess.call(f'iptables -A INPUT -s {ip_range} -j ACCEPT', shell=True)
print(f'Правило добавлено для {country_code}: {ip_range}')
Шаг 4: Применение IP-правил
Для того чтобы применить IP-правила, вам необходимо удалить их и добавить при необходимости. Вы можете создать cron-задачу для еженедельного обновления базы данных и выполнения скрипта.
Шаг 5: Сохранение правил iptables
После настройки всех правил вы можете сохранить их таким образом:
sudo iptables-save > /etc/iptables/rules.v4
Заключение
С помощью подхода, описанного выше, вы сможете выполнять гео-IP маршрутизацию без необходимости установки дополнительных модулей ядра. Вам всего лишь нужно правильно настроить правила iptables
, основываясь на IP-адресах, которые вы будете извлекать из базы данных GeoIP. Не забудьте обновлять вашу базу данных GeoIP еженедельно или по мере необходимости, чтобы поддерживать актуальность ваших правил.