लिनक्स में प्रति उपयोगकर्ता अपलोड बैंडविड्थ कैसे सीमित करें?


2

किसी को भी tcडेबियन लेन में प्रति उपयोगकर्ता अपलोड बैंडविड्थ को सीमित करने के लिए कमांड प्रदान कर सकता है ?

मैंने पाया कि iptables के साथ प्रति उपयोगकर्ता पैकेट चिह्नित करने के लिए मैं निम्नलिखित कमांड का उपयोग कर सकता हूं

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner testuser -j MARK --set-mark 500

लेकिन मुझे नहीं पता कि कैसे उपयोग करना है tc

अपडेट करें

निम्नलिखित आदेशों को चलाकर, मैं वृषण अपलोड बैंडविड्थ को 10Mbit तक सीमित करने में कामयाब रहा

iptables -t mangle -N HTB_OUT
iptables -t mangle -I POSTROUTING -j HTB_OUT
iptables -t mangle -A HTB_OUT -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10

tc qdisc replace dev eth0 root handle 1: htb default 30
tc class replace dev eth0 parent 1: classid 1:1 htb rate 10Mbit burst 5k
tc class replace dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit ceil 10Mbit
tc qdisc replace dev eth0 parent 1:10 handle 10: sfq perturb 10
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10

अब समस्या यह है कि, मैं टेस्टर के एफ़टीपी बैंडविड्थ को सीमित नहीं करना चाहता, लेकिन कमांड के ऊपर चलने से एफ़टीपी की गति भी १० मीबिट तक सीमित हो जाती है।

सादर


1
LARTC को देखने के लिए सुझाए गए उत्तर से पहले एक समान प्रश्न यहां पूछा गया था । कोई विशिष्ट उदाहरण नहीं है, लेकिन पूर्ण NAT उदाहरण सहायक हो सकता है।
दिमित्री चुबरोव

