Как обновить запись на основе имени 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.
Я призываю всех, кому интересно, поделиться своими мыслями и отзывами.