Назад | Перейти на главную страницу

Iptables, NAT: предотвращение ограничения максимального количества запросов на IP-адрес за счет использования нескольких IP-адресов

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

IP-адрес этой машины (видимый из-за брандмауэра) можно выбрать из пула, состоящего примерно из 5 адресов.

Каждый ip может выполнять максимальное количество запросов в день, после чего его нельзя будет использовать повторно до следующего дня; временной интервал между двумя запросами не имеет значения, пока не достигнут дневной лимит.

Я хотел бы настроить таблицу маршрутизации брандмауэра так, чтобы с клиентской машины я мог делать HTTP-запросы, не беспокоясь о временном интервале между ними. Меня беспокоит только общий дневной лимит (т. Е. Количество IP-адресов * максимальное количество запросов на IP-адрес).

Я пробовал что-то вроде:

iptables -m hashlimit -m tcp -A POSTROUTING --syn --hashlimit-name x --hashlimit <MAX REQUESTS>/day -p tcp -s <CLIENT IP> -d <SERVER IP> --dports 80 --to-source <ONE OF THE IPs TO CHOOSE FROM>

И повторил эту команду для всех пяти IP-адресов (с последним правилом, отменяющим дальнейшие попытки подключения).

Но с этой конфигурацией я не могу выполнять запросы пакетами. Например, если MAX_REQUESTS равно 9000, я не могу сделать 9000 запросов в первые две минуты, потому что модуль hashlimit работает со средними значениями и прекращает сопоставление правил, как только количество пакетов превышает указанное среднее значение. Поэтому с этой конфигурацией я могу использовать этот ip только один раз каждые 9,6 секунд (= 86400/9000): не то, что я хочу.

Поэтому я прошу совета по поводу возможного правила iptables (или чего-то еще), которое позволило бы мне выполнять запросы пакетами и оставаться в пределах дневного лимита.

Спасибо за ваше время

Сильвио

РЕДАКТИРОВАТЬ: Я пробовал использовать --hashlimit-burst N, но этот параметр вставляет допуск только для первых N пакетов, т.е. добавляет N пакетов, которые могут соответствовать правилу независимо от среднего, после чего применяются нормальные условия. Опять же, не то, что я хочу.

ОБНОВИТЬ: Текущая кандидатская команда iptable, которую я использую,

iptables -m hashlimit -m multiport -m tcp -A POSTROUTING -t nat --syn --hashlimit-name NAME --hashlimit MAX_REQUEST/day -p tcp -s SOURCE_IP -d DESTINATION_IP --dports 80 -j SNAT --to-source ONE_OF_THE IPs

У него все еще есть вышеупомянутая проблема (не может отправлять пакеты пакетами).

Для жесткого контроля я бы попробовал что-нибудь вроде:

iptables -t nat -A POSTROUTING -s INT_SRC -d EXT_SERVICE --syn --limit MAXREQ/day -j SNAT --to-source EXT_IP1
...

(тогда я обнаружил, что вы уже пробовали: p)

Как насчет использования:

iptables -t nat -A POSTROUTING -s INT_SRC -d EXT_SERVICE --syn -j SNAT --to-source EXT_IP_RANGE

Видимо, в этом варианте используется простой алгоритм циклического перебора - я бы попробовал. Надеюсь, ваши внешние IP-адреса находятся в одном диапазоне :)


Не можете просто позволить дальнейшим запросам завершиться неудачно сами по себе? Учитывая, что у вас очень специфические требования, я бы, вероятно, сделал следующее:

  • добавить --log к правилу
  • напишите демон, который отслеживает количество подключений к сервису, сделанных в этот день, и вставляет правило в FORWARD, которое разрывает дальнейшие подключения к этой службе
  • попросите демона удалить это правило (если оно есть) в полночь и сбросить счетчик подключений

Кажется, что уже не существует ничего, что могло бы точно справиться с тем, что вы хотите сделать.