
UDP स्ट्रीम को (नकली) TCP स्ट्रीम में बदलता है जो Layer 3 और Layer 4 (NAPT) फ़ायरवॉल/NATs से गुज़र सकती हैं।
एक हल्का और तेज़ UDP से TCP अस्पष्टकर्ता।
Rust केवल MIPS आधारित प्लेटफॉर्मों के लिए Tier 3 समर्थन प्रदान करता है 2023 से। Phantun के MIPS बिल्ड इसलिए नाइटली Rust टूलचेन का उपयोग करके बनाए गए हैं और केवल सर्वोत्तम प्रयास के आधार पर प्रदान किए जाते हैं।
Phantun एक परियोजना है जो UDP पैकेटों को TCP कनेक्शनों में अस्पष्ट करती है। इसका लक्ष्य न्यूनतम प्रसंस्करण और एनकैप्सुलेशन ओवरहेड के साथ अधिकतम प्रदर्शन प्राप्त करना है।
इसका उपयोग आमतौर पर ऐसे वातावरणों में किया जाता है जहाँ UDP अवरुद्ध/थ्रॉटल होता है लेकिन TCP की अनुमति है।
Phantun केवल UDP पैकेटों के एक स्ट्रीम को अस्पष्ट TCP स्ट्रीम पैकेटों में परिवर्तित करता है। Phantun द्वारा उपयोग किया जाने वाला TCP स्टैक अधिकांश L3/L4 स्टेटफुल/स्टेटलेस फ़ायरवॉल/NAT उपकरणों से गुज़रने के लिए डिज़ाइन किया गया है। यह L7 प्रॉक्सी से नहीं गुज़र पाएगा। हालाँकि, इस दृष्टिकोण का लाभ यह है कि TCP पर UDP के सामान्य प्रदर्शन हत्यारों जैसे पुनर्प्रेषण और प्रवाह नियंत्रण में से कोई भी नहीं होगा। अंतर्निहित UDP गुण जैसे ऑर्डर से बाहर वितरण पूरी तरह से संरक्षित रहते हैं, भले ही कनेक्शन फ़ायरवॉल/NAT उपकरणों के दृष्टिकोण से TCP कनेक्शन जैसा दिखता हो।
Phantun का अर्थ है फैंटम TUN, क्योंकि यह UDP ट्रैफ़िक के लिए एक अस्पष्टकर्ता है जो इसे स्टेटफुल फ़ायरवॉल/NAT से TCP पैकेट के रूप में पास कराने के लिए पर्याप्त कार्य करता है।
Phantun 100% सुरक्षित Rust में लिखा गया है। इसे मल्टी-कोर प्रणालियों पर अच्छी तरह से स्केल करने के लिए व्यापक रूप से अनुकूलित किया गया है और तेज़ कनेक्शन पर सभी उपलब्ध CPU संसाधनों को संतृप्त करने में कोई समस्या नहीं है। बेंचमार्किंग परिणामों के लिए प्रदर्शन अनुभाग देखें।

नीचे दिए गए उदाहरण के लिए, यह माना गया है कि Phantun सर्वर पोर्ट 4567 पर आने वाले Phantun क्लाइंट कनेक्शनों को सुनता है (सर्वर के लिए --local विकल्प), और यह UDP पैकेटों को 127.0.0.1:1234 पर UDP सर्वर को अग्रेषित करता है (सर्वर के लिए --remote विकल्प)।
यह भी माना गया है कि Phantun क्लाइंट 127.0.0.1:1234 (क्लाइंट के लिए --local विकल्प) पर आने वाले UDP पैकेटों को सुनता है और 10.0.0.1:4567 पर Phantun सर्वर से जुड़ता है (क्लाइंट के लिए --remote विकल्प)।
Phantun क्लाइंट और सर्वर दोनों के लिए TUN इंटरफ़ेस बनाता है। क्लाइंट के लिए, Phantun डिफ़ॉल्ट रूप से स्वयं को IP पता 192.168.200.2 और fcc8::2 प्रदान करता है। सर्वर के लिए, यह डिफ़ॉल्ट रूप से 192.168.201.2 और fcc9::2 प्रदान करता है। इसलिए, आपके कर्नेल में IPv4/IPv6 फ़ॉरवर्डिंग सक्षम होनी चाहिए और आपके भौतिक NIC पते और Phantun के Tun इंटरफ़ेस पते के बीच NAT के लिए उपयुक्त iptables/nftables नियम स्थापित होने चाहिए।
आप Phantun द्वारा बनाए गए Tun इंटरफ़ेस का नाम और निर्धारित पतों को अनुकूलित कर सकते हैं। कृपया उन्हें बदलने का तरीका देखने के लिए -h विकल्पों के साथ निष्पादन योग्य चलाएं।
इस नेटवर्क टोपोलॉजी को समझने में मदद करने का एक और तरीका (कृपया इस टोपोलॉजी के चित्रण के लिए ऊपर दिए गए आरेख को देखें):
Phantun क्लाइंट एक राउटर के पीछे निजी IP पते (192.168.200.2/fcc8::2) वाली मशीन की तरह है। इंटरनेट तक पहुँचने के लिए, आपको ट्रैफ़िक के NIC से बाहर निकलने से पहले निजी IP पते को SNAT करना होगा।
Phantun सर्वर एक राउटर के पीछे निजी IP पते (192.168.201.2/fcc9::2) वाले सर्वर की तरह है। इंटरनेट से इसे एक्सेस करने के लिए, आपको राउटर पर इसके सुनने वाले पोर्ट को DNAT करना होगा और गंतव्य IP पते को उस स्थान पर बदलना होगा जहाँ सर्वर आने वाले कनेक्शनों को सुन रहा है।
इन मामलों में, Phantun चलाने वाली मशीन/iptables "राउटर" के रूप में कार्य करती है जो Phantun को अपने निजी IP पतों का उपयोग करके बाहर से संवाद करने की अनुमति देती है।
Phantun v0.4.1 के अनुसार, IPv6 TCP और UDP दोनों पक्षों के लिए पूरी तरह से समर्थित है। IPv6 पता निर्दिष्ट करने के लिए, कमांड लाइन विकल्पों के साथ निम्न प्रारूप का उपयोग करें: [::1]:1234। AAAA रिकॉर्ड को हल करना भी समर्थित है। कृपया IPv6 व्यवहार को नियंत्रित करने के तरीके पर विस्तृत विकल्प देखने के लिए -h के साथ प्रोग्राम चलाएं।
/etc/sysctl.conf संपादित करें, net.ipv4.ip_forward=1 जोड़ें और sudo sysctl -p /etc/sysctl.conf चलाएं।
net.ipv6.conf.all.forwarding=1 भी सेट करना होगा।
क्लाइंट को केवल भौतिक इंटरफ़ेस पर SNAT सक्षम करने की आवश्यकता है ताकि Phantun का पता भौतिक नेटवर्क पर उपयोग किए जा सकने वाले पते में अनुवादित हो सके। यह केवल मास्करेड के साथ किया जा सकता है।
नोट: eth0 को वास्तविक भौतिक इंटरफ़ेस नाम से बदलें
table inet nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
iifname tun0 oif eth0 masquerade
}
}
नोट: उपरोक्त नियम तालिका परिवार प्रकार के रूप में inet का उपयोग करता है, इसलिए यह IPv4 और IPv6 दोनों उपयोग के साथ संगत है।
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
सर्वर को TCP सुनने वाले पोर्ट को Phantun के TUN इंटरफ़ेस पते पर DNAT करने की आवश्यकता है।
नोट: eth0 को वास्तविक भौतिक इंटरफ़ेस नाम से और 4567 को Phantun सर्वर द्वारा उपयोग किए जाने वाले वास्तविक TCP पोर्ट नंबर से बदलें
table inet nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iif eth0 tcp dport 4567 dnat ip to 192.168.201.2
iif eth0 tcp dport 4567 dnat ip6 to fcc9::2
}
}
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination 192.168.201.2
ip6tables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination fcc9::2
नेटवर्क का सामना करने वाले अनुप्रयोगों को रूट उपयोगकर्ता के रूप में चलाना अनुचित है। Phantun को cap_net_admin क्षमता के साथ पूरी तरह से गैर-रूट उपयोगकर्ता के रूप में चलाया जा सकता है।
sudo setcap cap_net_admin=+pe phantun_server
sudo setcap cap_net_admin=+pe phantun_client
नोट: पूर्ण विस्तृत विकल्प देखने के लिए Phantun निष्पादन योग्य को -h विकल्प के साथ चलाएं।
नोट: 4567 TCP पोर्ट है जिस पर Phantun को सुनना चाहिए और यह ऊपर निर्दिष्ट DNAT नियम के अनुरूप होना चाहिए। 127.0.0.1:1234 नए कनेक्शनों के लिए जुड़ने वाला UDP सर्वर है।
RUST_LOG=info /usr/local/bin/phantun_server --local 4567 --remote 127.0.0.1:1234
या --remote के साथ होस्ट नाम का उपयोग करें:
RUST_LOG=info /usr/local/bin/phantun_server --local 4567 --remote example.com:1234
नोट: सर्वर डिफ़ॉल्ट रूप से Tun इंटरफ़ेस को IPv4 और IPv6 दोनों निजी पते प्रदान करता है। यदि आप IPv6 का उपयोग नहीं करना चाहते हैं, तो आप बस ऊपर IPv6 DNAT नियम बनाना छोड़ सकते हैं और Tun इंटरफ़ेस पर IPv6 पते की उपस्थिति का सर्वर पर कोई दुष्प्रभाव नहीं होना चाहिए।
नोट: 127.0.0.1:1234 UDP पता और पोर्ट है जिस पर Phantun को सुनना चाहिए। 10.0.0.1:4567 कनेक्ट करने के लिए Phantun सर्वर है।
RUST_LOG=info /usr/local/bin/phantun_client --local 127.0.0.1:1234 --remote 10.0.0.1:4567
या --remote के साथ होस्ट नाम का उपयोग करें:
RUST_LOG=info /usr/local/bin/phantun_client --local 127.0.0.1:1234 --remote example.com:4567
RUST_LOG=info /usr/local/bin/phantun_client --local 127.0.0.1:1234 --remote [fdxx::1234]:4567
AAAA रिकॉर्ड वाले डोमेन नाम भी समर्थित हैं।
Phantun का लक्ष्य टनलिंग ओवरहेड को न्यूनतम रखना है। एक सादे UDP पैकेट की तुलना में ओवरहेड निम्नलिखित है (नीचे IPv4 को उदाहरण के रूप में उपयोग करते हुए):
मानक UDP पैकेट: 20 बाइट IP हेडर + 8 बाइट UDP हेडर = 28 बाइट्स
अस्पष्ट पैकेट: 20 बाइट IP हेडर + 20 बाइट TCP हेडर = 40 बाइट्स
ध्यान दें कि Phantun स्टेटफुल पैकेट निरीक्षण से गुज़रने के लिए IP और TCP हेडर के अलावा कोई अतिरिक्त हेडर नहीं जोड़ता है!
Phantun का अतिरिक्त ओवरहेड: 12 बाइट्स। दूसरे शब्दों में, Phantun का उपयोग करते समय, UDP पैकेट के लिए उपयोगी पेलोड 12 बाइट्स कम हो जाता है। इस प्रकार के अस्पष्टीकरण में यह न्यूनतम संभव ओवरहेड है।

उन लोगों के लिए जो Phantun का उपयोग WireGuard® UDP पैकेटों को टनल करने के लिए करते हैं, यहाँ अपने WireGuard इंटरफ़ेस के लिए सही MTU निर्धारित करने के लिए कुछ दिशानिर्देश दिए गए हैं।
WireGuard MTU = लिंक MTU - IPv4 हेडर (20 बाइट्स) - TCP हेडर (20 बाइट्स) - WireGuard ओवरहेड (32 बाइट्स)
या
WireGuard MTU = लिंक MTU - IPv6 हेडर (40 बाइट्स) - TCP हेडर (20 बाइट्स) - WireGuard ओवरहेड (32 बाइट्स)
उदाहरण के लिए, 1500 बाइट MTU वाले नेटवर्क लिंक के लिए, WireGuard इंटरफ़ेस MTU इस प्रकार सेट किया जाना चाहिए:
IPv4: 1500 (लिंक MTU) - 20 - 20 - 32 = 1428 बाइट्स
IPv6: 1500 (लिंक MTU) - 40 - 20 - 32 = 1408 बाइट्स
परिणामी Phantun TCP डेटा पैकेट 1500 बाइट्स का होगा जो 1500 के इंटरफ़ेस MTU से अधिक नहीं है।
कृपया ध्यान दें यदि पैकेट का आकार लिंक MTU से अधिक है तो Phantun सही ढंग से काम नहीं कर सकता, क्योंकि Phantun कोई IP-विखंडन और पुनर्संयोजन नहीं करता है। इसी कारण से, Phantun हमेशा IP हेडर में DF (Don't Fragment) बिट सेट करता है ताकि मध्यवर्ती उपकरणों को पैकेट पर कोई विखंडन करने से रोका जा सके।
WireGuard सुरंग के दोनों सिरों पर समान इंटरफ़ेस MTU का उपयोग करने की भी दृढ़ता से अनुशंसा की जाती है, अन्यथा अप्रत्याशित पैकेट हानि हो सकती है और ये समस्याएं आमतौर पर निवारण करना बहुत कठिन होती हैं।
जबकि TCP स्टैक काफी स्थिर है, सामान्य अपेक्षा यह है कि अधिकतम अनुकूलता सुनिश्चित करने के लिए आपको दोनों सिरों पर Phantun के समान मामूली संस्करण चलाने चाहिए।
उन उपयोगकर्ताओं के लिए जो अपने स्वयं के प्रोजेक्ट में fake-tcp लाइब्रेरी का उपयोग करना चाहते हैं, लाइब्रेरी के दस्तावेज़ीकरण के लिए यहाँ देखें:
https://docs.rs/fake-tcp।
प्रदर्शन का परीक्षण LAN पर 4 vCPUs और 5 Gb/s NIC वाले दो AWS t4g.xlarge इंस्टेंस पर किया गया था। iperf3 के UDP स्ट्रीम को दो परीक्षण इंस्टेंस के बीच Phantun/udp2raw सुरंग से गुज़रने के लिए रीडायरेक्ट करने के लिए nftables का उपयोग किया गया था और विखंडन से बचने के लिए MTU को ट्यून किया गया था।
Phantun v0.3.2 और udp2raw_arm_asm_aes 20200818.0 का उपयोग किया गया था। ये अप्रैल 2022 तक दोनों परियोजनाओं के नवीनतम रिलीज़ थे।
परीक्षण आदेश: iperf3 -c <IP> -p <PORT> -R -u -l 1400 -b 1000m -t 30 -P 5
| मोड | भेजने की गति | प्राप्त करने की गति | कुल CPU उपयोग |
|---|---|---|---|
| सीधा (1 स्ट्रीम) | 3.00 Gbits/sec | 2.37 Gbits/sec | 25% (1 कोर 100% पर) |
| Phantun (1 स्ट्रीम) | 1.30 Gbits/sec | 1.20 Gbits/sec | 60% (1 कोर 100% पर, 3 कोर 50% पर) |
udp2raw (cipher-mode=none auth-mode=none disable-anti-replay) (1 स्ट्रीम) | 1.30 Gbits/sec | 715 Mbits/sec | 40% (1 कोर 100% पर, 1 कोर 50% पर, 2 कोर निष्क्रिय) |
| सीधा कनेक्शन (5 स्ट्रीम) | 5.00 Gbits/sec | 3.64 Gbits/sec | 25% (1 कोर 100% पर) |
| Phantun (5 स्ट्रीम) | 5.00 Gbits/sec | 2.38 Gbits/sec | 95% (सभी कोर उपयोग में) |
udp2raw (cipher-mode=none auth-mode=none disable-anti-replay) (5 स्ट्रीम) | 5.00 Gbits/sec | 770 Mbits/sec | 50% (2 कोर 100% पर) |
Phantun में इस प्रदर्शन परिणाम को प्राप्त करने के लिए उपयोग की जाने वाली कुछ तकनीकों पर लेख: Writing Highly Efficient UDP Server in Rust।
udp2raw @wangyu- द्वारा एक और लोकप्रिय परियोजना है जो Phantun के समान कार्य कर सकती है। वास्तव में मैंने Phantun के लिए udp2raw से प्रेरणा ली थी। Phantun को विकसित करने का सबसे बड़ा कारण udp2raw चलाने पर प्रदर्शन की कमी है (विशेषकर Raspberry Pi जैसी मल्टी-कोर प्रणालियों पर)। हालाँकि, लक्ष्य कभी भी udp2raw जितना सुविधा संपन्न होना नहीं है और केवल सबसे सामान्य उपयोग मामलों का समर्थन करना है। विशेष रूप से, UDP over ICMP और UDP over UDP मोड समर्थित नहीं हैं और कोई एंटी-रीप्ले या एन्क्रिप्शन समर्थन नहीं है। इसका लाभ समग्र रूप से बेहतर प्रदर्शन और TCP पेलोड के अंदर अतिरिक्त हेडर की कमी के कारण कम MTU ओवरहेड है।
आपकी पसंद में मदद करने के लिए यहाँ दोनों के बीच तुलना का एक त्वरित अवलोकन है:
| Phantun | udp2raw | |
|---|---|---|
| UDP over FakeTCP अस्पष्टीकरण | ✅ | ✅ |
| UDP over ICMP अस्पष्टीकरण | ❌ | ✅ |
| UDP over UDP अस्पष्टीकरण | ❌ | ✅ |
| मल्टी-थ्रेडेड | ✅ | ❌ |
| थ्रूपुट | बेहतर | अच्छा |
| लेयर 3 मोड | TUN इंटरफ़ेस | रॉ सॉकेट + BPF |
| टनलिंग MTU ओवरहेड | 12 बाइट्स | 44 बाइट्स |
| प्रत्येक UDP कनेक्शन के लिए अलग TCP कनेक्शन | क्लाइंट/सर्वर | केवल सर्वर |
| एंटी-रीप्ले, एन्क्रिप्शन | ❌ | ✅ |
| IPv6 | ✅ | ✅ |
कॉपीराइट 2021-2025 डेटॉन्ग सन ([email protected])
Apache License, Version 2.0 <LICENSE-APACHE या https://www.apache.org/licenses/LICENSE-2.0> या MIT लाइसेंस <LICENSE-MIT या https://opensource.org/licenses/MIT>, आपकी पसंद के अनुसार लाइसेंस प्राप्त है। प्रोजेक्ट में फ़ाइलों की प्रतिलिपि, संशोधन या वितरण उन शर्तों के अनुसार नहीं किया जा सकता है सिवाय उन शर्तों के।