В моей сети есть машина, которая должна сделать 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
к правилуКажется, что уже не существует ничего, что могло бы точно справиться с тем, что вы хотите сделать.