Как обновить запись на основе имени ipset

Мне нужно обработать на моем брандмауэре ( Firehol, который затем преобразуется в iptables) несколько динамических записей. В идеальном мире я бы использовал имя (вместо IP-адреса), которое всегда указывает на правильный IP-адрес, но это не работает (по уважительным причинам).

Чтобы сохранить стабильную конфигурацию, я планирую использовать ipset, (РЕДАКТИРОВАТЬ: для примера ниже, давайте предположим, что www.google.com имеет только один IP в данный момент, но который может измениться)

root@srv ~# ipset create google hash:ip
root@srv ~# ipset add google www.google.com
root@srv ~# ipset list google
Name: google
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 136
References: 0
Number of entries: 1
Members:
216.58.206.228

Я могу добавить / удалить IP-адреса для набора. Это не решает проблему обновления IP.

Чтобы взять пример выше, я хотел бы иметь возможность повторно добавить www.google.com и (если его IP изменился), есть 216.58.206.228 удален и заменен новым IP.

Это не вариант:

root@srv ~# ipset add google www.google.com
root@srv ~# ipset list google
Name: google
Type: hash:ip
Revision: 4
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 184
References: 0
Number of entries: 2
Members:
216.58.206.228
216.58.204.132

Существует ли механизм, который позволяет обновить IP в наборе, чтобы соответствовать текущему разрешению имени?

РЕДАКТИРОВАТЬ: уточнить следующие ответы: я не хочу решать проблему имени, имеющего несколько адресов, и охватывать их все (скажем, убедившись, что у меня есть все решения для www.google.com). У меня есть сайт, у которого есть один IP, но этот IP может измениться.

3 ответа

Это не лучший способ заблокировать веб-сайт с большим количеством IP-адресов.

Тем не менее, это будет работать, даже если у вас есть несколько IP-адресов в списке ipset:

Вместо того, чтобы переписать тот же список ipset, создайте новый список и затем ipset swap их.

ipset create temp hash:ip

for address in $(dig a www.google.com +short); do
    ipset add temp $address
done

ipset swap temp google
ipset destroy temp

Ваша проблема в два раза:

  • Ваш брандмауэр работает, блокируя / разрешая подключения к определенным IP-адресам, диапазонам IP-адресов и портам. Если вы настроите свой брандмауэр, используя имена хостов, а не ip-адреса, он все равно будет использовать ip-адреса в своей рабочей конфигурации с ip-адресами, к которым разрешены имена хостов, когда конфигурация была загружена.

  • Многие направления больше не используют один фиксированный IP-адрес (диапазон), но используют такие вещи, как CDN, Round Robin и GEO DNS, anycast и т. Д., И последующие подключения к одному и тому же DNS-имени назначения будут переходить на разные IP-адреса в (почти) непредсказуемая картина.

Большинство организаций решают эту проблему, просто полностью блокируя прямой доступ в Интернет и предписывая использование прокси-сервера. На прокси-сервере вы можете легко применить контроль доступа на основе URL-адреса и разрешить доступ к www.google.co.uk и заблокировать доступ к www.google.de, несмотря на тот факт, что они могут (иногда) разрешаться на один и тот же IP-адрес и несмотря на то, что ip-адрес для них может меняться в случайное время.

Кроме того, организации блокируют DNS, разрешают использовать только предоставленный ими DNS-сервер и запускают белый / черный список имен хостов на уровне DNS. Который для большинства пользователей будет эффективным контролем доступа, хотя его легко обойти квалифицированному оператору.

Я столкнулся с подобными ситуациями и наткнулся на этот старый пост. Мне не удалось найти решение, которое работало бы прямо из коробки.

Я согласен, что прокси-серверов обычно достаточно для большинства нужд, и использование прокси всегда является лучшим вариантом... когда это действительно возможно...

Однако по-прежнему существует множество программных приложений и аппаратных устройств (особенно устройств Интернета вещей), которые либо игнорируют, либо лишь частично реализуют настройки прокси. Эта проблема останется распространенной даже в 2023 году, затрагивая некоторые широко используемые онлайн-сервисы. К сожалению, изменение или отказ от этих приложений не всегда является целесообразным вариантом. Кроме того, часто существует множество IP-адресов, размещенных в облаке, и нет никакой гарантии, что IP-адрес всегда будет принадлежать конкретному хосту.

Чтобы решить эту проблему, я планирую разработать плагин для связывания 9, который предоставит решение для одобренных клиентов. Этот плагин будет динамически добавлять записи в указанный ipset на основе одного или нескольких предоставленных доменных имен. Хотя этот подход может немного увеличить время ответа DNS, я уверен, что он не окажет существенного влияния на общую производительность, особенно в наиболее частом случае, когда ни один домен не соответствует.

Я представляю себе конфигурацию, которая может выглядеть так:

      plugin query "<my ipset plugin>.so" {
           set safe { 
               .example.com;
               site.example.com;
               ttl: 86400;
           };
           set-v6 safe6 { 
               .example.com;
               site.example.com;
               ttl: 300
           };
};

Примечание. TTL является встроенным для ipset, поэтому плагин будет передавать информацию только в случае создания набора.

Мне искренне интересно оценить интерес к этому плагину, который может быть выпущен под лицензией GPL2 и доступен на GitHub.com как отдельный модуль или форкbind9.

Я призываю всех, кому интересно, поделиться своими мыслями и отзывами.

Другие вопросы по тегам