Перед лицом всплеска трафика: средства ограничения тока системного и программного уровня

Linux Nginx
Перед лицом всплеска трафика: средства ограничения тока системного и программного уровня

Если ❤️моя статья оказалась полезной, ставьте лайк и подписывайтесь. Это самый большой стимул для меня продолжать техническое творчество.

Эта статья应对突防流量Серия статей, ниже приведены основные статьи о друзьях.

Введение

Что самое ценное в век информации? Информация и трафик, разные формы производства контента не являются содержанием этой статьи, поэтому поговорим о трафике.

Веб-сайты и СМИ гоняются за горячими точками и гоняются за трафиком, но иногда увеличение трафика не всегда хорошо. Всплеск посещаемости сайта приводит к следующим ситуациям

  1. Сайт злонамеренно взломан
  2. Данные обхода CDN обратно к источнику
  3. Совместная бизнес-платформа извлекает данные платформы и т. д.
  4. Внезапная вспышка социальных горячих точек
  5. Продвижение маркетинговых активностей

4, 5 Трафик, который нравится веб-сайту; 2, 3 относятся к деловому сотрудничеству; только пункт 1 нуждается в защите

Но перед тем, как мы начнем, нужно внести ясность Я разделил компьютерный зал на две части.云机房,自建机房.

  • Внешний бизнес развернут в云机房Это относительно безопасно, потому что у производителя больше ресурсов (добавление машин, расширение емкости, увеличение пропускной способности) и вспомогательных решений (изменение IP/дополнительной защиты) для борьбы с колебаниями трафика и атаками трафика.
  • 自建机房Обычно используется во внутренней системе компании, сборе бизнес-данных, статистическом хранении. Благодаря белому списку IP-адресов только ваш собственный облачный сервер может получить доступ к самостоятельно построенному компьютерному залу. тем самым снижая вероятность нападения

Эта статья предназначена для того, чтобы отсортировать и записать методы, которые я собрал после прояснения вопросов. Может быть позже骚操作использовал это

iptables ограничивает ip/port

Ограничить количество одновременных подключений к указанному порту

введите командуservice iptables stopОтключите iptables (примечание: с iptables могут быть проблемы, кажется, в старых версиях он считается не службой, а брандмауэром)

Ограничить количество одновременных портов очень просто, IPTABLES может это сделать, если вы хотите限制端口8388的IP最大连接数5;限制端口1024-10240的IP最大连接数Команда из двух предложений:

iptables -I INPUT -p tcp --dport 8388 -m connlimit --connlimit-above 5 -j DROP
iptables -I OUTPUT -p tcp --dport 8388 -m connlimit --connlimit-above 5 -j DROP

iptables -I INPUT -p tcp --dport 1024:10240 -m connlimit --connlimit-above 10 -j DROP
iptables -I OUTPUT -p tcp --dport 1024:10240 -m connlimit --connlimit-above 10 -j DROP

Другие порты и т. д., а затем сохраните правила IPTABLES.service iptables save.

введите командуservice iptables startПросто начни

Наконец, используйте команду, чтобы увидеть, работает ли онаiptables -L -n -v

Ограничить скорость передачи указанного порта

введите командуservice iptables stopзакрыть iptables

Ограничить количество одновременных портов очень просто. IPTABLES может это сделать. Предположим, вы хотите ограничить максимальную скорость соединения порта 5037 до 60 пакетов в секунду. Команда из двух предложений:

iptables -A INPUT -p tcp --sport 5037 -m limit --limit 60/s -j ACCEPT
iptables -A INPUT -p tcp --sport 5037 -j DROP

То есть он ограничен до 60 пакетов в секунду, и обычно размер каждого пакета составляет 64-1518 байт (байт).

Ограничить скорость доступа по IP

Принцип: контроль скорости определенных портов в секунду, например прямой DROP более 700 пакетов в секунду, тем самым ограничивая скорость определенных портов

iptables -A FORWARD -m limit -d 208.8.14.53 --limit 700/s --limit-burst 100 -j ACCEPT 
iptables -A FORWARD -d 208.8.14.53 -j DROP

Ограничение трафика через iptables под Linux

Этого можно добиться с помощью следующего сценария (сначала необходимо настроить машину как шлюз). Простой пример скрипта приведен ниже:

#限制网段
for ((i = 1; i < 253; i++))  
do
/sbin/iptables -A FORWARD -s 192.168.2.$i -m limit \ --limit 60/s -j ACCEPT 
/sbin/iptables -A FORWARD -s 192.168.2.$i -j DROP

done
#限制单个ip 
/sbin/iptables -A FORWARD -s 192.168.1.135/32 -m limit \ --limit 60/s -j ACCEPT 
/sbin/iptables -A FORWARD -s 192.168.1.135/32 -j DROP 
  
#当流量小于60/s的时候,iptables 接受并转发。当流量大于60/s 的时候,iptables丢弃数据包

Напоследок поговорим о том, как решить проблему сбоя брандмауэра после перезапуска.

iptables-save >/etc/sysconfig/iptables echo 'iptables-restore /etc/sysconfig/iptables' >> /etc/rc.local chmod +x /etc/rc.d/rc.local

текущий лимит nginx

Ограничение скорости для доменных имен

Модуль ngx_http_limit_req_module предоставляет возможность ограничить скорость обработки запросов, используя алгоритм дырявого ведра. В следующем примере используются две директивы nginx limit_req_zone и limit_req для ограничения скорости обработки запросов одного IP-адреса.

Добавьте текущую конфигурацию ограничения в nginx.conf http:

Формат: limit_req_zone скорость ключевой зоны

http {
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=10r/s;
}

Настройте сервер и используйте директиву limit_req для применения текущего ограничения.

server {
    location / {
		limit_req zone=myRateLimit;
        proxy_pass http://my_upstream;
    }
}
  • key : определяет текущий объект ограничения, binary_remote_addr — это ключ, который указывает, что ток ограничен на основе remote_addr (IP-адрес клиента), а цель binary_ — сжать объем памяти.
  • zone: определите общую область памяти для хранения информации о доступе, myRateLimit:10m представляет область памяти размером 10M и именем myRateLimit. 1M может хранить информацию о доступе к IP-адресу 16000, 10M может хранить информацию о доступе к IP-адресу 16W.
  • rate используется для установки максимальной скорости доступа, rate=10r/s означает обработку до 10 запросов в секунду. Nginx фактически отслеживает информацию о запросах с точностью до миллисекунды, поэтому 10r/s — это предел: один запрос обрабатывается каждые 100 мс. Это означает, что если другой запрос поступит в течение 100 миллисекунд после обработки последнего запроса, он откажется обрабатывать запрос.

обрабатывать пакетный трафик

В приведенном выше примере ограничение составляет 10 р/с. Если нормальный трафик внезапно увеличится, избыточные запросы будут отклонены, а пакетный трафик не может быть обработан. Эту проблему можно решить с помощью параметра пакетного трафика.

server {
    location / {
		limit_req zone=myRateLimit burst=20;
        proxy_pass http://my_upstream;
    }
}

Burst переводится как всплеск, всплеск, обозначающий количество дополнительных запросов, которые можно обработать после превышения установленной скорости обработки. При скорости=10р/с 1с разбивается на 10, то есть 1 запрос может обрабатываться каждые 100мс.

Здесь **burst=20**, если одновременно поступит 21 запрос, Nginx обработает первый запрос, остальные 20 запросов будут поставлены в очередь, а затем каждые 100 мс из очереди будет получаться запрос на обработка. Если количество запросов больше 21, он откажется обрабатывать лишние запросы и напрямую вернет 503.

