Kelelahan port jaringan Linux


10

Saya telah melakukan penelitian sebanyak mungkin tentang hal ini tanpa menggali langsung dari sumber kernel. Tampaknya ada sejumlah besar informasi yang salah / informasi yang salah pada subjek, jadi saya harap ini menjawab pertanyaan untuk saya dan orang lain sekali dan untuk semua.

Sebenarnya IPv4 berbicara, apakah port exhaustion sebenarnya mungkin? Biarkan saya jelaskan:

  • Tampaknya ada 65.535 port yang tersedia untuk digunakan. 0 tidak tersedia.
  • Saya telah membaca bahwa port exhaustion memerlukan tuple (src ip, src port, dst ip, dst port) menjadi unik.
  • Agar lebih jelas dan anggap saya dapat menggunakan 100% porta sesaat melalui pengaturan sysctl net.ipv4.ip_local_port_range

Dan ini pertanyaannya: Apakah ini cara kerjanya?

  • Saya bisa memiliki koneksi 65k dari 127.0.0.1:(x) ke 127.0.0.1:80
  • Saya dapat memiliki koneksi 65k dari 127.0.0.1:(x) ke 127.0.0.1-555
  • Pada dasarnya sekali lagi, pertanyaannya adalah (srcip, srcport, dstip, dstport) harus unik, betul?
  • Saya tidak bisa membuka lebih dari 65k koneksi dari ip "A" ke IP "B", Port "N"
  • Demikian juga, satu IP tidak dapat membuka lebih dari 65k koneksi ke server web saya di xxxx: 80, namun saya dapat mendukung lebih dari 65k secara keseluruhan selama mereka berasal dari IP sumber yang berbeda ?

Akhirnya, saya sedikit bingung tentang port fana (keluar) dan port masuk yang sedang mendengarkan. Saya menyadari begitu koneksi dibuat, masing-masing sisi koneksi adalah peer dan sama, tetapi sebelum itu terjadi:

Misalnya, jika memang tuple (srcip, srcport, dstip, dstport) harus unik, mengapa jika saya aktifkan, misalnya

net.ipv4.ip_local_port_range = 1024 65535

Yang memungkinkan penggunaan port fana dari 1024-65535, bahwa jika saya memiliki layanan yang mengikat pada port 3306 (mySQL, misalnya), mereka kadang-kadang gagal memulai karena port sedang digunakan.

Apakah ini mengaitkan fakta bahwa: (Dan ini adalah pernyataan yang saya minta untuk divalidasi):

  • (srcip, srcport, dstip, dstport) diperlukan untuk menjadi unik untuk setiap koneksi dengan kisaran port 1-65535 (tidak memperhatikan penggunaan OS port sesaat OS)
  • Namun, untuk soket mengikat, itu bisa dilihat sebagai (srcip, srcport, *, *). Atau cara lain untuk mengatakan ini, apakah IP tidak boleh menggunakan port itu untuk alasan apa pun untuk diikat?

Saya dapat memverifikasi perilaku di atas, yaitu saya menggunakan baris sysctl yang tepat di atas, dan karenanya saya memindahkan mySQL ke port yang lebih rendah dari 1024 karena kadang-kadang dan secara acak gagal me-restart karena dengan asumsi OS menggunakan port itu (3306) untuk port fana.


Saya memperbarui jawaban saya dengan informasi lebih lanjut. Jangan ragu untuk menjawab dengan pertanyaan apa pun.
89c3b1b8-b1ae-11e6-b842-48d705

Jawaban:


8

Anda memiliki dua pertanyaan utama di sini:

1.

Sebenarnya IPv4 berbicara, apakah port exhaustion sebenarnya mungkin?

Iya. Sebagai contoh, ambil router penyeimbang beban yang mengirim semua koneksi ke alamat IP NAT. Ini mungkin terjadi ketika Anda memiliki banyak SRC IPkoneksi ke bottleneck dari satu DST IP.

Ini berarti server web Anda dapat memiliki banyak koneksi seperti:

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

dan itu baik-baik saja. Namun, jika semua 'Alamat Asing' sama, ini dapat menyebabkan masalah (mis. 'Router besar yang menjalankan server NAT <---> dengan satu alamat IP').

Jika saya harus mendalilkan mengapa kelelahan porta singkat bukan masalah yang umum, saya sarankan itu karena setiap port membutuhkan layanan mendengarkan dan sumber daya yang cukup untuk merespon - sumber daya lain (memori, cpu) biasanya menjadi hambatan pertama.

Namun, saya pribadi menemukan beberapa masalah kelelahan pelabuhan saat bekerja di perusahaan penyeimbang beban.

2. Mengapa port bekas dapat menghadirkan masalah untuk layanan mendengarkan?

"Yang memungkinkan penggunaan port fana dari 1024-65535, bahwa jika saya memiliki layanan yang mengikat pada port 3306 (mySQL, misalnya), mereka kadang-kadang gagal memulai karena port sedang digunakan."

Server mySQL tidak dapat mengikat ke port itu jika sedang digunakan - katakan oleh localhost: 3306 atau pada semua antarmuka. Misalnya, lihat baris 0.0.0.0:80 di netstatoutput berikut ?

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

Itu berarti bahwa port 80 mendengarkan semua antarmuka lokal ke server. Jika proses lain memegang port 80 sebelum nginxserver saya mulai, nginxtidak akan dapat mengendalikan port itu dan kemungkinan akan gagal prosedur startup-nya.

Biasanya, port 3306 baik-baik saja karena layanan mendengarkan memiliki port yang telah ditentukan (atau rentang) yang diminta dari mesin host - misalnya port 80 dan 443 untuk server web.


0

Saya dapat memiliki koneksi 65k dari 127.0.0.1:(x) ke 127.0.0.1:80 Saya bisa memiliki koneksi 65k dari 127.0.0.1:(x) ke 127.0.0.1.15555

a: ya, jika port lokal Anda adalah 1-65535, jumlah koneksi adalah 65k-1 (satu port mendengarkan)

Pada dasarnya sekali lagi, pertanyaannya adalah (srcip, srcport, dstip, dstport) harus unik, betul? a: ya

Saya tidak bisa membuka lebih dari 65k koneksi dari ip "A" ke IP "B", Port "N" Demikian juga, satu IP tidak bisa membuka lebih dari 65k koneksi ke server web saya di xxxx: 80, namun saya bisa mendukung lebih banyak lagi dari 65k keseluruhan selama mereka berasal dari IP sumber yang berbeda?

a: Satu IP tidak dapat membuka lebih dari 65k koneksi ke server web saya di xxxx: 80, karena srcip, srcport, dstip, dstport adalah unik. ya Anda bisa mendukung lebih dari 65k, jika ip soruce berbeda

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.