स्पष्ट समस्याओं के युगल मैं आपके htb config के साथ देखता हूं।
सबसे पहले, आपके पास 1:30 हैंडल नहीं है, और आपको दी जानी चाहिए default 30
। शायद तुम्हारा मतलब default 1
? यह सभी ट्रैफ़िक को क्लास 1: 1 से जोड़ देगा, जब तक कि नियम एक अलग क्लास में ट्रैफ़िक को संलग्न न कर दे।
दूसरा, आपको अपनी दर को htb 1: 1 उच्चतम स्तर के वर्ग में उचित और अपनी लाइन दर से कम पर सेट करने की आवश्यकता है। उदाहरण के लिए, यदि आपकी लाइन की दर 100Mbit है, तो दर 90% होनी चाहिए: 90Mbit। कुछ लोग अधिक रूढ़िवादी सेटिंग्स की सलाह देते हैं जैसे 75% लाइन दर; मैं 90% पर एक खतरनाक खेल खेलता हूं और यह मेरे लिए ठीक काम करता है - गिराए गए पैकेट या अनुचित बैंडविड्थ आवंटन पर ध्यान दें। उत्तरार्द्ध अपस्ट्रीम बफरिंग का संकेत है।
तीसरा, आपके दर-सीमित वर्ग को rate
गारंटीशुदा बैंडविड्थ के लिए एक सेट के साथ कॉन्फ़िगर किया जाना चाहिए जिसे आप कक्षा को आवंटित करने के लिए तैयार हैं और ceil
उपयोगकर्ता को अधिकतम स्तर तक सेट करें। उदाहरण के लिए, मान लें कि आप गवाही देने वाले को 400kbit की गारंटीकृत बैंडविड्थ देना चाहते हैं, लेकिन यदि रेखा अन्यथा निष्क्रिय है, तो उसे लाइन दर पर बढ़ने दें। rate 400kbit
1: 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 मैनपेज की जाँच करें।