Mengapa NAT tidak mencadangkan port dari pool port TCP dan UDP mesin?


8

Saya membuat dua percobaan. Ini adalah jaringan untuk keduanya:

        [private network]     [public network]
    A -------------------- R ----------------- B
192.168.0.5     192.168.0.1|192.0.2.1       192.0.2.8

Sebuah 's default gateway R . R memiliki penerusan IPv4 aktif dan aturan iptables berikut:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 50000

Maksudnya adalah, apa pun TCP dari A akan ditutup sebagai 192.0.2.1 menggunakan port R 50000.

Saya menerbitkan layanan TCP pada port 60000 menggunakan B menggunakan nc -4l 192.0.2.8 60000.

Lalu saya membuka koneksi dari A :nc -4 192.0.2.8 60000

A mulai mengirim paket yang terlihat seperti ini:

192.168.0.5:53269 -> 192.0.2.8:60000

R menerjemahkannya menjadi

192.0.2.1:50000 -> 192.0.2.8:60000

Sejauh ini bagus.

Saya kemudian mencoba untuk membuka klien berikut pada R : nc -4 192.0.2.8 60000 -p 50000. Saya mengirim pesan, tidak ada yang terjadi. Tidak ada paket yang bisa dilihat di tcpdump R.

Karena aturan masquerade ada, atau setidaknya karena itu aktif, saya akan mengharapkan R 's nc gagal dengan pesan kesalahan "nc: Alamat sudah digunakan", yang adalah apa yang terjadi jika saya mengikat dua ncs ke port yang sama.

Saya kemudian menunggu sebentar sehingga pemetaan conntrack akan mati.

Percobaan kedua terdiri atas saya mencoba membuka klien R terlebih dahulu. R mulai berbicara dengan B baik-baik saja. Jika saya kemudian membuka koneksi dari A , paket-paketnya diabaikan. Sebuah SYNs 's tiba di R , tapi mereka tidak menjawab, bahkan tidak oleh kesalahan ICMP. Saya tidak tahu apakah ini karena R tahu kehabisan port masquerading atau karena Linux hanya bingung (itu secara teknis menutupi port tetapi koneksi yang sudah ada entah bagaimana mengganggu).

Saya merasa perilaku NAT salah. Saya tidak sengaja dapat mengkonfigurasi port untuk penyamaran (terutama, dengan tidak menentukan --to-portsselama aturan iptables) dan sebuah layanan, dan kernel akan menjatuhkan koneksi secara diam-diam. Saya juga tidak melihat ini didokumentasikan di mana pun.

Sebagai contoh:

  • Sebuah membuat permintaan normal B . Masker R menggunakan port 50k.
  • Sebuah membuat query DNS untuk R . Menjadi bahwa T adalah rekursif, R (menggunakan, karena kebetulan belaka, port fana 50k) menanyakan nameserver otoritatif Z pada port 53.

Tabrakan baru saja terjadi; R sekarang menggunakan port 50k untuk dua koneksi TCP yang terpisah.

Saya kira itu karena Anda biasanya tidak mempublikasikan layanan pada router. Tetapi sekali lagi, apakah itu akan menyakiti kernel untuk "meminjam" port dari pool port TCP ketika ia secara aktif disamarkan?

Saya tahu bahwa saya dapat memisahkan porta fana dari porta saya --to-ports. Namun, ini tampaknya bukan perilaku default. Baik NAT dan porta fana standar ke 32768-61000, yang menyeramkan.

(Saya menemukan rentang sementara dengan query / proc / sys / net / ipv4 / ip_local_port_range, dan kisaran NAT hanya dengan NATting banyak permintaan UDP dalam percobaan terpisah - dan mencetak port sumber di sisi server. Saya tidak dapat menemukan cara untuk mencetak rentang menggunakan iptables.)


