سؤال

أنا أعمل على تطبيق يراقب استخدام الشبكة. ومع ذلك ، لاحظت العديد من الطرق للقيام بذلك لا تسمح باستبعاد حركة المرور المحلية (على سبيل المثال ، آلة الوقت).

أنا أبحث عن وسيلة لاستبعاد حركة المرور المحلية ، وأراقب فقط الاستخدام الذي يذهب مباشرة إلى/من الإنترنت.

تحديث: شكرًا لك على ردودك ، الآن أعرف كيف أجد ما إذا كانت حركة المرور محلية ، لكنني ما زلت لا أعرف كيف يمكنني حساب Total In/Out Bytes (آسف إذا لم أكن أشرح سابقًا). ليس لدي أي طريقة لمعرفة عدد البايتات التي يتم إرسالها/استلامها محليًا (أو إلى الإنترنت) في فترة زمنية معينة ، أو منذ بدء تشغيل نظام التشغيل. تزيد هذه المشكلة أو يتم إطلاق عمليات الحقائق أو قتلها عند تشغيل نظام التشغيل.

الجواب على السؤال كيفية الحصول على إحصائيات محول الشبكة في Linux/Mac OSX؟ يعطي طريقة مثيرة للاهتمام لتجميع الاستخدام الكلي ولكنه لا يساعد لأن استخدامه هو إحصائيات الواجهة.

تحديث 2: لقد نشرت الحل النهائي لهذا. يرجى التمرير لأسفل قليلا لترى.

هل كانت مفيدة؟

المحلول 8

حل العمل النهائي الذي لدي هو استخدام libpcap لتحقيق هذا. بالطبع هناك بعض الجوانب السلبية ، والتي تتضمن أنها تتطلب امتيازات مرتفعة ويجب أن تلتقط جميع الحزم المصفاة لحساب الإحصاءات ، ولكنها على الأقل تعمل بشكل جيد.

العديد من الوثائق والدروس التعليمية libpcap شامل وواضح إلى حد ما ، أقترح كل شخص مهتم بهذا الحل للنظر إلى أولئك الذين لديهم جهد قليل نسبيًا من Google-FU.

كما أنه قد يثير اهتمامًا قليلًا أن مرشح حركة المرور على الإنترنت هو ببساطة ما يلي -

- (NSString *)_internetFilterStringForInterface:(AKNetworkInterface *)interface
    inOrOut:(BOOL)inYesOutNo
{
    if (![interface net] || ![interface mask] || IsEmpty([interface addresses]))
    {
        return nil;
    }

    NSString *hostType = inYesOutNo ? @"dst" : @"src";
    NSString *host = nil;
    for (NSString *hostComponent in [interface addresses])
    {
        if (IsEmpty(hostComponent)) continue;
        if (!host)
            host = [NSString stringWithFormat:@"(%@ host %@", hostType, hostComponent];
        else
            host = [host stringByAppendingFormat:@" or %@ host %@", hostType, hostComponent];
    }
    host = [host stringByAppendingString:@")"];

    NSString *net = [interface netString];
    net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""];

    NSString *filter = [NSString stringWithFormat:
                        @"ip and (not %@ net %@) and %@",
                        inYesOutNo ? @"src" : @"dst",
                        net, host];
    return filter;
}

تم تصميم المرشح مع بعض الإجابات حول ما يعتبر "حركة المرور المحلية" ، وأنا أعلم أنه لا يشمل بعض الحالات الحافة مثل تكوينات NAT المزدوجة ، وما إلى ذلك ، لكنني أود أن أرى اقتراحات حول هذا الموضوع.

أنا أعرف net = [net stringByReplacingOccurrencesOfString:@".0" withString:@""]; هو مجرد اختراق سريع يمكن أن يفشل بسهولة في ظل بعض الظروف الغريبة ، ولكن لا أحد يشكو ، على الأقل ليس بعد.

نصائح أخرى

إن الإجابة على التعليق على الواجهات التي تحمل حركة المرور المحلية أمر معقد بالفعل ، لأنه يعتمد على ما تعنيه بحركة المرور المحلية.

ماذا تعني "المحلي"

أسهل معنى "حركة المرور المحلية" هو حركة المرور التي لا تترك الجهاز الذي تم إنشاؤه على (برنامجين على نفس الجهاز يتحدثان مع بعضهما البعض ، على سبيل المثال). هذه حركة المرور كلها تذهب أكثر من LO. هذا شيء يعنيه الناس عندما يقولون محليين (وما كنت أفكر فيه عندما أجبت).

سيكون المعنى الأسهل التالي هو "حركة مرور IP موجهة إلى الآلات على نفس الشبكة الفرعية". ستكون هذه حركة المرور التي لها عنوان وجهة داخل الشبكة الفرعية المحلية. ستكون أسهل طريقة لحساب ذلك إما جدول التوجيه (إذا كان Mac OS X يحسب إحصائيات حركة المرور لكل مسار ، فإن الطرق الموجودة على البوابات المختلفة ستمنحك حركة مرور غير محلية) أو مع قاعدة جدار الحماية. ربما لا يريد هذا أن يعني أي شخص عندما يقول "حركة المرور المحلية".

هناك معنى آخر هو "حركة مرور IP موجهة إلى الآلات في هذا الموقع (المادي)". على سبيل المثال ، في مكتبي لدينا العديد من الشبكات الفرعية المستخدمة ، مع أجهزة التوجيه بينهما ، ولكن حركة المرور من شبكة فرعية إلى أخرى لا تزال محلية بوضوح. تحتاج إلى معرفة الشبكة لتمييز حركة المرور المحلية ووحدة الحركة غير المحلية مع هذا التعريف.

هناك معنى آخر هو "حركة مرور IP موجهة إلى الآلات في مؤسستي". هذا معنى معقول اعتمادًا على كيفية إعداد شبكتك (على سبيل المثال ، ربما يكون لديك ألياف سريعة بين مواقعك ، ولكن اتصالات الإنترنت الخاصة بك أبطأ بكثير ، أو مشحونة لكل GB). يتطلب معرفة متعمقة بالشبكة لمعرفة ما إذا كانت وجهة ما محلية أم لا-مع أشياء مثل VPNs قد تختلف مع مرور الوقت.

أخيرًا ، "حركة المرور على الإنترنت" ليست عكس ذلك أي من هؤلاء. في بعض الأحيان ، على سبيل المثال ، ما يبدو أنه جهاز محلي في قطاع Ethernet الخاص بك هو في الواقع على VPN ، عبر الإنترنت (هذا ليس مجنونًا ، إنه مفيد جدًا عندما يحتاج المستخدمون عن بُعد إلى استخدام خدمات Windows المختلفة). يمكن لحركة المرور داخل مؤسستك السفر بسهولة عبر VPN على الإنترنت.

الغش في شبكات بسيطة

إذا كانت الشبكة بسيطة للغاية ، مع وجود شبكة فرعية داخلية واحدة فقط ، وجهاز توجيه واحد فقط ، وكل حركة المرور ليس إلى تلك الشبكة الفرعية الداخلية هي حركة المرور على الإنترنت ، يمكنك الغش وحل ذلك. ربما ينطبق هذا على الغالبية العظمى من شبكات المنازل ، والعديد من الشركات الصغيرة أيضًا.

باستخدام قواعد جدار الحماية

في إعداد شبكة بسيط ، ربما يمكنك وضع بعض الافتراضات ، والحصول على إجابة وثيقة بما يكفي من خلال حساب حركة المرور على أنها غير محلية إذا:

  • عنوان MAC الوجهة هو عنوان MAC الخاص بالبوابة الافتراضية ؛ و
  • عنوان IP الوجهة هو ليس عنوان IP للبوابة الافتراضية

بدلا من ذلك:

  • عنوان IP الوجهة ليس ضمن الشبكة الفرعية لواجهة الشبكة ، يخرج المسار الافتراضي

ربما يمكنك إنشاء قاعدة جدار الحماية لحساب أي من هؤلاء. على الأقل مع Linux iptables يمكنك ، وأنا متأكد تمامًا من BSD PF ، وربما Mac OS X.

النهج البديل: SNMP

أخيرًا ، إذا لم تتمكن من استخدام قاعدة جدار الحماية (كما يتطلب ذلك الجذر) ، يمكنك أن تأمل أن تستجيب البوابة الافتراضية لمجتمع SNMP ، واستكشاف جميع واجهاتها ، والعثور على عنوان IP خارج الشبكة ، ، ثم افترض أن هذا هو رابط الإنترنت. ثم يمكنك أن تطلب من جهاز التوجيه تعداد حركة المرور على تلك الواجهة.

بالطبع ، ستجد أن العديد من أجهزة توجيه Soho لا تدعم SNMP ، وأن أولئك الذين لا يتم تشغيله على الأرجح.

أفضل طريقة هي العثور على عنوان IP "الخارجي" من خلال eth0 أو eth1 أو أي محول مع استدعاء نظام إلى ifconfig. ثم سحب سجلات لأي نظام (الرسائل ، syslog ، أيا كان) وكتابة مرشح لعنوان IP الخارجي. لجعلها أجمل وأكثر قابلية للحمل ، اكتب regex من شأنها تصفية IPs القابلة للتوجيه للجمهور فقط وتصفية رسائل تسجيل الرسائل لعنوان IP "الخارجي".

تحتاج إلى قراءة المصدر لـ IfConfig (8) ، والذي يصف كيفية الحصول على حالة كل واجهة شبكة متصلة.

إيلاء اهتمام خاص لـ in_status () ، والذي يحصل على عنوان inet و netmask للواجهة.

عندما يكون لعنوان المصدر أو الوجهة في حركة المرور نفس المضيف مثل الواجهة المحلية

int is_local =
(src && netmask) == (ifaddr && netmask)
|| (dst && netmask) == (ifaddr && netmask)

ثم يمكنك التأكد من أنها محلية

http://www.opensource.apple.com/source/network_cmds/network_cmds-307/ifconfig.tproj/ifconfig.c

أعتقد ، حل تقريبي: يمكن استخدام getifaddrs للحصول على إحصائيات حول استخدام الشبكة.

يمكن أن تحصل على إحصائيات منفصلة لواجهات Wi-Fi و Wwan.

قد تجد المزيد من المعلومات من:

http://www.gsp.com/cgi-bin/man.cgi؟section=3&topic=getifaddrs

يعتمد ذلك على كيفية تعريفك "محليًا" ، ولكن التعريف الشائع هو النظر إلى قناع الشبكة.

على سبيل المثال ، إذا كان IP الخاص بك (أي IP للواجهة التي تراقبها

10.33.52.123
netmask 255.255.255.0

هذا يعني أن كل حزمة IP مع كل من المصدر IP و Destination-IP 10.33.52.xx محلي.

لا أعرف الكاكاو أو الهدف-C ، ولكن ربما يمكنك استخدام بعض هذه الوظائف التي تساعدك على استخراج الشبكة من IP-Address: http://developer.apple.com/library/mac/#documentation/darwin/reference/manpages/man3/inet_network.3.html

لا أعرف كيفية تنفيذها في Objective-C ، لكن الفكرة هي أنك تحصل على عنوان الشبكة التي أنت فيها (يمكنك معرفة ذلك من فئة الشبكة (A ، B ، C) استنادًا إلى IP المحلي أو من بتات في Netmask إذا لم تكن قياسية) ، فقط تحقق من عنوان الاتصال الصادر. إذا لم تكن الوجهة في شبكتك المحلية ، فقم بحساب حركة المرور ؛ إذا كان في ، فقط لا تفعل شيئًا.

هناك ثلاث نطاقات من عناوين IP غير القابلة للتصوير ، ويتم استخدامها عادةً كنطاقات عناوين لخدمات NAT. أي عنوان ليس في واحدة من نطاقات العناوين غير القابلة للتصوير هو عنوان خارجي.

بالطبع إذا لم تكن وراء جهاز توجيه NAT ، فإن المهمة أصعب (ومن الناحية الفنية ، تكون جميع العناوين أقل من 127.0.0.1 خارجيًا في هذه المرحلة).

نطاقات IP غير القابلة للتصوير هي:

10.0.0.0 - 10.255.255.255

172.16.0.0 - 172.31.255.255

192.168.0.0 - 192.168.255.255

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top