
يحوِّل تدفق UDP إلى تدفقات TCP (مزيفة) يمكنها المرور عبر جدران الحماية/NAPT من الطبقة 3 والطبقة 4 (NATs).
أداة خفيفة وسريعة لتشويش حزم UDP إلى TCP.
Rust توفر فقط دعم المستوى 3 للمنصات القائمة على MIPS منذ 2023. لذلك، تُبنى إصدارات فانتون لـ MIPS باستخدام سلسلة أدوات Rust الليلية وتُقدم على أساس أفضل جهد فقط.
فانتون هو مشروع يقوم بتشويش حزم UDP إلى اتصالات TCP. يهدف إلى تحقيق أقصى أداء مع أقل قدر من المعالجة والنفقات الإضافية للتغليف.
يُستخدم عادةً في البيئات التي يكون فيها UDP محظورًا أو مقيدًا ولكن TCP مسموح به.
يقوم فانتون ببساطة بتحويل تيار من حزم UDP إلى حزم تيار TCP مشوشة. صُمم مكدس TCP المستخدم من قبل فانتون لاجتياز معظم أجهزة جدران الحالة/عديمة الحالة وNAT من المستوى 3/4. لن يتمكن من اجتياز بروكسيات المستوى 7. ومع ذلك، فإن ميزة هذا النهج هي أن لا تحدث أي من مشكلات الأداء الشائعة لـ UDP عبر TCP مثل إعادة الإرسال والتحكم في التدفق. يتم الحفاظ على خصائص UDP الأساسية مثل التسليم خارج الترتيب حتى لو بدا الاتصال كاتصال TCP من منظور جدران الحماية/أجهزة NAT.
فانتون يعني "شبح TUN"، فهو مشوش لحركة UDP يقوم بالعمل الكافي فقط ليجعلها تمر عبر جدار الحالة/NAT كحزم TCP.
كُتب فانتون بلغة Rust الآمنة بنسبة 100%. تم تحسينه بشكل كبير ليتمدد جيدًا على الأنظمة متعددة النوى ولا يواجه مشكلة في إشباع جميع موارد وحدة المعالجة المركزية المتاحة على اتصال سريع. راجع قسم الأداء لنتائج القياس.

