eBPF ট্রাফিক মনিটরিং

eBPF নেটওয়ার্ক ট্র্যাফিক টুল সর্বশেষ ডিভাইস বুট হওয়ার পর থেকে ডিভাইসে নেটওয়ার্ক ব্যবহার নিরীক্ষণ করতে কার্নেল এবং ব্যবহারকারীর স্থান বাস্তবায়নের সংমিশ্রণ ব্যবহার করে। এটি ফোনের অবস্থার উপর নির্ভর করে নেটওয়ার্ক অ্যাক্সেস থেকে অ্যাপগুলিকে ব্লক করতে সকেট ট্যাগিং, ফোরগ্রাউন্ড/ব্যাকগ্রাউন্ড ট্র্যাফিক আলাদা করা এবং প্রতি-UID ফায়ারওয়ালের মতো অতিরিক্ত কার্যকারিতা প্রদান করে। টুল থেকে সংগৃহীত পরিসংখ্যান eBPF maps নামে একটি কার্নেল ডেটা স্ট্রাকচারে সংরক্ষণ করা হয় এবং ফলাফলটি শেষ বুটের পর থেকে ক্রমাগত ট্রাফিক পরিসংখ্যান প্রদানের জন্য NetworkStatsService এর মতো পরিষেবা ব্যবহার করে।

উদাহরণ এবং উৎস

ব্যবহারকারীর স্থান পরিবর্তনগুলি প্রধানত system/netd এবং framework/base প্রকল্পগুলিতে হয়। AOSP-তে উন্নয়ন করা হচ্ছে, তাই AOSP কোড সবসময় আপ টু ডেট থাকবে। উৎসটি প্রধানত system/netd/server/TrafficController* , system/netd/bpfloader , এবং system/netd/libbpf/ এ অবস্থিত। কিছু প্রয়োজনীয় ফ্রেমওয়ার্ক পরিবর্তন framework/base/ এবং system/core রয়েছে।

বাস্তবায়ন

অ্যান্ড্রয়েড 9 দিয়ে শুরু করে, কার্নেল 4.9 বা তার উপরে চলমান অ্যান্ড্রয়েড ডিভাইসগুলি এবং পি রিলিজের সাথে পাঠানো হলে অবশ্যই xt_qtaguid এর পরিবর্তে eBPF-ভিত্তিক নেটওয়ার্ক ট্রাফিক মনিটরিং অ্যাকাউন্টিং ব্যবহার করতে হবে। নতুন অবকাঠামো আরও নমনীয় এবং আরও রক্ষণাবেক্ষণযোগ্য এবং গাছের বাইরের কার্নেল কোডের প্রয়োজন নেই।

উত্তরাধিকার এবং eBPF ট্রাফিক পর্যবেক্ষণের মধ্যে প্রধান নকশা পার্থক্য চিত্র 1 এ চিত্রিত করা হয়েছে।

উত্তরাধিকার এবং eBPF ট্র্যাফিক পর্যবেক্ষণ নকশা পার্থক্য

চিত্র 1. উত্তরাধিকার (বাম) এবং eBPF (ডান) ট্রাফিক পর্যবেক্ষণ নকশা পার্থক্য

নতুন trafficController ডিজাইনটি পার cgroup ইবিপিএফ ফিল্টারের পাশাপাশি কার্নেলের ভিতরে থাকা xt_bpf নেটফিল্টার মডিউলের উপর ভিত্তি করে তৈরি করা হয়েছে। এই eBPF ফিল্টারগুলি প্যাকেটে tx/rx প্রয়োগ করা হয় যখন তারা ফিল্টারের মধ্য দিয়ে যায়। cgroup eBPF ফিল্টারটি ট্রান্সপোর্ট লেয়ারে অবস্থিত এবং সকেট UID এর পাশাপাশি ইউজারস্পেস সেটিং এর উপর নির্ভর করে সঠিক UID এর বিপরীতে ট্রাফিক গণনার জন্য দায়ী। xt_bpf নেটফিল্টারটি bw_raw_PREROUTING এবং bw_mangle_POSTROUTING চেইনে যুক্ত এবং সঠিক ইন্টারফেসের বিপরীতে ট্রাফিক গণনা করার জন্য দায়ী।

বুট করার সময়, ইউজারস্পেস প্রসেস trafficController ডেটা সংগ্রহের জন্য ব্যবহৃত eBPF ম্যাপ তৈরি করে এবং sys/fs/bpf এ ভার্চুয়াল ফাইল হিসাবে সমস্ত মানচিত্র পিন করে। তারপর প্রিভিলেজড প্রসেস bpfloader প্রি-কম্পাইল করা eBPF প্রোগ্রামটিকে কার্নেলে লোড করে এবং সঠিক cgroup এ সংযুক্ত করে। সমস্ত ট্র্যাফিকের জন্য একটি একক রুট cgroup আছে তাই সমস্ত প্রক্রিয়া ডিফল্টরূপে সেই cgroup এ অন্তর্ভুক্ত করা উচিত।

রান টাইমে, trafficController traffic_cookie_tag_map এবং traffic_uid_counterSet_map লিখে একটি সকেটকে ট্যাগ/আনট্যাগ করতে পারে। NetworkStatsService traffic_tag_stats_map , traffic_uid_stats_map এবং traffic_iface_stats_map থেকে ট্রাফিক পরিসংখ্যানের ডেটা পড়তে পারে। ট্রাফিক পরিসংখ্যান সংগ্রহ ফাংশন ছাড়াও, trafficController এবং cgroup eBPF ফিল্টার ফোন সেটিংসের উপর নির্ভর করে নির্দিষ্ট UID থেকে ট্র্যাফিক ব্লক করার জন্য দায়ী। UID-ভিত্তিক নেটওয়ার্কিং ট্র্যাফিক ব্লকিং বৈশিষ্ট্য হল কার্নেলের ভিতরে থাকা xt_owner মডিউলের প্রতিস্থাপন এবং বিস্তারিত মোড traffic_powersave_uid_map , traffic_standby_uid_map এবং traffic_dozable_uid_map লিখে কনফিগার করা যেতে পারে।

নতুন বাস্তবায়ন লিগ্যাসি xt_qtaguid মডিউল বাস্তবায়ন অনুসরণ করে তাই TrafficController এবং NetworkStatsService হয় উত্তরাধিকার বা নতুন বাস্তবায়নের সাথে চলবে। অ্যাপটি যদি পাবলিক API ব্যবহার করে, তাহলে xt_qtaguid বা eBPF টুল ব্যাকগ্রাউন্ডে ব্যবহার করা হোক না কেন এটি কোনো পার্থক্য অনুভব করবে না।

ডিভাইস কার্নেল যদি অ্যান্ড্রয়েড কমন কার্নেল 4.9 (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 বা তার উপরে) উপর ভিত্তি করে হয়, তাহলে নতুন eBPF টুল বাস্তবায়নের জন্য HAL, ড্রাইভার বা কার্নেল কোডে কোনো পরিবর্তনের প্রয়োজন নেই।

প্রয়োজনীয়তা

  1. কার্নেল কনফিগারেশনে নিম্নলিখিত কনফিগারেশন চালু থাকতে হবে:

    1. CONFIG_CGROUP_BPF=y
    2. CONFIG_BPF=y
    3. CONFIG_BPF_SYSCALL=y
    4. CONFIG_NETFILTER_XT_MATCH_BPF=y
    5. CONFIG_INET_UDP_DIAG=y

    VTS কার্নেল কনফিগারেশন পরীক্ষাটি সহায়ক যখন সঠিক কনফিগারেশন চালু করা আছে কিনা তা যাচাই করার জন্য।

লিগ্যাসি xt_qtaguid অবচয় প্রক্রিয়া

নতুন eBPF টুলটি xt_qtaguid মডিউল এবং xt_owner মডিউলটির উপর ভিত্তি করে প্রতিস্থাপন করছে। আমরা অ্যান্ড্রয়েড কার্নেল থেকে xt_qtaguid মডিউলটি সরাতে শুরু করব এবং এর অপ্রয়োজনীয় কনফিগারগুলি অক্ষম করব।

অ্যান্ড্রয়েড 9 রিলিজে, xt_qtaguid মডিউলটি সমস্ত ডিভাইসে চালু করা হয়েছে, তবে সমস্ত পাবলিক API যেগুলি সরাসরি xt_qtaguid মডিউল proc ফাইলটি পড়ে সেগুলিকে NetworkManagement পরিষেবাতে সরানো হয়েছে। ডিভাইস কার্নেল সংস্করণ এবং প্রথম API স্তরের উপর নির্ভর করে, NetworkManagement পরিষেবা জানে যে eBPF সরঞ্জামগুলি চালু আছে কিনা এবং প্রতিটি অ্যাপ নেটওয়ার্ক ব্যবহারের স্ট্যাটাস পাওয়ার জন্য সঠিক মডিউল বেছে নেয়। SDK স্তর 28 এবং উচ্চতর অ্যাপগুলিকে সেপলিসি দ্বারা xt_qtaguid proc ফাইলগুলি অ্যাক্সেস করা থেকে ব্লক করা হয়েছে৷

