Я пытаюсь ограничить максимальное количество TCP-подключений к порту 80 моего сервера, приходящих с одного и того же IP. Я использовал iptables для этой задачи:
-A INPUT -p tcp --dport 80 -m conntrack --ctstate ESTABLISHED -m connlimit --connlimit-above 24 --connlimit-mask 32 -j LOG_THROT
Правило отправляет пакеты в мою цепочку LOG_THROT, где я регистрирую их, а TCP-соединение сбрасывается.
Проблема в том, что все IP-адреса, которые регистрируются (правило переполнения 24 параллельных http-подключений) и находятся в журналах доступа Apache, кажутся законными пользователями с рефералами от Google, поступающими от стандартных мобильных интернет-провайдеров, таких как Vodafone и т. д. Все они имеют общий пользовательский агент, и он выглядит следующим образом:
Mozilla/5.0 (iPhone; ЦП iPhone OS 11_3, как Mac OS X) AppleWebKit/605.1.15 (KHTML, как Gecko) Версия/ 11.0 Mobile/15E148 Safari/604.1
Мне было интересно, имеет ли новая ОС/браузер более высокий лимит, чем стандартные 6 параллельных подключений, может быть, она использует какую-то предварительную загрузку ссылок, найденных на веб-сайте, и создает дополнительные соединения или это какой-то сканер, подделывающий UA?
Если это законно, какой безопасный предел количества подключений вы предлагаете? 50, 100?
решение1
Почему бы вам не настроить свой веб и не использовать HTTP/2 (в конечном итоге HTTPS)?
Они оба используют одно мультиплексное соединение вместо нескольких соединений в HTTP1.x. Методы сегментирования домена больше не нужны.
решение2
Решил эту проблему. Ответ отличается от лучшего решения, хотя. Лучшее решение — это ответ prosti.
Происходит то, что вышеупомянутый Safari/iOS не использует повторно keep-alive соединение. Причин может быть много, и интернет переполнен разными ответами на эту тему, возможно, это даже устаревшая функция в их последних версиях. Форумы Apple были бесполезны в этой теме.
Таким образом, для каждого ресурса, который необходимо загрузить с веб-сайта, создается новое соединение, но сервер, поддерживающий соединения в течение X секунд, в конечном итоге достигает порогового значения, указанного в правиле iptables.
Решением, которое мне помогло, стало добавление директивы BrowserMatch в httpd.conf, которая сопоставляет все устройства iPhone/iPod и отключает для них поддержку keepalive.
BrowserMatch "iPhone|iPad|iPod" nokeepalive
Что касается максимального количества подключений, которое может создать Safari, я обнаружил, что в некоторых ошибочных ситуациях оно может достигать 15000 !! (https://www.wiktorzychla.com/2017/06/http2-keep-alive-and-safari-browsers.html). Но в обычных обстоятельствах это будет скорее около значений 4-8 на домен или 15-30 шардингов, судя по этой статистике:http://www.browserscope.org/?category=network&ua=Safari*&v=3