Pertanyaan TCP Lubang Punch (NAT Traversal) Perpustakaan atau sesuatu?


Saya ingin melakukan TCP Hole Punching (NAT Traversal) di C #. Ini bisa dilakukan dengan server rendezvous jika diperlukan. saya menemukan http://sharpstunt.codeplex.com/ tetapi tidak bisa membuat ini berfungsi. Idealnya saya perlu beberapa metode yang saya berikan Nomor Port (int) sebagai parameter yang setelah panggilan ke metode ini tersedia ("Port Forwarded") di NAT. Akan baik juga jika metode hanya mengembalikan beberapa nomor port yang kemudian tersedia di NAT. Ada yang sudah melakukan ini di C #? Dapatkah Anda memberi saya contoh-contoh kerja untuk hal-hal tajam atau sesuatu yang lain?


32
2018-03-14 19:39


asal


Jawaban:


Dalam setiap skenario jaringan, meninju lubang TCP beroperasi dengan cara yang mirip dengan meninju lubang UDP. Misalnya, jika dua rekan A dan B berada di belakang NAT yang berbeda, setiap paket SYN pertama dari rekan yang dikirim ke rekan lain membuka lubang terkait dengan alamat publiknya di NAT masing-masing. Jika paket SYN pertama ke B mencapai B's NAT sebelum paket SYN pertama B ke A mencapai NAT B, B's NAT menganggap paket SYN A yang tidak diminta dan menjatuhkannya. Namun, setelah itu paket SIN pertama B dapat melakukan perjalanan melalui A’s NAT dengan sukses karena NAT A mengakui alamat publik B sebagai tujuan sesi keluar yang telah dimulai oleh A.

Jadi iya. Itu mungkin untuk TCP holepunch. Saya tidak mengerti mengapa ada orang yang berpikir sebaliknya.

Juga, bisakah Anda tidak membuat jenis bahaviour ini secara manual? Tidak perlu bergantung pada protokol khusus apa pun selama langkah-langkahnya sama untuk mengumpulkan semua informasi yang diperlukan.

Secara umum, meninju lubang TCP (3.2.1) memproses sebagai berikut:

Klien: A, B Server: S

• A menggunakan koneksi dengan S untuk meminta S untuk koneksi dengan B. • S membalas A dengan alamat pribadi dan publik B, dan secara bersamaan mengirimkan alamat A ke B.

• A dan B secara asynchronous melakukan koneksi keluar pada- menggoda (mengirim paket SYN) ke publik satu sama lain dan alamat pribadi, dari port yang sama yang mereka gunakan untuk mendaftar dengan S. Pada saat yang sama, mereka mendengarkannya Koneksi masuk TCP mencoba pada TCP lokal mereka port

• A dan B menunggu respons SYN-ACK terhadap output mereka akan paket SYN, atau permintaan koneksi masuk (Paket SYN). Jika koneksi gagal, rekan dapat mencoba lagi hingga batas waktu maksimum.

• Setelah proses handshake tiga arah selesai, teman sebaya saling mengautentikasi. Jika otentikasi tion gagal, rekan-rekan menutup hubungan itu dan menunggu sampai koneksi lain berhasil diautentikasi. Itu Koneksi yang berhasil diautentikasi pertama akan digunakan untuk mentransfer data TCP.

(Saya tahu ini tidak banyak jawaban tetapi tidak ada cukup ruang untuk komentar).


17
2018-06-04 19:52



Kedengarannya seperti Anda mungkin mendapatkan TCP dan UDP bercampur. TCP adalah protokol berorientasi koneksi, mudah dipahami oleh firewall dan router, dan membutuhkan satu inisiator (klien) dan satu pendengar (server). Jika klien dan server berada di belakang firewall atau NAT, Anda tidak dapat melubangi tanpa menghubungkan keduanya ke beberapa server proxy (yang tidak firewall). Masalah dengan ini adalah bahwa kemudian proxy akan bertanggung jawab untuk menyampaikan semua lalu lintas mereka.

Dari pertanyaan Anda, kedengarannya seperti Anda lebih tertarik pada meninju lubang UDP, yang mengeksploitasi lemak yang UDP tanpa kewarganegaraan, dan tidak berorientasi koneksi. Oleh karena itu, kebanyakan firewall pelacakan negara akan membuat "tebakan terbaik" tentang aliran data UDP, dan menganggap bahwa lalu lintas yang keluar di port tertentu akan menerima balasan pada port yang sama, dan secara otomatis mengarahkannya kembali. Jika, menggunakan beberapa sarana di luar saluran (seperti server TCP yang hanya melewatkan alamat dan bukan data), kedua peer dapat mentransmisikan data satu sama lain di port yang sama, masing-masing firewall / router NAT akan membuka lubang yang memungkinkan lalu lintas masuk.

Adapun cara melakukannya, semuanya tergantung pada bagaimana Anda akan mendapatkan alamat IP dari rekan-rekan satu sama lain. Setelah Anda memilikinya, cukup mulai transmisi paket UDP pada port yang disetujui, dan tunggu balasannya.


2
2017-07-08 18:09



Kami mengumpulkan sebuah perpustakaan yang disebut IceLink yang melakukan P2P streaming menggunakan ICE / STUN / TURN dengan NAT traversal penuh. STUN berbasis lubang-meninju bekerja untuk sebagian besar router untuk membuat sambungan langsung antara rekan-rekan, dan untuk "buruk" router di luar sana, koneksi kembali ke relay berbasis TURN.


2
2017-12-04 23:06



Pertanyaannya cukup lama tetapi bagi siapa saja yang mencari solusi, Anda harus melihat pada Proyek Open.NAT itu sangat mudah digunakan dan bekerja dengan UPNP dan PMP NAT!

Katakanlah Anda ingin memajukan Port 1700 eksternal ke port lokal 1600, yang harus Anda lakukan hanyalah:

var discoverer = new NatDiscoverer();
var device = await discoverer.DiscoverDeviceAsync();
await device.CreatePortMapAsync(new Mapping(Protocol.Tcp, 1600, 1700, "The mapping name"));

Anda juga dapat mendaftarkan semua pemetaan yang ada, sehingga Anda dapat memvalidasi bahwa port Anda belum digunakan.

var sb = new StringBuilder();
var ip = await device.GetExternalIPAsync();

sb.AppendFormat("\nAdded mapping: {0}:1700 -> 127.0.0.1:1600\n", ip);
sb.AppendFormat("\n+------+-------------------------------+--------------------------------+------------------------------------+-------------------------+");
sb.AppendFormat("\n| PROT | PUBLIC (Reacheable)           | PRIVATE (Your computer)        | Descriptopn                        |                         |");
sb.AppendFormat("\n+------+----------------------+--------+-----------------------+--------+------------------------------------+-------------------------+");
sb.AppendFormat("\n|      | IP Address           | Port   | IP Address            | Port   |                                    | Expires                 |");
sb.AppendFormat("\n+------+----------------------+--------+-----------------------+--------+------------------------------------+-------------------------+");
foreach (var mapping in await device.GetAllMappingsAsync())
{
    sb.AppendFormat("\n|  {5} | {0,-20} | {1,6} | {2,-21} | {3,6} | {4,-35}|{6,25}|",
        ip, mapping.PublicPort, mapping.PrivateIP, mapping.PrivatePort, mapping.Description, mapping.Protocol == Protocol.Tcp ? "TCP" : "UDP", mapping.Expiration.ToLocalTime());
}
sb.AppendFormat("\n+------+----------------------+--------+-----------------------+--------+------------------------------------+-------------------------+");
Console.WriteLine(sb.ToString());

Ada juga posting blog tentang NAT Traversal di MSDN: https://blogs.msdn.microsoft.com/ncl/2009/07/27/end-to-end-connectivity-with-nat-traversal/


2
2018-05-18 18:28



http://sipsorcery.codeplex.com memiliki server stun yang berfungsi.

SipSorcery.core -> SipSorcery.Net -> Stun


1
2018-04-26 11:00



Saya tidak akrab dengan topik Anda, tetapi saya kebetulan tahu P2PVPN open source, yang menggunakan lib untuk melakukan NAT. Anda dapat memeriksanya di sini (www.SocialVPN.org).

Semoga berhasil.


0
2018-04-23 08:02