9-এর পরে পরবর্তী অ্যান্ড্রয়েড রিলিজে, সেই xt_qtaguid proc ফাইলগুলিতে অ্যাপ অ্যাক্সেস সম্পূর্ণরূপে অবরুদ্ধ করা হবে আমরা নতুন অ্যান্ড্রয়েড সাধারণ কার্নেলগুলি থেকে xt_qtaguid মডিউলটি সরাতে শুরু করব। এটি সরানোর পরে, আমরা xt_qtaguid মডিউলটিকে স্পষ্টভাবে বন্ধ করতে সেই কার্নেল সংস্করণের জন্য অ্যান্ড্রয়েড বেস কনফিগারেশন আপডেট করব। একটি Android রিলিজের জন্য ন্যূনতম কার্নেল সংস্করণের প্রয়োজনীয়তা 4.9 বা তার বেশি হলে xt_qtaguid মডিউলটি সম্পূর্ণরূপে বাতিল হয়ে যাবে।

Android 9 রিলিজে, শুধুমাত্র Android 9 রিলিজের সাথে লঞ্চ হওয়া ডিভাইসগুলিতে নতুন eBPF বৈশিষ্ট্য থাকা প্রয়োজন। eBPF টুল সমর্থন করতে পারে এমন কার্নেলের সাথে পাঠানো ডিভাইসগুলির জন্য, আমরা Android 9 রিলিজে আপগ্রেড করার সময় এটিকে নতুন eBPF বৈশিষ্ট্যে আপডেট করার পরামর্শ দিই। সেই আপডেটটি কার্যকর করার জন্য কোন CTS পরীক্ষা নেই।

বৈধতা

আপনার নিয়মিত অ্যান্ড্রয়েড সাধারণ কার্নেল এবং অ্যান্ড্রয়েড এওএসপি প্রধান থেকে প্যাচ নেওয়া উচিত। নিশ্চিত করুন যে আপনার বাস্তবায়ন প্রযোজ্য VTS এবং CTS পরীক্ষা, netd_unit_test এবং libbpf_test পাস করেছে।

টেস্টিং

আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলি চালু আছে এবং প্রয়োজনীয় কার্নেল প্যাচগুলি ব্যাকপোর্ট করা আছে তা নিশ্চিত করতে কার্নেল নেট_টেস্ট রয়েছে। পরীক্ষাগুলি Android 9 রিলিজ VTS পরীক্ষার অংশ হিসাবে একত্রিত করা হয়েছে। system/netd/ ( netd_unit_test এবং libbpf_test ) এ কিছু ইউনিট পরীক্ষা আছে। নতুন টুলের সামগ্রিক আচরণ যাচাই করার জন্য netd_integration_test এ কিছু পরীক্ষা রয়েছে।

CTS এবং CTS যাচাইকারী

যেহেতু উভয় ট্র্যাফিক মনিটরিং মডিউলগুলি অ্যান্ড্রয়েড 9 রিলিজে সমর্থিত, তাই সমস্ত ডিভাইসে নতুন মডিউল প্রয়োগ করার জন্য কোনও CTS পরীক্ষা নেই৷ কিন্তু কার্নেল ভার্সন 4.9 এর থেকে উচ্চতর ডিভাইসগুলির জন্য যেগুলি মূলত Android 9 রিলিজের সাথে পাঠানো হয় (যেমন প্রথম API স্তর >= 28), নতুন মডিউলটি সঠিকভাবে কনফিগার করা হয়েছে তা যাচাই করার জন্য GSI-তে CTS পরীক্ষা রয়েছে। পুরানো CTS পরীক্ষা যেমন TrafficStatsTest , NetworkUsageStatsTest এবং CtsNativeNetTestCases ব্যবহার করা যেতে পারে আচরণটি পুরানো UID মডিউলের সাথে সামঞ্জস্যপূর্ণ হতে যাচাই করতে।

ম্যানুয়াল পরীক্ষা

system/netd/ ( netd_unit_test , netd_integration_test এবং libbpf_test ) এ কিছু ইউনিট পরীক্ষা আছে। ম্যানুয়ালি স্ট্যাটাস চেক করার জন্য ডাম্পসি সমর্থন আছে। কমান্ড dumpsys netd trafficController মডিউলের প্রাথমিক অবস্থা এবং eBPF সঠিকভাবে চালু হয়েছে কিনা তা দেখায়। ইবিপিএফ চালু থাকলে, কমান্ড dumpsys netd trafficcontroller ট্যাগ করা সকেট তথ্য, ট্যাগ প্রতি পরিসংখ্যান, ইউআইডি এবং আইফেস এবং মালিকের ইউআইডি মিল সহ প্রতিটি ইবিপিএফ মানচিত্রের বিস্তারিত বিষয়বস্তু দেখায়।

পরীক্ষার অবস্থান

CTS পরীক্ষা এখানে অবস্থিত:

VTS পরীক্ষাগুলি https://android.googlesource.com/kernel/tests/+/main/net/test/bpf_test.py- এ অবস্থিত।

ইউনিট পরীক্ষা এখানে অবস্থিত: