এটি করার জন্য আপনি tc
একা u32
ফিল্টারগুলি ব্যবহার করতে পারেন বা আইপটিবলস চিহ্নিতকরণের সাথে একত্রিত করতে পারেন (যদি আপনি জটিল ফিল্টারগুলির বাক্য গঠনটি শিখতে না চান তবে আরও সহজবোধ্য)। আমি নিম্নলিখিত পোস্টে সাবেক সমাধান বিস্তারিত করব।
আপনার সেটআপ অনুকরণ
উদাহরণ হিসাবে, আসুন 10, Mbit / s ভার্চুয়াল ইন্টারফেস চলমান A, B, C এবং D বিবেচনা করুন।
আপনি মূলত চান:
- এ <==> বি: 9 এমবিট / এস ঠিকানাটির জন্য শেপিং
- এ <==> সি: 8 এমবিট / এস ঠিকানাটির জন্য শেপিং
এটি অনুকরণ করার জন্য আমি একটি সেতুতে প্লাগ করা 4 টি নেটওয়ার্ক নেমস্পেস এবং ভার্চুয়াল ইথারনেট ইন্টারফেস তৈরি করব।
অবশ্যই, আপনার ক্ষেত্রে আপনি প্রকৃত এনআইসির সাথে কাজ করবেন এবং সেতুটি আপনার প্রবেশপথের উপর নির্ভর করে আপনার গেটওয়ে বা একটি স্যুইচ হবে।
সুতরাং আমার সিমুলেশনটিতে আমাদের একটি 10.0.0.0/24 নেটওয়ার্কে নিম্নলিখিত সেটআপটি থাকবে:
10.0.0.254
+-------+
| |
| br0 |
| |
+---+---+
|
| veth{A..D}.peer
|
+------------+------+-----+------------+
| | | |
vethA | vethB | vethC | vethD |
+---+---+ +---+---+ +---+---+ +---+---+
| | | | | | | |
| A | | B | | C | | D |
| | | | | | | |
+-------+ +-------+ +-------+ +-------+
10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
প্রথমে সেটআপ ফাসিস যাতে আপনি এটি কী তৈরি তা বুঝতে পারেন, আপনি যদি এটার সাথে পরিচিত না হন তবে এড়িয়ে যান big তবে আপনাকে যা জানতে হবে তা হ'ল ip netns exec <namespace> <command>
কমান্ডটি একটি নেটওয়ার্ক নেমস্পেসে (যেমন পূর্ববর্তী অঙ্কনের বাক্সের একটিতে) একটি কমান্ড চালানোর অনুমতি দেয়। এটি পরবর্তী বিভাগেও ব্যবহৃত হবে।
# Create the bridge
ip link add br0 type bridge
# Create network namespaces and veth interfaces and plug them into the bridge
for host in {A..D} ; do
ip link netns add ${host}
ip link add veth${host} type veth peer name veth${host}.peer
ip link set dev veth${host}.peer master br0
ip link set dev veth${host} netns ${host}
ip netns exec ${host} ip link set veth${host} up
done
# Assign IPs
ip addr add 10.0.0.254/24 dev br0
ip netns exec A ip addr add 10.0.0.1/24 dev vethA
ip netns exec B ip addr add 10.0.0.2/24 dev vethB
ip netns exec C ip addr add 10.0.0.3/24 dev vethC
ip netns exec D ip addr add 10.0.0.4/24 dev vethD
সুতরাং এই সময়ে আমরা সেটআপ পূর্বে বর্ণিত আছে।
ট্র্যাফিক রূপদান
আপনি যা চান তা পেতে ট্র্যাফিক নিয়ন্ত্রণে যাওয়ার সময়। tc
টুল আপনি কিউয়িং নিয়মানুবর্তিতা যোগ করার জন্য অনুমতি দেয়:
- উদাহরণস্বরূপ: একবার কার্নেলের প্যাকেটগুলি প্রেরণ করতে হবে এবং এনআইসি ড্রাইভার অ্যাক্সেস করার আগে।
- এনগ্রেসের জন্য: এনআইসি ড্রাইভার অ্যাক্সেস করার পরে এবং প্রাপ্ত প্যাকেটগুলির পরে কার্নেল রুটিনগুলি চালিত হওয়ার আগে।
এটি 3 টি ধারণার সাথে আসে: কিউডিস্ক , ক্লাস এবং ফিল্টার । এই ধারণাগুলি জটিল প্যাকেট ফ্লো পরিচালনা সেটআপ করতে এবং ট্র্যাফিকের যেকোন মানদণ্ড / মানদণ্ডের উপর ভিত্তি করে ট্র্যাফিককে অগ্রাধিকার দিতে ব্যবহার করা যেতে পারে।
সংক্ষেপে :
- কিউডিস্কগুলি এমন এক কাঠামো যেখানে প্যাকেটগুলি ক্রমাগত সারিবদ্ধ করা / প্রতীকযুক্ত করা হবে।
- ক্লাসগুলি সুনির্দিষ্ট আচরণের সাথে অভিনয় করে কিউডিস্কের ধারক।
- ফিল্টারগুলি ক্লাসগুলির মধ্যে প্যাকেটগুলি রুট করার উপায়, সেগুলির একাধিক প্রক্রিয়া চলাকালীন অগ্রাধিকারগুলির সাথে একই প্রবেশ বিন্দুতে সংজ্ঞায়িত করা যায়।
এগুলি সাধারণত একটি গাছ হিসাবে কাজ করে যেখানে পাতাগুলি Qdiscs এবং শ্রেণিগুলি নোড হয়। একটি গাছ বা সাবট্রির মূল হিসাবে ঘোষণা করা হবে <id>:
এবং বাচ্চাদের নোড হিসাবে ঘোষণা করা হবে <parent_id>:<children_id>
। এই বাক্য গঠনটি মাথায় রাখুন।
আপনার ক্ষেত্রে, আসুন A নিন এবং আপনি যে গাছটি সেট আপ করতে চান তা রেন্ডার করুন tc
:
1:
|
|
|
1:1
/ | \
/ | \
/ | \
1:10 1:20 1:30
| | |
| | |
:10 :20 :30
ব্যাখ্যা:
1:
root ডিভাইস vethA সংযুক্ত qdisc, এটা যেমন স্পষ্টভাবে নেয়া হবে হয় htb
শ্রেণীক্রম টোকেন বাকেট (একটি ডিভাইস এর ডিফল্ট qdisc জন্য pfifo
অথবা pfifo_fast
অপারেটিং সিস্টেম উপর নির্ভর করে)। এটি ব্যান্ডউইথ পরিচালনার জন্য বিশেষভাবে উপযুক্ত। এই স্তরে সংজ্ঞায়িত ফিল্টারগুলির সাথে মেলে না এমন প্যাকেটগুলি 1:30
ক্লাসে যাবে।
1:1
htb
ডিভাইসের পুরো ট্র্যাফিক 10 এমবিট / সেকেন্ডে সীমাবদ্ধ করা একটি শ্রেণি হবে ।
1:10
htb
9 Mbit / s (10 Mbit / s এর 90%) এর মধ্যে আউটপুট ট্র্যাফিক সীমাবদ্ধ করা একটি শ্রেণি হবে ।
1:20
htb
8 Mbit / s (10 Mbit / s এর 80%) এর মধ্যে আউটপুট ট্র্যাফিক সীমাবদ্ধ করা একটি শ্রেণি হবে ।
1:30
htb
10 Mbit / s (ফ্যালব্যাক) এ ট্র্যাফিক সীমাবদ্ধ করা একটি শ্রেণি হবে ।
:10, :20, :30
হয় sfq
স্টচাস্টিক ফর্সা কিউইং জন্য qdisc। অন্য কথায় এই কিডিস্কগুলি প্রবাহের উপর ভিত্তি করে সংক্রমণ শিডিয়ুলিংয়ের ন্যায্যতা নিশ্চিত করবে।
এই সম্পূর্ণ জিনিসটি নিম্নলিখিত আদেশগুলি দ্বারা সেটআপ করা হয়েছে:
ip netns exec A tc qdisc add dev vethA root handle 1: htb default 30
ip netns exec A tc class add dev vethA parent 1: classid 1:1 htb rate 10mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:10 htb rate 9mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:20 htb rate 8mbit burst 15k
ip netns exec A tc class add dev vethA parent 1:1 classid 1:30 htb rate 10mbit burst 15k
ip netns exec A tc qdsic add dev vethA parent 1:10 handle 10: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:20 handle 20: sfq perturb 10
ip netns exec A tc qdisc add dev vethA parent 1:30 handle 30: sfq perturb 10
আমাদের শেষ জিনিসটি ফিল্টার যুক্ত করা দরকার যাতে গন্তব্য আইপি সমান আইপি প্যাকেটগুলি বি 1:10
শ্রেণিতে যাবে এবং গন্তব্য আইপি সমান আইপি প্যাকেট সি 1:20
শ্রেণিতে যাবে:
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.2/32 flowid 1:10
ip netns exec A tc filter add dev vethA parent 1: protocol ip prio 2 u32 match ip dst 10.0.0.3/32 flowid 1:20
এখন আপনি যে ধারণাটি পেয়েছেন, আপনার tc
বি এবং সি তে একই জাতীয় বিধি যুক্ত করতে হবে যাতে এই রিগগুলি থেকে এ এর দিকে ট্রান্সমিশনও আকৃতির হয়।
পরীক্ষামূলক
এখন এটি পরীক্ষা করা যাক। এর জন্য আমি ব্যক্তিগতভাবে খেলতে অভ্যস্ত iperf
, এটিতে একটি একক বাইনারি থাকে যা হয় ক্লায়েন্ট বা সার্ভার হিসাবে চালানো যেতে পারে এবং উভয় হোস্টের মধ্যে স্বয়ংক্রিয়ভাবে যথাসম্ভব ট্র্যাফিক প্রেরণ করবে।
A এবং B এর মধ্যে:
$ ip netns exec B iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.2 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58191 connected with 10.0.0.2 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 2.0- 4.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 4.0- 6.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 6.0- 8.0 sec 2.12 MBytes 8.91 Mbits/sec
[ 5] 8.0-10.0 sec 2.00 MBytes 8.39 Mbits/sec
[ 5] 0.0-10.1 sec 10.8 MBytes 8.91 Mbits/sec
আমরা আমাদের 9 এমবিট / গুলি ব্যান্ডউইথ সীমা পাই ।
A এবং C এর মধ্যে:
$ ip netns exec C iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.3 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.3, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 58522 connected with 10.0.0.3 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 2.0- 4.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 4.0- 6.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 6.0- 8.0 sec 1.88 MBytes 7.86 Mbits/sec
[ 5] 8.0-10.0 sec 1.75 MBytes 7.34 Mbits/sec
[ 5] 0.0-10.1 sec 9.62 MBytes 7.98 Mbits/sec
আমরা আমাদের 8 এমবিট / গুলি ব্যান্ডউইথ সীমা পাই ।
এ এবং ডি এর মধ্যে:
$ ip netns exec D iperf -s -p 8001
...
$ ip netns exec A iperf -c 10.0.0.4 -p 8001 -t 10 -i 2
------------------------------------------------------------
Client connecting to 10.0.0.4, TCP port 8001
TCP window size: 21.0 KByte (default)
------------------------------------------------------------
[ 5] local 10.0.0.1 port 40614 connected with 10.0.0.4 port 8001
[ ID] Interval Transfer Bandwidth
[ 5] 0.0- 2.0 sec 2.62 MBytes 11.0 Mbits/sec
[ 5] 2.0- 4.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 4.0- 6.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 6.0- 8.0 sec 2.25 MBytes 9.44 Mbits/sec
[ 5] 8.0-10.0 sec 2.38 MBytes 9.96 Mbits/sec
[ 5] 0.0-10.2 sec 12.0 MBytes 9.89 Mbits/sec
এখানে আমাদের ভার্চুয়াল ইন্টারফেসের পূর্ণ গতি 10 এমবিট / গুলি পৌঁছেছে।
নোট করুন যে প্রতিটি রানের প্রথম পরিমাপের বিস্ফোরণ htb
পর্যাপ্ত পরামিতি সামঞ্জস্য করে ক্লাসে আরও ভালভাবে পরিচালনা করা যায় ।
পরিষ্কার আপ
মুছে ফেলার জন্য :
- উপর অগ্রাধিকার 1 ফিল্টার
1:
: tc filter del dev vethA parent 1: prio 1 u32
।
- কে নিয়ে ফিল্টার
1:
: tc filter del dev vethA parent 1:
।
- ক্লাস
1:20
এবং তার সন্তান tc class del dev vethA parent 1:1 classid
1:20
।
- পুরো গাছ:
tc qdisc del dev vethA
।
সিমুলেশন সেটটি পরিষ্কার করতে:
# Remove veth pairs and network namespaces
for host in {A..D} ; do
ip link del dev veth${host}.peer
ip netns del ${host}
done
# Remove the bridge
ip link del dev br0