Închiriem spațiu de adrese IPV4 (subrețele) de la câțiva ISP-uri. Subrețelele sunt direcționate către ferma noastră de servere prin tunelurile GRE.Ferma noastră de servere deservește conexiunile TCP de intrare. Nu controlăm configurarea terminației GRE la capătul ISP-ului. Nu rulăm un echilibrator de încărcare pentru serviciile proprietare.
Problema este că este prea mult trafic care încearcă să vină peste tunelurile GRE. Ratele de pierdere a pachetelor sunt adesea de 1%, 2% sau mult mai mari, în funcție de tunelul GRE. Am încercat să folosim funcția iptables hash limit, să punem pachete SYN (noi solicitări de conexiune) în găleți după adresa IP sursă și să setăm limite arbitrare pe interval de timp pe gălețile fiecărui tunel [*]. Acest lucru a redus puțin ratele de pierdere a pachetelor pe unele tuneluri, dar ratele de pierdere a pachetelor de 1% sunt încă destul de proaste în rețelele moderne de centre de date.
Bănuiesc că soluția ideală este să facem limitarea ratei la capătul îndepărtat al tunelului GRE, deoarece cred că în momentul în care supraîncărcarea pachetelor ajunge la capătul nostru al tunelului GRE, deja provoacă o înfundare a rețelei. Cu toate acestea, nu controlăm configurația la capătul îndepărtat al tunelului.
Din cauza naturii serviciilor, este mai bine ca conexiunile TCP acceptate să fie gestionate eficient decât să se gestioneze mai multe conexiuni ineficient. Preferăm să renunțăm la conexiunile care nu pot fi gestionate rapid și să facem solicitantul să revină.
Care este cea mai bună abordare pe care o pot lua pentru a reduce rata de pierdere a pachetelor și pentru a îmbunătăți performanța funcțională a conexiunilor acceptate? Există vreo modalitate prin care pot trimite un semnal de control al congestiei înapoi prin tunelul GRE?
Configurația noastră de limitare a ratei iptables arată astfel:
# Creați un lanț de reguli de limită a ratei gol
iptables -t filtru -N GRE2_RATE_LIMIT
# Inserați regula pentru a redirecționa noi pachete de conexiune (pachete SYN) către acest lanț de reguli
iptables -t filter -I FORWARD -i gre2 -m conntrack --ctstate NEW -j GRE2_RATE_LIMIT
# Aplicați efectiv limita
# Acceptați pachete SYN până la o anumită rată
iptables -A GRE2_RATE_LIMIT -m hashlimit --hashlimit-mode srcip --hashlimit-upto rate/time --hashlimit-burst rate --hashlimit-name gre2_rate_limit -j ACCEPT
# Respinge orice altceva
iptables -A GRE2_RATE_LIMIT -p tcp -j REJECT --reject-with tcp-reset