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

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

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

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

বাস্তবায়ন

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

লেগ্যাসি এবং ইবিপিএফ ট্র্যাফিক মনিটরিংয়ের মধ্যে প্রধান ডিজাইনগত পার্থক্যগুলো চিত্র ১-এ দেখানো হয়েছে।

লিগ্যাসি এবং ইবিপিএফ ট্র্যাফিক পর্যবেক্ষণ ডিজাইনের পার্থক্য

চিত্র ১. লিগ্যাসি (বাম) এবং ইবিপিএফ (ডান) ট্র্যাফিক মনিটরিং ডিজাইনের পার্থক্য

নতুন trafficController ডিজাইনটি কার্নেলের ভেতরের প্রতি- cgroup ইবিপিএফ ফিল্টার এবং xt_bpf নেটফিল্টার মডিউলের উপর ভিত্তি করে তৈরি। প্যাকেট যখন ফিল্টারের মধ্য দিয়ে যায়, তখন টিএক্স/আরএক্স-এর উপর এই ইবিপিএফ ফিল্টারগুলো প্রয়োগ করা হয়। cgroup ইবিপিএফ ফিল্টারটি ট্রান্সপোর্ট লেয়ারে অবস্থিত এবং এটি সকেট ইউআইডি ও ইউজারস্পেস সেটিং-এর উপর নির্ভর করে সঠিক ইউআইডি-র বিপরীতে ট্র্যাফিক গণনা করার জন্য দায়ী। 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_maptraffic_dozable_uid_map এ লিখে এর বিস্তারিত মোড কনফিগার করা যায়।

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

যদি ডিভাইস কার্নেলটি অ্যান্ড্রয়েড কমন কার্নেল ৪.৯ (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 মডিউলটি অপসারণ করা এবং এর অপ্রয়োজনীয় কনফিগারেশনগুলো নিষ্ক্রিয় করা শুরু করব।

অ্যান্ড্রয়েড ৯ রিলিজে, xt_qtaguid মডিউলটি সমস্ত ডিভাইসে চালু করা হয়েছে, কিন্তু যে সমস্ত পাবলিক এপিআই সরাসরি xt_qtaguid মডিউলের প্রোক ফাইল রিড করে, সেগুলোকে NetworkManagement Service-এর অধীনে নিয়ে আসা হয়েছে। ডিভাইসের কার্নেল ভার্সন এবং প্রথম এপিআই লেভেলের উপর নির্ভর করে, NetworkManagement Service জানতে পারে eBPF টুলস চালু আছে কিনা এবং সেই অনুযায়ী প্রতিটি অ্যাপের নেটওয়ার্ক ব্যবহারের পরিসংখ্যান পাওয়ার জন্য সঠিক মডিউলটি বেছে নেয়। sepolicy-এর কারণে SDK লেভেল ২৮ এবং তার উপরের অ্যাপগুলো xt_qtaguid প্রোক ফাইল অ্যাক্সেস করতে পারে না।

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

অ্যান্ড্রয়েড ৯ রিলিজে, শুধুমাত্র যে ডিভাইসগুলো অ্যান্ড্রয়েড ৯ রিলিজের সাথে লঞ্চ হয়, সেগুলোতে নতুন eBPF ফিচারটি থাকা আবশ্যক। যে ডিভাইসগুলো eBPF টুলস সাপোর্ট করতে সক্ষম কার্নেলসহ এসেছে, অ্যান্ড্রয়েড ৯ রিলিজে আপগ্রেড করার সময় আমরা সেগুলোকে নতুন eBPF ফিচারে আপডেট করার পরামর্শ দিই। এই আপডেটটি কার্যকর করার জন্য কোনো CTS টেস্ট নেই।

বৈধতা

আপনার নিয়মিতভাবে অ্যান্ড্রয়েড কমন কার্নেল এবং অ্যান্ড্রয়েড AOSP মেইন থেকে প্যাচ নেওয়া উচিত। নিশ্চিত করুন যে আপনার ইমপ্লিমেন্টেশনটি প্রযোজ্য VTS ও CTS টেস্ট, netd_unit_test এবং libbpf_test পাস করে।

পরীক্ষা

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

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

যেহেতু অ্যান্ড্রয়েড ৯ রিলিজে উভয় ট্র্যাফিক মনিটরিং মডিউলই সমর্থিত, তাই সমস্ত ডিভাইসে নতুন মডিউলটি প্রয়োগ করতে বাধ্য করার জন্য কোনো CTS টেস্ট নেই। কিন্তু যেসব ডিভাইসের কার্নেল ভার্সন ৪.৯-এর বেশি এবং যেগুলো মূলত অ্যান্ড্রয়েড ৯ রিলিজের সাথে আসে (অর্থাৎ প্রথম API লেভেল >= ২৮), সেগুলোর ক্ষেত্রে নতুন মডিউলটি সঠিকভাবে কনফিগার করা হয়েছে কিনা তা যাচাই করার জন্য GSI-তে CTS টেস্ট রয়েছে। এর আচরণ পুরোনো UID মডিউলের সাথে সামঞ্জস্যপূর্ণ কিনা তা যাচাই করার জন্য TrafficStatsTest , NetworkUsageStatsTest এবং CtsNativeNetTestCases এর মতো পুরোনো CTS টেস্টগুলো ব্যবহার করা যেতে পারে।

ম্যানুয়াল টেস্টিং

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

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

CTS পরীক্ষাগুলো নিম্নলিখিত স্থানে অবস্থিত:

VTS টেস্টগুলো https://android.googlesource.com/kernel/tests/+/android17-release/net/test/bpf_test.py -এ অবস্থিত।

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