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-ports
selama 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.)