Я пытался ограничить максимальное количество 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 и т. Д. Общим для них является User агент и это:
Mozilla / 5.0 (iPhone; CPU iPhone OS 11_3, например Mac OS X) AppleWebKit / 605.1.15 (KHTML, например Gecko) Версия / 11.0 Mobile / 15E148 Safari / 604.1
Мне было интересно, имеет ли новая ОС / браузер более высокий лимит, чем стандартные 6 параллельных подключений, может ли он использовать какую-то предварительную загрузку ссылок, найденных на веб-сайте, и порождает дополнительные подключения, или это какой-то поисковый робот, подделывающий UA?
Если это допустимо, что вы предлагаете для ограничения количества безопасных подключений? 50, 100?
Получил это решено. Однако ответ отличается от лучшего решения. Лучшее решение - это ответ от простей.
Что происходит, так это то, что вышеупомянутый 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
Почему бы вам не настроить свой Интернет и не использовать HTTP / 2 (возможно HTTPS)
Оба они используют одно мультиплексное соединение, а не несколько соединений в HTTP1.x. Методы сегментирования домена больше не нужны.