ऐसा करने के लिए आप फ़िल्टर के tc
साथ अकेले का उपयोग कर सकते हैं u32
या iptables अंकन के साथ संयुक्त हो सकता है (शायद अधिक सीधा अगर आप जटिल फ़िल्टर सिंटैक्स सीखना नहीं चाहते हैं)। मैं निम्नलिखित पोस्ट में पूर्व समाधान का विवरण दूंगा।
अपने सेटअप का अनुकरण करना
एक उदाहरण के रूप में, आइए A, B, C और D 10 Mbit / s वर्चुअल इंटरफेस पर विचार करें।
आप मूल रूप से चाहते हैं:
- A <==> B: 9 Mbit / s को ग्रहण के लिए आकार देना
- A <==> C: 8 Mbit / s को ग्रहण के लिए आकार देना
इसे अनुकरण करने के लिए मैं एक पुल में प्लग किए गए 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
सबसे पहले, सेटअप फासिस ताकि आप समझ सकें कि यह किस चीज से बना है, इसे छोड़ दें यदि आप इससे अपरिचित हैं, तो कोई बड़ी बात नहीं है। हालाँकि आपको जो पता होना चाहिए वह यह है कि कमांड 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
उपकरण आप कतार विषयों को जोड़ने के लिए अनुमति देता है:
- ईगर्शन के लिए: एक बार कर्नेल को पैकेट भेजने की जरूरत होती है और एनआईसी ड्राइवर को एक्सेस करने से पहले।
- प्रवेश के लिए: NIC ड्राइवर तक पहुँचने से पहले और कर्नेल रूट से पहले प्राप्त पैकेट पर चलाए जाते हैं।
यह 3 धारणाओं के साथ आता है: क्यूडीस्क , कक्षाएं और फिल्टर । उन धारणाओं का उपयोग जटिल पैकेट प्रवाह प्रबंधन को सेटअप करने के लिए किया जा सकता है और जो भी मानदंड / मापदंड आप चाहते हैं, उसके आधार पर ट्रैफ़िक को प्राथमिकता दें।
संक्षेप में :
- Qdiscs ऐसी संरचनाएँ हैं जहाँ पैकेटों को सनातन / विकृत किया जाएगा।
- विशिष्ट व्यवहार के साथ काम करने वाले क्यूडीस्क के लिए कक्षाएं कंटेनर हैं।
- फिल्टर कक्षाओं के बीच पैकेटों को रूट करने के तरीके हैं, उनमें से कई को प्रसंस्करण के दौरान प्राथमिकताओं के साथ एक ही प्रवेश बिंदु पर परिभाषित किया जा सकता है।
ये सभी आमतौर पर एक पेड़ के रूप में काम करते हैं जहां पत्ते क्यूडीस्क हैं और कक्षाएं नोड्स हैं। एक पेड़ या सबट्री की जड़ को घोषित किया जाएगा <id>:
और बच्चों को नोड घोषित किया जाएगा <parent_id>:<children_id>
। इस वाक्य-विन्यास को ध्यान में रखें।
अपने मामले के लिए, आइए A को लें और उस वृक्ष को प्रस्तुत करें जिसे आप स्थापित करना चाहते हैं tc
:
1:
|
|
|
1:1
/ | \
/ | \
/ | \
1:10 1:20 1:30
| | |
| | |
:10 :20 :30
स्पष्टीकरण:
1:
जड़ डिवाइस vethA से जुड़ी qdisc, यह के रूप में स्पष्ट रूप ले जाया जाएगा है htb
पदानुक्रम टोकन बाल्टी (एक डिवाइस के डिफ़ॉल्ट qdisc है के लिए pfifo
या pfifo_fast
ओएस के आधार पर)। यह प्रबंधन के लिए विशेष रूप से उपयुक्त है। इस स्तर पर परिभाषित फिल्टरों से मेल नहीं खाने वाले पैकेट 1:30
कक्षा में जाएंगे ।
1:1
htb
10 Mbit / s तक डिवाइस के पूरे ट्रैफ़िक को सीमित करने वाला एक वर्ग होगा ।
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
स्टोकेस्टिक फेयरनेस क्युइंग के लिए क्यूडिस्क हैं । दूसरे शब्दों में, ये क्यूडिस्क प्रवाह के आधार पर ट्रांसमिशन शेड्यूलिंग में निष्पक्षता सुनिश्चित करेंगे।
यह पूरी चीज़ निम्नलिखित कमांड द्वारा सेटअप की गई है:
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
आखिरी बात हम की जरूरत है फिल्टर तो गंतव्य के साथ IP पैकेट आईपी के बराबर होती है बी के लिए जाना जाएगा जोड़ने 1:10
वर्ग और IP पैकेट गंतव्य के साथ आईपी के बराबर होती है सी के लिए जाना जाएगा 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 Mbit / s बैंडवाइथ की सीमा प्राप्त करते हैं।
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 Mbit / s बैंडवाइथ सीमा मिलती है।
ए और डी के बीच:
$ 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 Mbit / s तक की वर्चुअल इंटरफ़ेस पूर्ण गति है ।
ध्यान दें कि प्रत्येक रन के पहले माप के फटने 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