في المثال أدناه، يُفترض أن خادم فانتون يستمع لاتصالات عملاء فانتون الواردة على المنفذ 4567 (خيار --local للخادم)، ويقوم بإعادة توجيه حزم UDP إلى خادم UDP على 127.0.0.1:1234 (خيار --remote للخادم).
يُفترض أيضًا أن عميل فانتون يستمع لحزم UDP الواردة على 127.0.0.1:1234 (خيار --local للعميل) ويتصل بخادم فانتون على 10.0.0.1:4567 (خيار --remote للعميل).
يقوم فانتون بإنشاء واجهة TUN لكل من العميل والخادم. بالنسبة للـ عميل، يعين فانتون لنفسه عنوان IP 192.168.200.2 و fcc8::2 افتراضيًا. بالنسبة للـ خادم، يعين 192.168.201.2 و fcc9::2 افتراضيًا. لذلك، يجب أن يكون تمكين إعادة توجيه IPv4/IPv6 للنواة لديك وإعداد قواعد iptables/nftables مناسبة لـ NAT بين عنوان بطاقة الشبكة الفعلية وعنوان واجهة Tun الخاصة بفانتون.
يمكنك تخصيص اسم واجهة Tun التي ينشئها فانتون والعناوين المعينة. يُرجى تشغيل الملف القابل للتنفيذ مع خيار -h لمعرفة كيفية تغييرها.
طريقة أخرى للمساعدة في فهم هيكل الشبكة هذا (يرجى الاطلاع على الرسم البياني أعلاه لتوضيح هذا الهيكل):
عميل فانتون يشبه جهازًا بعنوان IP خاص (192.168.200.2/fcc8::2) خلف موجه. لكي يتمكن من الوصول إلى الإنترنت، ستحتاج إلى عمل SNAT لعنوان IP الخاص قبل أن تغادر حركة المرور بطاقة الشبكة.
خادم فانتون يشبه خادمًا بعنوان IP خاص (192.168.201.2/fcc9::2) خلف موجه. للوصول إليه من الإنترنت، تحتاج إلى عمل DNAT لمنفذ الاستماع الخاص به على الموجه وتغيير عنوان IP الوجهة إلى المكان الذي يستمع فيه الخادم للاتصالات الواردة.
في هذه الحالات، تعمل الآلة/iptables التي تشغل فانتون كـ "موجه" يسمح لفانتون بالتواصل مع الخارج باستخدام عناوين IP الخاصة به.
اعتبارًا من فانتون v0.4.1، IPv6 مدعوم بالكامل لكل من جانبي TCP و UDP. لتحديد عنوان IPv6، استخدم التنسيق التالي: [::1]:1234 مع خيارات سطر الأوامر. تحليل سجل AAAA مدعوم أيضًا. يُرجى تشغيل البرنامج مع -h لرؤية الخيارات التفصيلية حول كيفية التحكم في سلوك IPv6.
حرر /etc/sysctl.conf، أضف net.ipv4.ip_forward=1 وقم بتشغيل sudo sysctl -p /etc/sysctl.conf.
net.ipv6.conf.all.forwarding=1 يجب تعيينها أيضًا.
يحتاج العميل ببساطة إلى تفعيل SNAT على الواجهة الفعلية لترجمة عنوان فانتون إلى عنوان يمكن استخدامه على الشبكة الفعلية. يمكن القيام بذلك ببساطة باستخدام التمويه (masquerade).
ملاحظة: قم بتغيير 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
يحتاج الخادم إلى عمل DNAT لمنفذ استماع TCP إلى عنوان واجهة TUN الخاصة بفانتون.
ملاحظة: قم بتغيير eth0 إلى اسم الواجهة الفعلية الحقيقية و 4567 إلى رقم منفذ 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
من غير المستحسن تشغيل تطبيقات مواجهة للشبكة كمستخدم جذر. يمكن تشغيل فانتون بالكامل كمستخدم غير جذر مع صلاحية cap_net_admin.
sudo setcap cap_net_admin=+pe phantun_server
sudo setcap cap_net_admin=+pe phantun_client
ملاحظة: قم بتشغيل الملف القابل للتنفيذ لفانتون مع خيار -h لرؤية الخيارات التفصيلية الكاملة.
ملاحظة: 4567 هو منفذ TCP الذي يجب أن يستمع عليه فانتون ويجب أن يتوافق مع قاعدة 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
ملاحظة: يقوم الخادم افتراضيًا بتعيين كل من عناوين IPv4 و IPv6 الخاصة لواجهة Tun. إذا كنت لا ترغب في استخدام IPv6، يمكنك ببساطة تخطي إنشاء قاعدة DNAT لـ IPv6 أعلاه، ووجود عنوان IPv6 على واجهة Tun لن يكون له أي تأثير جانبي على الخادم.
ملاحظة: 127.0.0.1:1234 هو عنوان UDP والمنفذ الذي يجب أن يستمع عليه فانتون. 10.0.0.1:4567 هو خادم فانتون الذي سيتم الاتصال به.
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 مدعومة أيضًا.
يهدف فانتون إلى إبقاء النفقات الإضافية للتغليف إلى الحد الأدنى. النفقات الإضافية مقارنة بحزمة UDP عادية هي كما يلي (باستخدام IPv4 كمثال أدناه):
حزمة UDP قياسية: 20 بايت رأس IP + 8 بايت رأس UDP = 28 بايت
حزمة مشوشة: 20 بايت رأس IP + 20 بايت رأس TCP = 40 بايت
لاحظ أن فانتون لا يضيف أي رأس إضافي غير رؤوس IP و TCP من أجل اجتياز فحص الحزمة مع الحفاظ على الحالة!
النفقات الإضافية لفانتون: 12 بايت. بمعنى آخر، عند استخدام فانتون، يتم تقليل الحمولة القابلة للاستخدام لحزمة UDP بمقدار 12 بايت. هذا هو الحد الأدنى للنفقات الإضافية الممكنة عند القيام بهذا النوع من التشويش.

للأشخاص الذين يستخدمون فانتون لنفق حزم UDP لـ WireGuard®، إليك بعض الإرشادات حول تحديد MTU الصحيح لاستخدامه لواجهة WireGuard الخاصة بك.
WireGuard MTU = MTU الرابط - رأس IPv4 (20 بايت) - رأس TCP (20 بايت) - نفقات WireGuard الإضافية (32 بايت)
أو
WireGuard MTU = MTU الرابط - رأس IPv6 (40 بايت) - رأس TCP (20 بايت) - نفقات WireGuard الإضافية (32 بايت)
على سبيل المثال، لرابط شبكة ب MTU 1500 بايت، يجب تعيين MTU لواجهة WireGuard كالتالي:
IPv4: 1500 (MTU الرابط) - 20 - 20 - 32 = 1428 بايت
IPv6: 1500 (MTU الرابط) - 40 - 20 - 32 = 1408 بايت
ستكون حزمة بيانات TCP الناتجة لفانتون 1500 بايت والتي لا تتجاوز MTU الواجهة البالغ 1500.
يرجى ملاحظة لا يمكن لفانتون العمل بشكل صحيح إذا تجاوز حجم الحزمة MTU الرابط، لأن فانتون لا يقوم بأي تجزئة (IP-fragmentation) وإعادة تجميع. لنفس السبب، يقوم فانتون دائمًا بتعيين بت DF (عدم التجزئة) في رأس IP لمنع الأجهزة الوسيطة من إجراء أي تجزئة على الحزمة.
من الموصى به بشدة أيضًا استخدام نفس MTU الواجهة لكلا طرفي نفق WireGuard، وإلا قد يحدث فقدان غير متوقع للحزم وهذه المشكلات عادة ما تكون صعبة الحل.
بينما يكون مكدس TCP مستقرًا إلى حد كبير، التوقع العام هو أنه يجب عليك تشغيل نفس الإصدارات الثانوية لخادم/عميل فانتون على كلا الطرفين لضمان أقصى توافق.
للمستخدمين الذين يرغبون في استخدام مكتبة fake-tcp داخل مشاريعهم الخاصة، راجع الوثائق الخاصة بالمكتبة على:
https://docs.rs/fake-tcp.
تم اختبار الأداء على مثيلين من AWS t4g.xlarge مع 4 vCPUs و 5 Gb/s NIC عبر الشبكة المحلية. تم استخدام nftables لإعادة توجيه تيار UDP لـ iperf3 للمرور عبر نفق فانتون/udp2raw بين مثيلي الاختبار وتم ضبط MTU لتجنب التجزئة.
تم استخدام فانتون 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
شرح لبعض التقنيات المستخدمة في فانتون لتحقيق نتيجة الأداء هذه: كتابة خادم UDP عالي الكفاءة في Rust.
udp2raw هو مشروع شائع آخر بواسطة @wangyu- مشابه جدًا لما يمكن أن يفعله فانتون. في الواقع، استلهمت فكر فانتون من udp2raw. السبب الأكبر لتطوير فانتون هو نقص الأداء عند تشغيل udp2raw (خاصة على الأنظمة متعددة النوى مثل Raspberry Pi). ومع ذلك، الهدف ليس أبدًا أن يكون مكتمل الميزات مثل udp2raw ودعم فقط حالات الاستخدام الأكثر شيوعًا. والأهم من ذلك، أن UDP عبر ICMP ووضع UDP عبر UDP غير مدعومين ولا يوجد دعم لمكافحة إعادة التشغيل أو التشفير. فائدة ذلك هي أداء أفضل بشكل عام ونفقات إضافية أقل لـ MTU بسبب عدم وجود رؤوس إضافية داخل حمولة TCP.
إليك نظرة سريعة على المقارنة بين الاثنين لمساعدتك في الاختيار:
حقوق النشر 2021-2025 داتونغ صن ([email protected])
مرخص بموجب رخصة Apache، الإصدار 2.0 <LICENSE-APACHE أو https://www.apache.org/licenses/LICENSE-2.0> أو رخصة MIT <LICENSE-MIT أو https://opensource.org/licenses/MIT>، حسب اختيارك. لا يجوز نسخ أو تعديل أو توزيع الملفات في المشروع إلا وفقًا لهذه الشروط.
| الوضع | سرعة الإرسال | سرعة الاستقبال | استخدام وحدة المعالجة المركزية الإجمالي |
|---|
| مباشر (تيار واحد) | 3.00 Gbits/sec | 2.37 Gbits/sec | 25% (نواة واحدة بنسبة 100%) |
| فانتون (تيار واحد) | 1.30 Gbits/sec | 1.20 Gbits/sec | 60% (نواة واحدة بنسبة 100%، 3 أنوية بنسبة 50%) |
udp2raw (cipher-mode=none auth-mode=none disable-anti-replay) (تيار واحد) | 1.30 Gbits/sec | 715 Mbits/sec | 40% (نواة واحدة بنسبة 100%، نواة واحدة بنسبة 50%، نواتان خاملتان) |
| اتصال مباشر (5 تيارات) | 5.00 Gbits/sec | 3.64 Gbits/sec | 25% (نواة واحدة بنسبة 100%) |
| فانتون (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% (نواتان بنسبة 100%) |
| فانتون | udp2raw |
|---|
| تشويش UDP عبر FakeTCP | ✅ | ✅ |
| تشويش UDP عبر ICMP | ❌ | ✅ |
| تشويش UDP عبر UDP | ❌ | ✅ |
| متعدد الخيوط | ✅ | ❌ |
| الإنتاجية | أفضل | جيد |
| وضع الطبقة 3 | واجهة TUN | مقابس خام + BPF |
| النفقات الإضافية لتغليف MTU | 12 بايت | 44 بايت |
| اتصالات TCP منفصلة لكل اتصال UDP | عميل/خادم | خادم فقط |
| مكافحة إعادة التشغيل، التشفير | ❌ | ✅ |
| IPv6 | ✅ | ✅ |