धन्यवाद मुझे TC और iptables कमांड के साथ प्रति उपयोगकर्ता सीमा अपलोड बैंडविड्थ के लिए एक समाधान मिला। लेकिन अब समस्या यह है कि यह उपयोगकर्ता की FTP की गति को भी सीमित कर देता है :(
Gihan Lasita

बिलकुल यह करता है।
माइकल हैम्पटन

हो सकता है कि दो नियमों का उपयोग करने और एफ़टीपी पोर्ट 21 के लिए अलग गति निर्धारित करने का कोई तरीका हो?
गिहान लसिता

2
निश्चित रूप से, दो iptables नियमों का उपयोग करें, और उन्हें विभिन्न पोर्ट संख्याओं पर मेल करें।
सेरेक्स

जवाबों:


2

स्पष्ट समस्याओं के युगल मैं आपके htb config के साथ देखता हूं।

सबसे पहले, आपके पास 1:30 हैंडल नहीं है, और आपको दी जानी चाहिए default 30। शायद तुम्हारा मतलब default 1? यह सभी ट्रैफ़िक को क्लास 1: 1 से जोड़ देगा, जब तक कि नियम एक अलग क्लास में ट्रैफ़िक को संलग्न न कर दे।

दूसरा, आपको अपनी दर को htb 1: 1 उच्चतम स्तर के वर्ग में उचित और अपनी लाइन दर से कम पर सेट करने की आवश्यकता है। उदाहरण के लिए, यदि आपकी लाइन की दर 100Mbit है, तो दर 90% होनी चाहिए: 90Mbit। कुछ लोग अधिक रूढ़िवादी सेटिंग्स की सलाह देते हैं जैसे 75% लाइन दर; मैं 90% पर एक खतरनाक खेल खेलता हूं और यह मेरे लिए ठीक काम करता है - गिराए गए पैकेट या अनुचित बैंडविड्थ आवंटन पर ध्यान दें। उत्तरार्द्ध अपस्ट्रीम बफरिंग का संकेत है।

तीसरा, आपके दर-सीमित वर्ग को rateगारंटीशुदा बैंडविड्थ के लिए एक सेट के साथ कॉन्फ़िगर किया जाना चाहिए जिसे आप कक्षा को आवंटित करने के लिए तैयार हैं और ceilउपयोगकर्ता को अधिकतम स्तर तक सेट करें। उदाहरण के लिए, मान लें कि आप गवाही देने वाले को 400kbit की गारंटीकृत बैंडविड्थ देना चाहते हैं, लेकिन यदि रेखा अन्यथा निष्क्रिय है, तो उसे लाइन दर पर बढ़ने दें। rate 400kbit1: 1 के लिए आप जो भी रेट लगाते हैं उसे सेट और सीलिंग करें । यदि आप छत को सेट नहीं करते हैं, तो यह दर में चूक करता है।

चौथा, एफ़टीपी ट्रैफ़िक को छूट देने के अपने लक्ष्य को पूरा करने के लिए, आपको केवल चिह्न के बजाय कॉनमार्क का उपयोग करना होगा। अन्यथा आपके संबंधित डेटा कनेक्शन को --सेट-मार्क 10. से ठीक से छूट नहीं मिलेगी। कनेक्टमार्क ठीक से संबंधित कनेक्शन उठाएगा।

मैं निम्नलिखित सुझाव देता हूं (अप्राप्त) मेरे सिर के ऊपर से नियम:

# flush rules out of postrouting so you're not constantly inserting during testing.
iptables -t mangle -F POSTROUTING
iptables -t mangle -X HTB_OUT

# The use of RETURN here is to fall out of our user chain and hit 
# -j CONNMARK --save-mark in the POSTROUTING chain.
iptables -t mangle -N HTB_OUT
iptables -t mangle -A HTB_OUT -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -p tcp --dport 21 -j MARK --set-mark 30
iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN
iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10
iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN

iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A POSTROUTING -j HTB_OUT
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

फिर tc के लिए, कुछ इस तरह है:

# set a script variable that will represent our line-rate minus some change
CAPRATE=90Mbit
CAP_SUB_400=89Mbit

# clear our qdisc settings for eth0 so we're starting from a clean slate.
tc qdisc del dev eth0 root

tc qdisc add dev eth0 root handle 1: htb default 20
tc class add dev eth0 parent 1: classid 1:1 htb rate ${CAPRATE} burst 5k
# this is our capped class:
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 400kbit ceil ${CAPRATE}
# this is our default, catch-all class:
tc class add dev eth0 parent 1:1 classid 1:20 htb rate ${CAP_SUB_400} ceil ${CAPRATE}
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10

याद रखने योग्य बातें: rateकिसी भी माता-पिता के तात्कालिक बच्चों के लिए सभी का योग rateकभी भी माता-पिता से अधिक नहीं होना चाहिए । मैंने यहां थोड़ा सा धोखा दिया और 1: 20 की दर को 89600kbit के बजाय 89Mbit तक घटा दिया। आप कमिट कर सकते हैं, लेकिन आपको कभी ओवर-कमिट नहीं करना चाहिए।

iptables नियमों का मूल्यांकन क्रम में किया जाता है । यदि आपकी नीति इसे अनुमति देती है, तो सबसे आम मैचों को पहले दिखाई देना चाहिए; यह दी गई है कि HTB_OUT श्रृंखला में प्रवेश करने से पहले POSTROUTING नियमों द्वारा इसका पालन किया जाता है, लेकिन यह अंगूठे का एक अच्छा नियम है।

तो एसएफक्यू क्या है ... यह पॉट को सरगर्मी करने जैसा है। SFQ हर कनेक्शन (समापन बिंदु जोड़ी, वास्तव में) बैंडविड्थ का एक उचित हिस्सा देने की कोशिश करता है, फिर हर गड़बड़ी सेकंड में यह चीजों को फिर से मिलाता है, अगर एक ही आंतरिक बाल्टी में कई कनेक्शन समाप्त हो गए (जो कि हैशिंग के कारण संभव है src / dst / portpair पर किया गया)। अधिक जानकारी के लिए, lartc या tc-sfq मैनपेज की जाँच करें।


घटी हुई खजूर। पता नहीं कैसे मैं इस सवाल पर इसे necro करने के लिए मिला, लेकिन जब से मैं पहले से ही एक जवाब लिखा था, इसके साथ बिल्ली।
एंड्रयू डॉमासेक

0
iptables -A OUTPUT -m conntrack --connbytes from:to --connbytes-mode packets/bytes/avgpkt -m owner --uid-owner owner -J DROP

अन्य संभावनाएं -m connlimit -m hashlimit


1
क्या आप कृपया बता सकते हैं कि उपरोक्त आदेश क्या है? मुझे पता नहीं है
गिहान लसिता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.