com.skcptun
skcptun هو نفق KCP مشفر لـ OpenWRT وLinux وMacOS، ويتم تنفيذه بلغة C وLua.
ولاية
- "ليس الأمر كما لو أنه لا يمكن استخدامه"
- حاليًا، هو إصدار تمت إضافة Lua إليه، ولم يعد يتم الاحتفاظ بإصدار C النقي.
مميزة
- استنادًا إلى نفق UDP المشفر الموثوق به، لا تحتوي بيانات الإرسال المشفرة على أي خصائص.
- ويمكن استخدامه لتسريع اتصالات الشبكة، مع الوضع السريع والوضع العادي. سرعة الإرسال المقاسة للوضع السريع أكبر بكثير من إرسال TCP. (علامة البدلاء)
- يدعم حاليًا وضعين: وضع TUN ووضع TCP
- في وضع TUN، يقوم كل من العميل والخادم بإنشاء بطاقة شبكة افتراضية على نفس قطاع الشبكة، ويقوم العميل بنقل جميع حزم IP إلى الخادم بشفافية من خلال نفق KCP المشفر، على غرار وضع VPN التقليدي.
- في وضع TCP، يستمع العميل إلى منفذ واحد (أو أكثر) وينقل جميع البيانات المستلمة بشفافية إلى الخادم من خلال نفق KCP المشفر. ينقل الخادم البيانات بشفافية إلى الخادم المعين. ويتم استخدامه بشكل عام عند حظر وضع TUN.
- يمكنك استخدام البرامج النصية Lua لتنفيذ خدماتك المخصصة بناءً على واجهة برمجة التطبيقات التي يوفرها skcptun.
ثَبَّتَ
بيئة التشغيل: لينكس، ماك
المكتبات التابعة: OpenSSL، libev
بعد تنزيل الكود المصدري وفك الضغط عنه:
cd skcptun
mkdir build
cd build
cmake ..
make
إذا قمت بالاستنساخ مباشرةً، فستحتاج إلى تحديث الوحدة الفرعية:
git submodule update --init --recursive
تكوين البيئة
وضع TCP
- قم بتكوين ملف التكوين وابدأ استخدامه
وضع تون
- نظرًا لأنه تم إنشاء النفق من خلال تقنية بطاقة الشبكة الافتراضية، فيجب إجراء إعدادات الشبكة الضرورية.
- لنأخذ Linux (Debian) كمثال، تحتاج النواة إلى دعم وحدة tun. قم بالتأكيد باستخدام أمر "modinfo tun".
- يتطلب تثبيت مجموعات أدوات "iproute2" و"iptables".
الخادم
- قم بتمكين إعادة توجيه IP، وأضف التكوين التالي إلى الملف "/etc/sysctl.conf"، وقم بتنفيذ "sysctl -p" ليصبح ساري المفعول.
net.ipv4.ip_forward=1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.conf.default.route_localnet = 1
net.ipv4.conf.[网卡接口].route_localnet = 1
net.ipv4.conf.lo.route_localnet = 1
net.ipv4.conf.[虚拟网卡接口].route_localnet = 1
- قم بتشغيل إعادة توجيه IP وتعديل سياسة إعادة التوجيه الافتراضية "iptables -P FORWARD ACCEPT"
- قم بتعديل عنوان مصدر nat إلى عنوان بطاقة شبكة الخروج "iptables -t nat -A POSTROUTING -s 192.168.2.1/24 -o enp1s0 -j MASQUERADE"
عميل
يستخدم
- ملف التكوين هو ملف التكوين
- إذا كان وضع TUN، فإن أذونات الجذر مطلوبة للتشغيل.
ملف التكوين:
ملف التكوين هو ملف Lua، راجع "skcptun_config_sample"، وهناك تعليقات بالداخل.
المتغيرات الداخلية المقدمة من skcptun
skt
"skt" هو متغير عام مضمن تستخدمه برامج Lua النصية، بما في ذلك "skt.conf.*"، و"skt.api.*"، و"skt.cb.*".
معلومات تكوين skcptun
"skt.conf.*": متغيرات معلومات التكوين التي تم كشفها بواسطة skcptun لبرامج Lua النصية.
skt.conf.tun_ip
يجب تعيين عنوان IP الخاص ببطاقة الشبكة الافتراضية والعميل والخادم على نفس مقطع الشبكة، وهو صالح في الوضعين "tun_client" و"tun_server".
skt.conf.tun_mask
قناع الشبكة الفرعية لبطاقة الشبكة الافتراضية، وإعدادات العميل والخادم متسقة، وصالحة في الوضعين "tun_client" و"tun_server".
skt.conf.skcp_serv_conf_list_size
رقم "skcp_serv_conf".
skt.conf.skcp_serv_conf_list[i].raw
يتم استخدام المؤشر الأول "skcp_serv_conf" نفسه لتمرير المعلمات إلى واجهة برمجة التطبيقات.
skt.conf.skcp_serv_conf_list[i].addr
عنوان IP الخاص بالـ i-th "skcp_serv_conf"
skt.conf.skcp_serv_conf_list[i].port
منفذ i-th "skcp_serv_conf"
skt.conf.skcp_serv_conf_list[i].key
السلسلة المشفرة للـ i-th "skcp_serv_conf"
skt.conf.skcp_serv_conf_list[i].ticket
بطاقة الوصول المتفق عليها بين العميل والخادم "skcp_serv_conf" صالحة في الوضعين "tun_client" و"proxy_client".
skt.conf.skcp_serv_conf_list[i].max_conn_cnt
الحد الأقصى لعدد الاتصالات لـ "skcp_serv_conf" الأول، الصالح في وضعي "proxy_server" و"tun_server".
تكوين skt.conf.skcp_cli_conf_list* هو نفس تكوين skt.conf.skcp_serv_conf_list*
skt.conf.etcp_serv_conf_list_size
رقم "etcp_serv_conf_list"
skt.conf.etcp_serv_conf_list[i].raw
يتم استخدام مؤشر خادم TCP "etcp_serv_conf" نفسه لتمرير المعلمات إلى واجهة برمجة التطبيقات.
skt.conf.etcp_serv_conf_list[i].addr
عنوان الاستماع لخادم TCP.
skt.conf.etcp_serv_conf_list[i].port
منفذ الاستماع لخادم TCP.
skt.conf.etcp_cli_conf_list_size
رقم "etcp_cli_conf_list"
skt.conf.etcp_cli_conf_list[i].raw
يتم استخدام مؤشر عميل TCP "etcp_cli_conf" نفسه لتمرير المعلمات إلى واجهة برمجة التطبيقات.
skt.conf.etcp_cli_conf_list[i].addr
عنوان اتصال عميل TCP، صالح في وضع "الخادم الوكيل".
skt.conf.etcp_cli_conf_list[i].port
منفذ اتصال عميل TCP، صالح في وضع "الخادم الوكيل".
واجهة برمجة تطبيقات Lua الداخلية المقدمة من skcptun
"skt.api.*"، واجهة برمجة التطبيقات التي كشفها skcptun لبرامج Lua النصية.
skt.api.skcp_init (conf، حلقة، skcp_mode)
تهيئة skcp.
- المعلمة
- أسيوط: تكوين skcp
- حلقة: كائن حلقة الحدث
- skcp_mode: وضع بدء التشغيل skcp، عدد صحيح، 1 يمثل وضع الخادم، 2 يمثل وضع العميل
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع كائن skcp بنجاح
skt.api.skcp_free(skcp)
تدمير وإطلاق سراح skcp.
- المعلمة
- قيمة الإرجاع: لا شيء
skt.api.skcp_req_cid(skcp، تذكرة)
اطلب معرف الاتصال من خادم skcp.
- المعلمة
- كائن skcp
- التذكرة: التذكرة المقابلة في معلومات التكوين، السلسلة
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- إرجاع "موافق" بنجاح
skt.api.skcp_send(skcp, cid, buf)
إرسال الرسائل عبر skcp.
- المعلمة
- كائن skcp
- cid: معرف اتصال skcp، عدد صحيح
- buf: محتوى الرسالة، السلسلة
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع عدد البايتات التي تم إرسالها بنجاح >= 0، عدد صحيح
skt.api.skcp_ Close_conn (skcp، سيد)
أغلق اتصال skcp.
- المعلمة
- كائن skcp
- cid: معرف اتصال skcp، عدد صحيح
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع 0 بنجاح، عدد صحيح
skt.api.skcp_get_conn(skcp، سيد)
احصل على اتصال skcp.
- المعلمة
- كائن skcp
- cid: معرف اتصال skcp، عدد صحيح
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- كائن كون النجاح
skt.api.etcp_server_init(conf، حلقة)
تهيئة خادم etcp.
- المعلمة
- أسيوط: تكوين skcp
- حلقة: كائن حلقة الحدث
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع كائن خادم etcp بنجاح
skt.api.etcp_server_free(etcp)
تدمير وتحرير خادم etcp.
- المعلمة
- قيمة الإرجاع لا شيء
skt.api.etcp_server_send(etcp, fd, buf)
إرسال رسائل إلى العملاء عبر etcp.
- المعلمة
- كائن خادم etcp
- fd: fd المقابل، عدد صحيح
- buf: محتوى الرسالة، السلسلة
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع عدد البايتات التي تم إرسالها بنجاح > 0، عدد صحيح
skt.api.etcp_server_get_conn(etcp, fd)
الحصول على اتصال بخادم etcp.
- المعلمة
- كائن خادم etcp
- fd: fd المقابل، عدد صحيح
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع كائن conn بنجاح
skt.api.etcp_server_ Close_conn (etcp، fd، صامت)
أغلق اتصال خادم etcp.
- المعلمة
- كائن خادم etcp
- fd: fd المقابل، عدد صحيح
- صامت: ما إذا كان سيتم الإغلاق بصمت، إذا لم يتم إغلاقه بصمت، فسيتم تشغيل الحدث "on_Close". 1 يعني الإغلاق الصامت، 0 يعني الإغلاق غير الصامت.
- قيمة الإرجاع: لا شيء
skt.api.etcp_client_init(conf، حلقة)
تهيئة عميل etcp.
- المعلمة
- أسيوط: تكوين skcp
- حلقة: كائن حلقة الحدث
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع كائن العميل etcp بنجاح
skt.api.etcp_client_free(etcp)
تدمير وإطلاق عميل etcp.
- المعلمة
- قيمة الإرجاع: لا شيء
skt.api.etcp_client_send(etcp, fd, buf)
إرسال رسائل إلى الخادم من خلال الخ.
- المعلمة
- كائن العميل etcp
- fd: fd المقابل، عدد صحيح
- buf: محتوى الرسالة، السلسلة
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع عدد البايتات التي تم إرسالها بنجاح > 0، عدد صحيح
skt.api.etcp_client_create_conn(etcp, addr, port)
إنشاء اتصال etcp.
- المعلمة
- كائن العميل etcp
- addr: تحتاج إلى الاتصال بعنوان الخادم، سلسلة
- المنفذ: تحتاج إلى الاتصال بمنفذ الخادم
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع النوع الصحيح الذي تم إنشاؤه بنجاح
skt.api.etcp_client_ Close_conn (etcp، fd)
أغلق اتصال عميل etcp.
- المعلمة
- كائن العميل etcp
- fd: fd المقابل، عدد صحيح
- قيمة الإرجاع: لا شيء
skt.api.etcp_client_get_conn(etcp, fd)
احصل على اتصال عميل etcp.
- المعلمة
- كائن العميل etcp
- fd: fd المقابل، عدد صحيح
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع كائن conn بنجاح
skt.api.tuntap_write(fd, buf)
كتابة البيانات على بطاقة الشبكة الافتراضية.
- المعلمة
- fd: fd لبطاقة الشبكة الافتراضية، عدد صحيح
- buf: البيانات المراد كتابتها، سلسلة
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- عدد البايتات المكتوبة بنجاح، عدد صحيح
skt.api.get_from_skcp(skcp، الاسم)
احصل على قيمة الحقل المقابل في كائن skcp، وهي: "skcp.name".
- المعلمة
- كائن skcp
- الاسم: اسم الحقل في skcp، حاليًا يدعم فقط حقل "fd"، سلسلة
- قيمة الإرجاع
- يؤدي الفشل إلى إرجاع "nil, error_msg"
- تم إرجاع القيمة المقابلة للاسم بنجاح، أي
skt.api.get_ms()
احصل على عدد المللي ثانية منذ عام 1970 للنظام الحالي.
- المعلمات: لا يوجد
- قيمة الإرجاع:
skt.api.hton32(ط)
تحويل متغيرات عدد صحيح 32 بت من ترتيب بايت المضيف إلى ترتيب بايت الشبكة.
- المعلمة
- i: اكتب عددًا صحيحًا بترتيب بايت المضيف
- قيمة الإرجاع
- إرجاع عدد صحيح بترتيب بايت الشبكة
skt.api.ntoh32(ط)
تحويل متغيرات عدد صحيح 32 بت من ترتيب بايت الشبكة إلى ترتيب البايت المضيف.
- المعلمة
- i: نوع عدد صحيح بترتيب بايت الشبكة
- قيمة الإرجاع
- إرجاع عدد صحيح بترتيب بايت المضيف
skt.api.band(أ، ب)
قم بإجراء عملية AND منطقية للبت على عددين صحيحين وقم بإرجاع النتيجة
skt.api.bor (أ، ب)
تنفيذ عملية OR منطقية للبت على عددين صحيحين وإرجاع النتيجة
skt.api.bxor(أ، ب)
قم بإجراء عملية XOR على عددين صحيحين وإرجاع النتيجة
skt.api.blshift(i, n)
انقل العدد الصحيح إلى اليسار بمقدار n بت وأرجع النتيجة
skt.api.brshift(i, n)
انقل العدد الصحيح إلى اليمين بمقدار n من البتات وأرجع النتيجة
skt.api.lookup_dns(المجال)
حل اسم المجال
- المعلمة
- المجال: اسم المجال الذي سيتم حله، سلسلة
- قيمة الإرجاع
- تقوم بإرجاع عنوان IP المقابل بتنسيق منقط (IPV4)، سلسلة
واجهة رد الاتصال التي يحتاج البرنامج النصي Lua إلى تنفيذها
يحتاج "skt.cb.*" إلى تنفيذ واجهات مختلفة وفقًا لأوضاع بدء التشغيل المختلفة لرد اتصال skcptun.
skt.cb.on_init(حلقة)
يتم استدعاء واجهة رد الاتصال الأولى عند بدء تشغيل البرنامج النصي، ويتم استدعاؤها مرة واحدة فقط
- النطاق الصالح: جميع الأوضاع
- المعلمة
- قيمة الإرجاع: لا شيء
skt.cb.on_skcp_accept(skcp، سيد)
نجح خادم skcp في إنشاء cid ويتم استدعاؤه مرة واحدة فقط لكل اتصال.
- النطاق الصالح: "proxy_server"، "tun_server"
- المعلمة
- كائن skcp
- cid: معرف اتصال skcp، عدد صحيح
- قيمة الإرجاع: لا شيء
skt.cb.on_skcp_check_ticket(skcp، تذكرة)
يتحقق خادم skcp من صحة التذكرة.
- النطاق الصالح: "proxy_server"، "tun_server"
- المعلمة
- كائن skcp
- تذكرة: تذكرة تحتاج إلى التحقق، سلسلة
- قيمة الإرجاع:
- إرجاع 0 إذا تم التحقق بنجاح
- إذا فشل التحقق، يتم إرجاع قيمة غير الصفر.
skt.cb.on_skcp_recv_cid(skcp, سيد)
يتلقى skcp cid، مما يشير إلى أنه تم إنشاء اتصال بنجاح مع خادم skcp. وهذا يعني أنه يتم إرجاع البنية غير المتزامنة لـ "skt.api.skcp_req_cid(skcp, Ticket)".
- النطاق الصالح: "proxy_client"، "tun_client"
- المعلمة
- كائن skcp
- cid: معرف اتصال skcp، عدد صحيح
- قيمة الإرجاع: لا شيء
skt.cb.on_skcp_recv_data(skcp, cid, buf)
يتلقى skcp البيانات المقابلة لاتصال cid.
- النطاق الصالح: جميع الأوضاع
- المعلمة
- كائن skcp
- cid: معرف اتصال skcp، عدد صحيح
- buf: محتوى الرسالة المستلمة، السلسلة
- قيمة الإرجاع: لا شيء
skt.cb.on_skcp_إغلاق (skcp، البحث الجنائي)
قد يكون سبب رد الاتصال عند إغلاق skcp للاتصال هو انتهاء المهلة أو تلقي أمر إغلاق من النظير، ولم يتم إغلاق الاتصال فعليًا في الوقت الحالي.
- النطاق الصالح: جميع الأوضاع
- المعلمة
- كائن skcp
- cid: معرف اتصال skcp، عدد صحيح
- قيمة الإرجاع: لا شيء
skt.cb.on_tcp_accept(fd)
يتلقى خادم TCP طلب اتصال.
- النطاق الصالح: "proxy_client"، "tun_client"
- المعلمة
- fd: fd المطلوب بواسطة الاتصال، عدد صحيح
- قيمة الإرجاع: لا شيء
skt.cb.on_tcp_recv(fd, buf)
احصل على بيانات TCP المقابلة لاتصال fd.
- النطاق الصالح: جميع الأوضاع
- المعلمة
- fd: fd للاتصال، عدد صحيح
- buf: محتوى الرسالة المستلمة، السلسلة
- قيمة الإرجاع: لا شيء
skt.cb.on_tcp_Close(fd)
أغلق اتصال tcp المطابق لـ fd. لم يتم إغلاق الاتصال فعليًا في هذه اللحظة.
- النطاق الصالح: جميع الأوضاع
- المعلمة
- قيمة الإرجاع: لا شيء
skt.cb.on_tun_read(buf)
تلقي البيانات من بطاقة الشبكة الافتراضية.
- النطاق الصالح: "tun_client"، "tun_server"
- المعلمة
- buf: محتوى الرسالة المستلمة، السلسلة
- قيمة الإرجاع: لا شيء
skt.cb.on_beat()
يطلق مكالمة كل ثانية.
- النطاق الصالح: "proxy_client"، "tun_client"
- المعلمات: لا يوجد
- قيمة الإرجاع: لا شيء
امتحان
بيئة
- الخادم: لينكس/1C/1G
- العميل: ماك/8C/8G
- حالة الشبكة، قيمة ping:
21 packets transmitted, 20 packets received, 4.8% packet loss
round-trip min/avg/max/stddev = 159.492/164.087/171.097/3.232 ms
بيانات العملية (RTT)
- عدد الاتصالات: 1؛ حزم البيانات: 1000؛ الفاصل الزمني للإرسال: 100 مللي ثانية
TCP RTT:
------------
Min = 161.0
Max = 1239.0
Average = 293.956
NR = 1000
Skcptun RTT:
------------
Min = 160.0
Max = 487.0
Average = 181.618
NR = 1000
- عدد الاتصالات: 10؛ حزم البيانات: 1000؛ الفاصل الزمني للإرسال: 100 مللي ثانية
TCP RTT:
------------
Min = 159.0
Max = 1076.0
Average = 262.500
NR = 10000
Skcptun RTT:
------------
Min = 159.0
Max = 534.0
Average = 174.251
NR = 10000
ختاماً
- في ظل نفس بيئة الشبكة، يكون تأثير تحسين السرعة حوالي 30%-40%.
يلاحظ
- لقد انتهيت للتو من الكتابة، للاستخدام الشخصي ويتم تحسين الوظائف
- يرجى التأكد من عدم استخدامه لتسريع وكيل التشفير sock5؟