mon problème : j'ai un processus créant plus de 10 000 connexions TCP vers la même adresse IP et le même port de destination par seconde. Après un court laps de temps, aucune nouvelle connexion ne peut plus être créée, car il n'y a plus de ports sources disponibles.

J'ai déjà essayé d'atténuer cela en définissant net.ipv4.ip_local_port_rangeet net.ipv4.tcp_fin_timeoutmais cela n'a pas résolu le problème.

Maintenant, ma pensée était la suivante: si je pouvais dire au noyau d'utiliser des adresses IP sources circulaires, je pourrais facilement ajouter plus d'adresses IP à ma seule interface et donc avoir une limite plus élevée de connexions sortantes.

J'ai essayé d'ajouter plusieurs routes vers la même destination via la même interface mais en spécifiant différentes adresses IP source :

ip route add default via 10.1.1.1 dev eth0 src 10.1.1.10
ip route add default via 10.1.1.1 dev eth0 src 10.1.1.11

Mais je reçois RTNETLINK answers: File exists.

Suis-je sur la bonne voie ici ? Est-ce que l'ajout d'une autre adresse IP source est "la voie à suivre" dans ces cas ?

Existe-t-il un moyen d'équilibrer l'utilisation des adresses IP source via le noyau d'une manière ou d'une autre?

Mon espoir était que si je réussissais à placer deux routes avec le même poids mais des adresses src différentes vers le même réseau, le noyau ferait un round robin.

(Contexte : j'exécute HAproxy sur cette machine et je dois équilibrer la charge de plus de 10 000 connexions vers un seul serveur principal)

answer

Pas facilement via le noyau, non.

I am running HAproxy on that machine and have to load balance more than 10k connections towards a single backend server

Vous pouvez indiquer à haproxy d'utiliser une adresse IP source spécifique pour les connexions sortantes vers un serveur, par exemple :

  server app1_s1 10.0.1.1:80 source 10.1.1.10
  server app1_s2 10.0.1.1:80 source 10.1.1.11
  server app2_s1 10.0.1.2:80 source 10.1.1.10
  server app2_s2 10.0.1.2:80 source 10.1.1.11

Vous ne le faites toujours pas. net.ipv4.ip_local_port_rangedevrait suffire même avec les paramètres par défaut. Donc je parie que soit vous avez bien plus de 10 000 connexions, soit vous le diagnostiquez mal.

Vous voyez, le quadruplet "ipsrc:port ipdst:port" est unique dans toute la pile IP de la machine, et puisque le nombre total de ports dans une pile réseau est de 65536, cela vous donne la possibilité d'avoir 65536 connexions en théorie. D'accord, nous avons moins le bloc WKS (-1024), mais cela vous a quand même donné 55536 connexions avec un fichier falsifié net.ipv4.ip_local_port_range. Vous devez utiliser les adresses IP/interfaces supplémentaires uniquement si vous avez besoin de plus que cela.

Et généralement, ce problème est résolu en ajoutant plus d'adresses IP client et/ou d'adresses IP serveur si la destination se trouve également à l'intérieur de votre pile, ou en utilisant plusieurs tables de routage si ce n'est pas le cas.