Der TCP-Port der Debian Stretch-Quelle ist * immer * gerade

9

Beim Debuggen eines seltsamen Verhaltens mit einem Azure-Load-Balancer stellte ich fest, dass mein lokaler Debian Stretch-TCP-Stack nur TCP-Verbindungen mit einem geradzahligen Port herstellte. Ich starte keinen einzelnen TCP-Handshake mit einem ungeraden Quellport. Ist das beabsichtigt?

Olivier Dauby
quelle

Antworten:

12

Es ist, um Konflikte zwischen connect()und zu reduzieren bind()(erschien in Linux 4.2; Jessie hat 3.16 und Stretch hat 4.9):

Commit 07f4c90062f8fc7c8c26f8f95324cbe8fa3145a5
Verfasser: Eric Dumazet 
Datum: So 24. Mai 14:49:35 2015 -0700

    tcp / dccp: versuche ip_local_port_range in connect () nicht zu erschöpfen

    Ein langjähriges Problem auf ausgelasteten Servern ist der winzige verfügbare TCP-Port
    Bereich (/ proc / sys / net / ipv4 / ip_local_port_range) und die Standardeinstellung
    Sequentielle Zuweisung von Quellports im Systemaufruf connect ().

    Wenn ein Host viele aktive TCP-Sitzungen hat, sind die Chancen groß
    sehr hoch, dass alle Ports von mindestens einem Fluss verwendet werden,
    und nachfolgende Bindungsversuche (0) schlagen fehl oder müssen einen großen Teil von scannen
    Platz, um einen Steckplatz zu finden.

    In diesem Patch habe ich den Startpunkt in __inet_hash_connect () geändert.
    so dass wir versuchen, gerade [1] Ports zu bevorzugen und ungerade Ports für bind () zu lassen
    Benutzer.

    Wir führen immer noch eine sequentielle Suche durch, daher gibt es aber keine Garantie
    Wenn die Ziele von connect () sehr unterschiedlich sind, verlassen wir sie
    Weitere Ports stehen für bind () zur Verfügung, und wir verteilen sie über den gesamten Bereich.
    Verringern der Zeit für connect () und bind (), um einen Steckplatz zu finden.

    Diese Strategie funktioniert nur gut, wenn / proc / sys / net / ipv4 / ip_local_port_range
    ist gerade, dh wenn Start- / Endwerte unterschiedliche Parität haben.

    Daher wurde der Standardwert / proc / sys / net / ipv4 / ip_local_port_range in geändert
    32768 - 60999 (anstelle von 32768 - 61000)

    An Sicherheitsaspekten ändert sich hier nichts, nur ein schlechtes Hashing
    Systeme könnten letztendlich von dieser Änderung betroffen sein.

    [1]: Die ungerade / gerade Eigenschaft hängt von der Parität der ip_local_port_range-Werte ab

Möglicherweise möchten Sie auch das Follow-up- Commit 1580ab63fc9a03593072cc5656167a75c4f1d173 sehen .

Ferenc Wágner
quelle