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-এও কিছু প্রয়োজনীয় ফ্রেমওয়ার্ক পরিবর্তন করা হয়েছে।

প্রয়োগ

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

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

Legacy এবং eBPF ট্রাফিক মনিটরিং ডিজাইন সংক্রান্ত পার্থক্য

ছবি ১. লেগ্যাসি (বাঁদিকে) ও eBPF (ডানদিকে) ট্রাফিক মনিটরিং ডিজাইন পার্থক্য

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

ডিভাইস কার্নেল যদি Android কমন কার্নেল 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 মডিউল এর উপর ভিত্তি করে তৈরি করা হয়েছে। আমরা Android কার্নেল থেকে xt_qtaguid মডিউল সরিয়ে দেওয়া শুরু করব এবং এর অপ্রয়োজনীয় কনফিগারেশন বন্ধ করে দেব।

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

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

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

যাচাইকরণ

Android কমন কার্নেল ও Android AOSP main থেকে আপনার নিয়মিত প্যাচ নেওয়া উচিত। আপনার প্রয়োগ যেন প্রযোজ্য VTS ও CTS পরীক্ষা, netd_unit_test এবং libbpf_test পাস করে তা নিশ্চিত করুন।

পরীক্ষা করা

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

CTS ও CTS যাচাইকারী

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

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

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.

ইউনিট টেস্ট এখানে রয়েছে: