Мы арендуем адресное пространство IPV4 (подсети) у пары интернет-провайдеров. Подсети направляются на нашу ферму серверов через туннели GRE.Наша ферма серверов обслуживает входящие соединения TCP. Мы не контролируем настройку терминации GRE на стороне провайдера. Мы не используем балансировщик нагрузки для проприетарных сервисов.
Проблема в том, что через туннели GRE проходит слишком много трафика. Уровень потери пакетов часто составляет 1%, 2% или намного выше в зависимости от туннеля GRE. Мы пытались использовать функцию ограничения хеша iptables, помещая пакеты SYN (новые запросы на подключение) в сегменты по исходному IP-адресу и устанавливая произвольные временные интервалы для сегментов каждого туннеля [*]. Это немного снизило уровень потери пакетов в некоторых туннелях, но уровень потери пакетов в 1% по-прежнему довольно плох в современных сетях центров обработки данных.
Я предполагаю, что идеальным решением является ограничение скорости на дальнем конце туннеля GRE, потому что я думаю, что к тому времени, когда перегрузка пакетов достигает нашего конца туннеля GRE, это уже вызывает засорение сети. Однако мы не контролируем установку в дальнем конце туннеля.
Из-за характера служб лучше, чтобы принятые TCP-соединения обрабатывались эффективно, чем неэффективно обрабатывалось большее количество соединений. Мы предпочитаем сбрасывать соединения, которые не могут быть обработаны быстро, и заставлять запросчика возвращаться.
Каков наилучший подход, который я могу предпринять, чтобы уменьшить скорость потери пакетов и улучшить функциональную производительность на принятых соединениях? Есть ли способ отправить сигнал управления перегрузкой обратно через туннель GRE?
Наша настройка ограничения скорости iptables выглядит так:
# Создать пустую цепочку правил ограничения скорости
iptables -t фильтр -N GRE2_RATE_LIMIT
# Вставить правило для пересылки новых пакетов подключения (пакетов SYN) в эту цепочку правил
iptables -t filter -I FORWARD -i gre2 -m conntrack --ctstate NEW -j GRE2_RATE_LIMIT
# Фактически применяем ограничение
# Принимать пакеты SYN до определенной скорости
iptables -A GRE2_RATE_LIMIT -m hashlimit --hashlimit-mode srcip --hashlimit-upto скорость/время --hashlimit-burst rate --hashlimit-name gre2_rate_limit -j ПРИНЯТЬ
# Отклонить все остальное
iptables -A GRE2_RATE_LIMIT -p tcp -j REJECT --reject-with-tcp-reset