Однако использование одного только параметра пакетной передачи нецелесообразно. При Burst=50 скорость все равно 10р/с, хотя 50 запросов в очереди будут обрабатываться каждые 100мс, но 50-й запрос нужно ждать 50*100мс или 5с, такое долгое время обработки естественно неприемлемо.

Поэтому Burst часто используется в сочетании с Nodelay.

server {
    location / {
		limit_req zone=myRateLimit burst=20 nodelay;
        proxy_pass http://my_upstream;
    }
}

nodelay для параметра пакета, Burst=20 nodelay означает, что эти 20 запросов обрабатываются немедленно и не могут быть отложены, что эквивалентно специальной обработке. Однако, даже если эти 20 пакетных запросов обрабатываются немедленно, последующие запросы не будут обрабатываться немедленно. Burst=20 эквивалентно занятию 20 питов в очереди кеша, даже если запрос обрабатывается, эти 20 позиций могут освобождаться только каждые 100 мс.

Это обеспечивает эффект стабильной скорости, но при этом можно нормально обрабатывать внезапный трафик.

Ограничьте количество подключений

ngx_http_limit_conn_module предоставляет возможность ограничить количество подключений с помощью директив limit_conn_zone и limit_conn. Вот официальный пример Nginx:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}

Ключ limit_conn perip 10 — $binary_remote_addr, что означает, что один IP-адрес может поддерживать до 10 подключений одновременно.

Ключом limit_conn perserver 100 является $server_name, которое указывает общее количество одновременных подключений, которые виртуальный хост (сервер) может обрабатывать одновременно.

Следует отметить, что это соединение учитывается только тогда, когда заголовок запроса обрабатывается внутренним сервером.

Ограничение скорости на пути к сайту (нисходящая ссылка)

Найдите файл конфигурации nginx nginx.conf

[root@localhost ~]# find ./ -name "nginx*"
[root@localhost ~]# whereis nginx
nginx: /usr/local/nginx

Редактировать с помощью вим


		......
server {
		......
        location / {
        	#表示每个连接允许的速率为1Mbit,最大连接数10个
        	limit_conn one 10;
            limit_rate 1m;
        	···
        }
        location ~/group([0-9])/ {
    			···
            #表示在不限流10Mbit后开始限流
            limit_rate_after 10m;
            #限流后的网速
            limit_rate 2m;
            ····
       }
}       

Перезагрузите файл конфигурации после изменения файла nginx.conf.

[root@localhost /]# /usr/local/nginx/sbin/nginx -s reload ngx_http_fastdfs_set pid=7988

Настроить белый список

Текущее ограничение в основном предназначено для внешнего доступа, а доступ к внутренней сети относительно безопасен. Вы можете установить белый список без ограничения тока. Используйте Nginxngx_http_geo_moduleа такжеngx_http_map_moduleМожно сделать два инструментальных модуля.

существуетnginx.confизhttpНастройте белый список в разделе:

geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/24 0;
    172.20.0.35 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;

geo вернет 0 для белых списков (подсети или IP-адреса в порядке) и 1 для других IP-адресов.

map преобразует limit в limit в limit_key, если $limit равен 0 (белый список), он возвращает пустую строку; если он равен 1, он возвращает фактический IP-адрес клиента.

Текущий ограничивающий ключ limit_req_zone больше использует не binaryremoteaddr, а binary_remote_addr, а binaryremoteaddr, но limit_key для динамического получения значения. Если это белый список, то текущий ограничивающий ключ limit_req_zone представляет собой пустую строку, и ток не будет ограничен, если это не белый список, текущее ограничение будет выполняться на реальном IP клиента.

Ограничение скорости

Помимо ограничения тока,ngx_http_core_moduleТакже предоставляет возможность ограничить скорость передачи данных (также известную как скорость загрузки).

Например:

location /flv/ {
    flv;
    limit_rate_after 20m;
    limit_rate       100k;
}

Это ограничение для каждого запроса, что означает, что клиент скачивает первые 20M без ограничения скорости, а последующее ограничение составляет 100kb/s.