2
Mengapa menyeramkan bahwa NAT menggunakan rentang port ethemeral? Jika klien pada A menggunakan port etemeral yang juga digunakan pada R, itu akan di-NATed ke yang baru. Dan mengapa memiliki layanan seperti DNS atau DHCP di R harus melakukan sesuatu dengan ini? DNS dan DHCP tidak menggunakan porta fana (di sisi server). Dan mengapa hanya menggunakan satu port saja untuk menyamar?
Thomas Erker

@ Thomas: Pertanyaan Anda benar-benar membawa saya ke arah yang benar, dan saya sangat berterima kasih, tetapi tampaknya Anda juga memiliki sedikit kesalahpahaman: Jika klien di A menggunakan porta fana juga digunakan pada R, itu tidak selalu dapatkan NATed ke yang baru; NAT tidak menanyakan pool port TCP / UDP. Saya benar-benar memperhatikan bertabrakan koneksi NAT normal dan tidak berbahaya; lihat jawaban saya.
Yd Ahhrk

@ Thomas: Saya tidak memikirkan DHCP; Saya sebenarnya berpikir tentang DNS. Saya membayangkan DNS menggunakan port ephemeral jika itu nameserver rekursif (untuk meminta yang otoritatif); lihat hasil edit saya.
Yd Ahhrk

@ Thomas: Seluruh percobaan dimaksudkan untuk melihat apa yang terjadi ketika ada tabrakan; Saya mengurangi rentang fana menjadi satu port tunggal untuk memaksa tabrakan.
Yd Ahhrk

Jawaban:


2

apakah itu akan menyakiti kernel untuk "meminjam" port dari pool port TCP ketika ia secara aktif disamarkan?

Saya kira jawabannya adalah "tidak, tapi itu tidak masalah."

Saya salah berasumsi R hanya menggunakan alamat transport tujuan dari paket respons untuk mengetahui apakah paket itu menuju ke A atau dirinya sendiri. Tampaknya benar-benar menggunakan seluruh alamat transportasi sumber-tujuan tuple untuk mengidentifikasi koneksi. Oleh karena itu, sebenarnya normal bagi NAT untuk membuat beberapa koneksi menggunakan port ( milik R ) yang sama; itu tidak membuat kebingungan. Akibatnya, kumpulan port TCP / UDP tidak penting.

Sudah cukup jelas sekarang saya memikirkannya.

Saya kemudian mencoba untuk membuka klien berikut pada R : nc -4 192.0.2.8 60000 -p 50000. Saya mengirim pesan, tidak ada yang terjadi. Tidak ada paket yang bisa dilihat di tcpdump R.

Ini adalah bagian dari eksperimen tempat saya mengacau.

Kegagalan terjadi karena alamat pengangkutan sumber dan tujuan sama, bukan hanya karena alamat sumbernya sama.

Jika saya lakukan, katakanlah nc -4 192.0.2.8 60001 -p 50000, itu benar-benar berfungsi. Bahkan jika itu menggunakan port yang sama dengan topeng NAT.

Saya merasa perilaku NAT salah. Saya tidak sengaja dapat mengkonfigurasi port untuk penyamaran (terutama, dengan tidak menentukan --to-portsselama aturan iptables) dan sebuah layanan, dan kernel akan menjatuhkan koneksi secara diam-diam.

Tidak akan, karena koneksi bertopeng dan koneksi R- mulai kemungkinan besar akan memiliki tujuan yang berbeda.

Karena aturan masquerade ada, atau setidaknya karena itu aktif, saya akan mengharapkan R 's nc gagal dengan pesan kesalahan "nc: Alamat sudah digunakan", yang adalah apa yang terjadi jika saya mengikat dua ncs ke port yang sama.

Saya masih mencari jawaban anti peluru untuk ini, tetapi semuanya tampaknya menunjuk ke "ini adalah konsekuensi buruk dari bagaimana itu diterapkan, dan itu sangat kecil kami bersedia untuk hidup dengannya."

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.