نظرة عامة
هذه الصفحة تتعلق بتضمين ملف I2P router الثنائي بالكامل مع تطبيقك. وهي لا تتعلق بكتابة تطبيق للعمل مع I2P (سواء كان مُضمَّناً أو خارجياً). ومع ذلك، قد تكون العديد من الإرشادات مفيدة حتى لو لم تكن تُضمِّن router.
العديد من المشاريع تقوم بتجميع، أو تتحدث عن تجميع، I2P. هذا أمر رائع إذا تم بالطريقة الصحيحة. وإذا تم بطريقة خاطئة، فقد يسبب ضرراً حقيقياً لشبكتنا. إن I2P router معقد، وقد يكون من التحدي إخفاء كل هذا التعقيد عن المستخدمين. تناقش هذه الصفحة بعض الإرشادات العامة.
تنطبق معظم هذه الإرشادات بالتساوي على Java I2P أو i2pd. ومع ذلك، بعض الإرشادات خاصة بـ Java I2P وهي مذكورة أدناه.
تحدث معنا
ابدأ حواراً. نحن هنا للمساعدة. التطبيقات التي تدمج I2P هي الفرص الأكثر واعدة - ومثيرة - لنا لنمو الشبكة وتحسين إخفاء الهوية للجميع.
اختر router الخاص بك بحكمة
إذا كان تطبيقك بلغة Java أو Scala، فالخيار سهل - استخدم router الـ Java. إذا كان بلغة C/C++، نوصي بـ i2pd. تطوير i2pcpp قد توقف. للتطبيقات بلغات أخرى، من الأفضل استخدام SAM أو BOB أو SOCKS وتضمين router الـ Java كعملية منفصلة. بعض النقاط التالية تنطبق فقط على router الـ Java.
الترخيص
تأكد من أنك تلبي متطلبات الترخيص للبرنامج الذي تقوم بتجميعه.
التكوين
التحقق من الإعدادات الافتراضية
التكوين الافتراضي الصحيح أمر بالغ الأهمية. معظم المستخدمين لن يغيروا الإعدادات الافتراضية. الإعدادات الافتراضية لتطبيقك قد تحتاج إلى أن تكون مختلفة عن الإعدادات الافتراضية للـ router الذي تقوم بتجميعه معها. قم بتجاوز الإعدادات الافتراضية للـ router إذا لزم الأمر.
بعض الإعدادات الافتراضية المهمة للمراجعة: الحد الأقصى لعرض النطاق الترددي، وكمية وطول الأنفاق tunnel، والحد الأقصى للأنفاق المشاركة. يعتمد الكثير من هذا على عرض النطاق الترددي المتوقع وأنماط الاستخدام لتطبيقك.
قم بتكوين عرض نطاق ترددي وأنفاق كافية للسماح لمستخدميك بالمساهمة في الشبكة. فكر في تعطيل I2CP الخارجي، حيث أنك على الأرجح لا تحتاجه وقد يتعارض مع أي مثيل I2P آخر قيد التشغيل. انظر أيضاً إلى التكوينات لتعطيل إيقاف JVM عند الخروج، على سبيل المثال.
اعتبارات حركة المرور المشاركة
قد يكون من المغري لك تعطيل المشاركة في حركة المرور. هناك عدة طرق للقيام بذلك (الوضع المخفي، تعيين الحد الأقصى للأنفاق إلى 0، تعيين النطاق الترددي المشترك أقل من 12 كيلوبايت/ثانية). بدون المشاركة في حركة المرور، لا تحتاج للقلق بشأن الإغلاق السلس، ولن يرى المستخدمون لديك استهلاك النطاق الترددي الذي لم ينتجوه، إلخ. ومع ذلك، هناك الكثير من الأسباب التي تجعلك تسمح بالمشاركة في الأنفاق.
أولاً، لا يعمل الـ router بشكل جيد إذا لم تتح له الفرصة “للاندماج” مع الشبكة، وهذا ما يتحسن بشكل كبير عندما يقوم الآخرون ببناء الـ tunnels عبر جهازك.
ثانياً، أكثر من 90% من routers في الشبكة الحالية تسمح بمرور حركة المرور المشاركة. هذا هو الإعداد الافتراضي في Java router. إذا كان تطبيقك لا يوجه البيانات للآخرين وأصبح شائعاً جداً، فإنه يصبح عالة على الشبكة، ويخل بالتوازن الموجود حالياً. إذا أصبح كبيراً جداً، فسنصبح مثل Tor، ونقضي وقتنا في التوسل للناس لتفعيل التوجيه.
ثالثاً، حركة البيانات المشاركة هي حركة تغطية تساعد في إخفاء هوية مستخدميك.
ننصح بشدة بعدم تعطيل حركة المرور المشاركة بشكل افتراضي. إذا قمت بذلك وأصبح تطبيقك شائعاً جداً، فقد يؤدي ذلك إلى كسر الشبكة.
الاستمرارية
يجب عليك حفظ بيانات الـ router (netdb، التكوين، إلخ) بين عمليات تشغيل الـ router. I2P لا يعمل بشكل جيد إذا كان عليك إعادة البذر في كل بدء تشغيل، وهذا عبء كبير على خوادم إعادة البذر الخاصة بنا، وليس جيداً جداً لإخفاء الهوية أيضاً. حتى لو كنت تجمع معلومات الـ router، فإن I2P يحتاج إلى بيانات ملف التعريف المحفوظة للحصول على أفضل أداء. بدون الاستمرارية، سيحصل المستخدمون لديك على تجربة بدء تشغيل سيئة.
هناك احتمالان إذا لم تتمكن من توفير الاستمرارية. أي من هذين الخيارين سيلغي حمولة مشروعك على خوادم إعادة البذر الخاصة بنا وسيحسن بشكل كبير من وقت بدء التشغيل.
قم بإعداد خادم (خوادم) reseed خاص بمشروعك يقدم عدداً أكبر بكثير من العدد المعتاد من معلومات الـ router في الـ reseed، لنقل عدة مئات. اضبط الـ router لاستخدام خوادمك فقط.
قم بتضمين ألف إلى ألفي معلومة router في برنامج التثبيت الخاص بك.
أيضاً، قم بتأخير أو تدريج بدء تشغيل الـ tunnel الخاص بك، لإعطاء الـ router فرصة للتكامل قبل بناء الكثير من الـ tunnels.
قابلية التكوين
امنح مستخدميك طريقة لتغيير إعدادات الخيارات المهمة. نحن ندرك أنك قد ترغب في إخفاء معظم تعقيدات I2P، لكن من المهم إظهار بعض الإعدادات الأساسية. بالإضافة إلى الإعدادات الافتراضية المذكورة أعلاه، قد تكون بعض إعدادات الشبكة مثل UPnP وIP/port مفيدة.
اعتبارات Floodfill
فوق إعداد عرض نطاق ترددي معين، وعند استيفاء معايير صحة أخرى، سيصبح router الخاص بك floodfill، مما قد يسبب زيادة كبيرة في الاتصالات واستخدام الذاكرة (على الأقل مع Java router). فكر فيما إذا كان ذلك مقبولاً. يمكنك تعطيل floodfill، لكن عندها لن يساهم المستخدمون الأسرع لديك بما يمكنهم المساهمة به. كما يعتمد الأمر أيضاً على وقت التشغيل المعتاد لتطبيقك.
إعادة البذر
قرر ما إذا كنت ستقوم بتجميع معلومات router أم ستستخدم مضيفي إعادة البذر الخاصين بنا. قائمة مضيفي إعادة البذر الخاصة بـ Java موجودة في الكود المصدري، لذا إذا حافظت على تحديث المصدر الخاص بك، ستكون قائمة المضيفين محدثة أيضاً. كن على علم بإمكانية الحجب من قبل الحكومات المعادية.
استخدم العملاء المشتركين
Java I2P i2ptunnel يدعم العملاء المشتركين، حيث يمكن تكوين العملاء لاستخدام مجموعة واحدة. إذا كنت تحتاج إلى عملاء متعددين، وإذا كان ذلك متسقاً مع أهدافك الأمنية، قم بتكوين العملاء ليكونوا مشتركين.
تحديد كمية الـ tunnel
حدد كمية الـ tunnel صراحة باستخدام الخيارات inbound.quantity و outbound.quantity. الافتراضي في Java I2P هو 2؛ الافتراضي في i2pd أعلى. حدد في سطر SESSION CREATE باستخدام SAM للحصول على إعدادات متسقة مع كلا الـ router. اثنان لكل من الداخل/الخارج كافيان لمعظم التطبيقات ذات النطاق الترددي المنخفض إلى المتوسط والتوزيع المنخفض إلى المتوسط. قد تحتاج الخوادم وتطبيقات P2P عالية التوزيع إلى المزيد. راجع هذا المنشور في المنتدى
للحصول على إرشادات حول حساب المتطلبات للخوادم والتطبيقات عالية الحركة.
تحديد SAM SIGNATURE_TYPE
SAM يستخدم DSA_SHA1 افتراضياً للوجهات، وهذا ليس ما تريده. Ed25519 (النوع 7) هو الاختيار الصحيح. أضف SIGNATURE_TYPE=7 إلى أمر DEST GENERATE، أو إلى أمر SESSION CREATE للـ DESTINATION=TRANSIENT.
تحديد جلسات SAM
معظم التطبيقات ستحتاج فقط إلى جلسة SAM واحدة. يوفر SAM القدرة على إرهاق router المحلي بسرعة، أو حتى الشبكة الأوسع، إذا تم إنشاء عدد كبير من الجلسات. إذا كان بإمكان عدة خدمات فرعية استخدام جلسة واحدة، فقم بإعدادها بجلسة PRIMARY و SUBSESSIONS (غير مدعوم حاليًا على i2pd). الحد المعقول للجلسات هو 3 أو 4 إجمالي، أو ربما حتى 10 في المواقف النادرة. إذا كان لديك جلسات متعددة، تأكد من تحديد كمية tunnel منخفضة لكل واحدة، انظر أعلاه.
في أي حالة تقريباً لا يجب أن تحتاج إلى جلسة فريدة لكل اتصال. بدون تصميم دقيق، قد يؤدي هذا بسرعة إلى مهاجمة الشبكة بـ DDoS. فكر بعناية فيما إذا كانت أهدافك الأمنية تتطلب جلسات فريدة. يرجى استشارة مطوري Java I2P أو i2pd قبل تنفيذ جلسات لكل اتصال.
تقليل استخدام موارد الشبكة
لاحظ أن هذه الخيارات غير مدعومة حالياً في i2pd. هذه الخيارات مدعومة عبر I2CP و SAM (باستثناء delay-open، والذي متوفر عبر i2ptunnel فقط). راجع وثائق I2CP (وبالنسبة لـ delay-open، راجع وثائق تكوين i2ptunnel) للتفاصيل.
فكر في تعيين أنفاق تطبيقك على delay-open و reduce-on-idle و/أو close-on-idle. هذا أمر مباشر إذا كنت تستخدم i2ptunnel ولكن ستحتاج إلى تنفيذ بعضه بنفسك إذا كنت تستخدم I2CP مباشرة. راجع i2psnark للحصول على كود يقلل عدد الأنفاق ثم يغلق النفق، حتى في وجود بعض نشاط DHT في الخلفية.
دورة الحياة
قابلية التحديث
اجعل ميزة التحديث التلقائي متاحة إن أمكن ذلك، أو على الأقل إشعار تلقائي عند توفر إصدار جديد. أكبر مخاوفنا هو وجود عدد كبير من أجهزة router في الشبكة لا يمكن تحديثها. لدينا حوالي 6-8 إصدارات سنوياً من Java router، ومن الأهمية الحاسمة لصحة الشبكة أن يواكب المستخدمون التحديثات. عادة ما يكون لدينا أكثر من 80% من الشبكة على أحدث إصدار خلال 6 أسابيع من الإصدار، ونود الحفاظ على ذلك. لا تحتاج للقلق بشأن تعطيل وظيفة التحديث التلقائي المدمجة في router، حيث أن هذا الكود موجود في router console، والذي من المفترض أنك لا تقوم بتضمينه.
النشر
احرص على وضع خطة طرح تدريجية. لا تغمر الشبكة دفعة واحدة. لدينا حاليًا حوالي 25 ألف مستخدم فريد يوميًا و40 ألف مستخدم فريد شهريًا. من المحتمل أننا قادرون على التعامل مع نمو بمعدل 2-3 أضعاف سنويًا دون مشاكل كبيرة. إذا كنت تتوقع تسارعًا أسرع من ذلك، أو إذا كان توزيع عرض النطاق الترددي (أو توزيع وقت التشغيل، أو أي خاصية مهمة أخرى) لقاعدة المستخدمين لديك يختلف بشكل كبير عن قاعدة المستخدمين الحالية لدينا، فنحن بحاجة حقًا لإجراء مناقشة. كلما كانت خطط النمو لديك أكبر، كلما أصبح كل شيء آخر في هذه القائمة المرجعية أكثر أهمية.
تصميم وتشجيع أوقات التشغيل الطويلة
أخبر المستخدمين أن I2P يعمل بشكل أفضل إذا استمر في العمل. قد يستغرق الأمر عدة دقائق بعد بدء التشغيل قبل أن يعمل بشكل جيد، وحتى أكثر من ذلك بعد التثبيت الأول. إذا كان متوسط وقت التشغيل أقل من ساعة، فمن المحتمل أن I2P ليس الحل المناسب.
واجهة المستخدم
عرض الحالة
قدم بعض الإشارة للمستخدم بأن tunnels التطبيق جاهزة. شجع على الصبر.
الإيقاف التدريجي
إذا كان ذلك ممكناً، أجل إيقاف التشغيل حتى تنتهي صلاحية الأنفاق المشاركة الخاصة بك. لا تدع المستخدمين يقطعون الأنفاق بسهولة، أو على الأقل اطلب منهم التأكيد.
التعليم والتبرع
سيكون من الجيد إذا قدمت لمستخدميك روابط لتعلم المزيد حول I2P وللتبرع.
خيار Router الخارجي
حسب قاعدة المستخدمين والتطبيق الخاص بك، قد يكون من المفيد توفير خيار أو حزمة منفصلة لاستخدام router خارجي.
مواضيع أخرى
استخدام الخدمات الشائعة الأخرى
إذا كنت تخطط لاستخدام أو الربط بخدمات I2P الشائعة الأخرى (تغذيات الأخبار، اشتراكات hosts.txt، المتتبعات، outproxies، إلخ)، تأكد من أنك لا تُحمّلها أكثر من طاقتها، وتحدث مع الأشخاص الذين يديرونها للتأكد من أن ذلك مقبول.
مشاكل الوقت / NTP
ملاحظة: هذا القسم يشير إلى Java I2P. i2pd لا يتضمن عميل SNTP.
يتضمن I2P عميل SNTP. يتطلب I2P وقتاً صحيحاً للعمل. سوف يقوم بتعويض انحراف ساعة النظام ولكن قد يؤخر هذا بدء التشغيل. يمكنك تعطيل استعلامات SNTP الخاصة بـ I2P، ولكن هذا غير منصوح به إلا إذا كان تطبيقك يضمن صحة ساعة النظام.
اختر ما تجمعه وكيف تجمعه
ملاحظة: هذا القسم يشير إلى Java I2P فقط.
كحد أدنى ستحتاج إلى i2p.jar و router.jar و streaming.jar و mstreaming.jar. يمكنك حذف ملفي streaming jar للتطبيقات التي تستخدم datagram فقط. قد تحتاج بعض التطبيقات إلى المزيد، مثل i2ptunnel.jar أو addressbook.jar. لا تنس jbigi.jar، أو جزء منه للمنصات التي تدعمها، لجعل التشفير أسرع بكثير. يتطلب Java 7 أو أحدث للبناء. إذا كنت تبني حزم Debian / Ubuntu، يجب أن تطلب حزمة I2P من PPA الخاص بنا بدلاً من تضمينها. من المؤكد تقريباً أنك لن تحتاج إلى susimail و susidns ووحدة تحكم router و i2psnark، على سبيل المثال.
يجب تضمين الملفات التالية في دليل تثبيت I2P، المحدد بخاصية “i2p.dir.base”. لا تنس دليل certificates/ الذي مطلوب لإعادة البذر، وملف blocklist.txt للتحقق من صحة عناوين IP. دليل geoip اختياري، ولكنه موصى به حتى يتمكن الـ router من اتخاذ قرارات بناءً على الموقع الجغرافي. إذا كنت تتضمن geoip، تأكد من وضع ملف GeoLite2-Country.mmdb في ذلك الدليل (قم بفك ضغطه من installer/resources/GeoLite2-Country.mmdb.gz). قد يكون ملف hosts.txt ضرورياً، يمكنك تعديله لتضمين أي مضيفات يستخدمها تطبيقك. يمكنك إضافة ملف router.config إلى الدليل الأساسي لتجاوز الإعدادات الافتراضية الأولية. راجع وحرر أو احذف ملفي clients.config و i2ptunnel.config.
قد تتطلب متطلبات الترخيص منك تضمين ملف LICENSES.txt ودليل التراخيص.
- قد ترغب أيضًا في تجميع ملف hosts.txt.
- تأكد من تحديد bootclasspath إذا كنت تقوم بتجميع Java I2P لإصدارك، بدلاً من أخذ الملفات التنفيذية الخاصة بنا.
اعتبارات Android
ملاحظة: يشير هذا القسم إلى Java I2P فقط.
يمكن مشاركة تطبيق router الخاص بنا على Android بين عدة عملاء. إذا لم يكن مثبتاً، سيتم تنبيه المستخدم عند بدء تشغيل تطبيق العميل.
لقد عبر بعض المطورين عن قلقهم من أن هذه تجربة مستخدم ضعيفة، ويرغبون في دمج الـ router في تطبيقهم. لدينا فعلاً مكتبة خدمة router لنظام Android في خريطة الطريق الخاصة بنا، والتي يمكن أن تجعل عملية الدمج أسهل. نحتاج إلى مزيد من المعلومات.
إذا كنت بحاجة إلى مساعدة، يرجى الاتصال بنا.
ملفات Maven jar
ملاحظة: هذا القسم يشير إلى Java I2P فقط.
لدينا عدد محدود من ملفات jar الخاصة بنا على Maven Central . هناك العديد من تذاكر trac التي نحتاج لمعالجتها والتي ستحسن وتوسع ملفات jar المنشورة على Maven Central.
إذا كنت بحاجة إلى مساعدة، يرجى الاتصال بنا.
اعتبارات Datagram (DHT)
إذا كان تطبيقك يستخدم I2P datagrams، على سبيل المثال لـ DHT، فهناك الكثير من الخيارات المتقدمة المتاحة لتقليل الحمولة الإضافية وزيادة الموثوقية. قد يستغرق هذا بعض الوقت والتجريب للحصول على عمل جيد. كن على دراية بمقايضات الحجم/الموثوقية. تحدث معنا للحصول على المساعدة. من الممكن - ومُستحسن - استخدام Datagrams و Streaming على نفس الـ Destination. لا تُنشئ Destinations منفصلة لهذا الغرض. لا تحاول تخزين بياناتك غير المترابطة في DHTs الشبكة الموجودة (iMule، bote، bittorrent، و router). أبني DHT خاص بك. إذا كنت تقوم بترميز seed nodes بشكل ثابت، نوصي بأن يكون لديك عدة منها.
Outproxies
I2P outproxies إلى الشبكة العادية مورد محدود. استخدم outproxies فقط لتصفح الويب العادي الذي يبدأه المستخدم أو حركة البيانات المحدودة الأخرى. لأي استخدام آخر، استشر واحصل على موافقة من مشغل outproxy.
التسويق المشترك
لنعمل معاً. لا تنتظر حتى ينتهي العمل. أعطنا حساب Twitter الخاص بك وابدأ بالتغريد حول الموضوع، وسنبادلك المعروف.
البرامج الضارة
يرجى عدم استخدام I2P لأغراض شريرة. قد يسبب ذلك ضررًا كبيرًا لشبكتنا وسمعتنا.
انضم إلينا
قد يبدو هذا واضحاً، ولكن انضم إلى المجتمع. شغّل I2P على مدار الساعة طوال أيام الأسبوع. أنشئ موقع I2P حول مشروعك. تواجد في IRC #i2p-dev. انشر في المنتديات. انشر الكلمة. يمكننا مساعدتك في الحصول على مستخدمين ومختبرين ومترجمين أو حتى مبرمجين.
أمثلة
أمثلة التطبيقات
قد ترغب في تثبيت تطبيق I2P Android والتجريب معه، والاطلاع على الكود الخاص به، كمثال على تطبيق يحتوي على router مدمج. انظر إلى ما نعرضه للمستخدم وما نخفيه. اطلع على آلة الحالة (state machine) التي نستخدمها لبدء وإيقاف router. أمثلة أخرى تشمل: Vuze، تطبيق Nightweb Android، iMule، TAILS، iCloak، وMonero.
مثال الكود
ملاحظة: هذا القسم يشير إلى Java I2P فقط.
لا شيء مما سبق يخبرك فعلياً بكيفية كتابة الكود الخاص بك لحزم Java router، لذا فيما يلي مثال موجز.
import java.util.Properties;
import net.i2p.router.Router;
Properties p = new Properties();
// add your configuration settings, directories, etc.
// where to find the I2P installation files
p.addProperty("i2p.dir.base", baseDir);
// where to find the I2P data files
p.addProperty("i2p.dir.config", configDir);
// bandwidth limits in K bytes per second
p.addProperty("i2np.inboundKBytesPerSecond", "50");
p.addProperty("i2np.outboundKBytesPerSecond", "50");
p.addProperty("router.sharePercentage", "80");
p.addProperty("foo", "bar");
Router r = new Router(p);
// don't call exit() when the router stops
r.setKillVMOnEnd(false);
r.runRouter();
...
r.shutdownGracefully();
// will shutdown in 11 minutes or less
هذا الكود مخصص للحالة التي يقوم فيها تطبيقك ببدء تشغيل الـ router، كما هو الحال في تطبيق Android الخاص بنا. يمكنك أيضاً جعل الـ router يبدأ تشغيل التطبيق عبر ملفات clients.config و i2ptunnel.config، مع تطبيقات Jetty الويب، كما يتم في حزم Java الخاصة بنا. كما هو الحال دائماً، إدارة الحالة هي الجزء الصعب.
انظر أيضاً: مستندات Router javadocs .