إعادة كتابة حزم الشبكة أثناء الطيران باستخدام libnetfilter_queue
-
28-09-2019 - |
سؤال
أحاول كتابة تطبيق مساحة المستخدمين يمكنه ربط مكدس شبكة نظام التشغيل ، وحزم شم الطيران في الماضي وتحرير تلك التي تهتم بها.
بعد الكثير من googling ، يبدو لي أن أبسط طريقة (ولكنها قوية بشكل معقول) للقيام بذلك (على أي منصة) هي Linux libnetfilter_queue
مشروع. ومع ذلك ، أواجه مشكلة في العثور على أي وثائق معقولة للمشروع ، خارج المحدود الرسمية توثيق. ميزاتها الرئيسية (كما ذكر الرابط الأول)
- تلقي حزم قائمة انتظار من نظام kernel nfnetlink_queue
- إصدار أحكام و/أو تعزيز الحزم المعدلة إلى نظام kernel nfnetlink_queue
التركيز هو بلدي. كيف أقصد بالضبط أن أذهب إلى هذا؟ لقد حاولت تعديل عينة تم توفير الكود ، لكن ربما أساء فهم شيء ما. الكود يعمل في NFQNL_COPY_PACKET
الوضع ، لذلك أنا صباحا استلام الحزمة بأكملها - ولكن يبدو أن تعديلات على ذلك مقصورة على طلبي الخاص - كما يتوقع المرء ، بالنظر إلى دلالات "النسخة".
شعوري هو أنني من المفترض أن أستفيد من NF_QUEUE
بطريقة ما ، لكنني لم أكن أهدئها تمامًا. أي مؤشرات؟
(إذا كانت هناك آلية أبسط للقيام بذلك ، والتي هي أيضًا منصة متقاطعة ، أحب أن أسمع عنها!)
المحلول
لا أصدق أنني فاتني هذا سابقًا. وبقدر ما أقوم بنشر أسئلة على ذلك ، اعتقدت أنني لن أعمل أبداً على هذا بنفسي. قون
لم أنظر إلى النموذج الأولي للوظيفة بشكل صحيح. اتضح في وظيفة "الحكم" (الموضحة أدناه) ،
int nfq_set_verdict(struct nfq_q_handle *qh,
u_int32_t id,
u_int32_t verdict,
u_int32_t data_len,
const unsigned char *buf
)
آخر المعلمتين هي أن تكون البيانات عاد إلى مكدس الشبكة. من الواضح بعد فوات الأوان ، لكنني فاتني ذلك تمامًا كما print_pkt
الوظيفة لا تأخذ بيانات الحزمة كمعلمة ، ولكنها تستخرجها من struct nfq_data
.
المفتاح هو NF_ACCEPT
الحزمة وتمرير الحزمة المعدلة بشكل مناسب إلى kernel.
نصائح أخرى
مجرد تخمين وحشي من الحفر حول الكود المصدر: حاول إضافة حمولة مشوهة بشكل صريح باستخدام nfnl_addattr_l(…, NFQA_PAYLOAD, …)
?