การใช้ tc เพื่อหน่วงเวลาแพ็คเก็ตไปยังที่อยู่ IP เดียวเท่านั้น


20

ฉันใหม่เพื่อใช้TCและnetem ฉันต้องการชะลอการส่งแพ็คเก็ตไปยังที่อยู่ IP ที่เฉพาะเจาะจง อย่างไรก็ตามคำสั่งด้านล่างทำให้แพ็คเก็ตทั้งหมดในระบบล่าช้าแทนที่จะเป็นเพียงที่อยู่ IP 1.2.3.4:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1

ฉันเดาว่าฉันต้องการตัวกรอง catch-all บางชนิดในตอนท้ายเพื่อระบุว่าปริมาณการใช้งานที่เหลือทั้งหมดไม่ควรผ่าน netem แต่ฉันไม่สามารถทำงานอะไรได้ ฉันจะทำให้เรื่องนี้ทำงานอย่างไร

คำตอบ:


14

ตกลงฉันแก้ปัญหาของตัวเอง ปรากฎว่าหากคุณดำเนินการ 3 บรรทัดแรกข้างต้น ("tc qdisc" คน) มันจะล่าช้าแพ็คเก็ตทั้งหมดเพราะยังไม่มีตัวกรอง บรรทัดที่ 4 จะเปลี่ยนเป็นแพ็กเก็ตหน่วงเวลาจากที่อยู่ IP เดียวนั้นเท่านั้น สามารถเพิ่มบรรทัดตัวกรองเพิ่มเติมเพื่อเพิ่มที่อยู่ IP เพิ่มเติมในรายการ "ล่าช้า" ดังนั้น: อย่าสร้างบรรทัด "netem delay" โดยไม่มีตัวกรองชี้ไปที่มัน


ขอบคุณที่กลับมาโพสต์คำตอบ ฉันพบว่ามันผิดปกติทำงานได้ดีทั้งสองวิธี แต่ต่อไป ผมเขียนสคริปต์เสื้อคลุมทั่วทั้งสามคำสั่งไปยังความช่วยเหลือเกี่ยวกับการทดสอบเพียงแค่คิดว่าฉันต้องการให้กลับมาเล็ก ๆ น้อย ๆ :)
แรน Cudbard ระฆัง

13

คำตอบที่เลือกไม่ถูกต้อง / ไม่สมบูรณ์ ฉันประสบปัญหาคล้ายกันคำตอบที่เลือกให้ความช่วยเหลือ แต่ไม่เพียงพอ

ก่อนคำสั่งต่อไปนี้ไม่จำเป็นจริงๆ

tc qdisc del dev eth0 root

มันจะ 'ลบ' รูท qdisc แต่จะถูกแทนที่ด้วย pfifo_fast ในระดับกลาง (ดังนั้นคุณจะไม่สูญเสียการเชื่อมต่อ)

คำสั่งที่สอง:

tc qdisc เพิ่ม dev eth0 root handle 1: prio

จะแทนที่ pfifo_fast qdisc ด้วย prio one ตามค่าเริ่มต้นคิว prio จะมี 3 แบนด์ (0, 1, 2) แต่ละอันจัดการโดยหนึ่งคลาส (1: 1, 1: 2 และ 1: 3)

แพ็คเก็ตจะถูกส่งไปยังหนึ่งในวงดนตรีเหล่านั้นโดยใช้ฟิลด์ TOS ของแพ็คเกจ IP การกำหนดค่านี้จะปรากฏขึ้นเมื่อคุณดำเนินการ:

tc qdisc ls

ดูที่ค่า 'priomap'

จากนั้นคุณเพิ่ม netem qdisc:

tc qdisc เพิ่ม dev eth0 parent 1: 1 handle 2: netem delay 500ms

ด้วยคำสั่งนี้คุณจะชะลอการรับส่งข้อมูลทั้งหมดไปยังวงดนตรี 1: 1 (จนกว่าตัวกรองจะเข้าที่)

แต่มีสองประการ:

  • ปริมาณการใช้งานของคุณอาจมีค่า TOS ที่แตกต่างกันและถูกส่งไปยังวงอื่น
  • prio qdisc สามารถกำหนดค่าเพื่อให้การรับส่งข้อมูลไปยังแบนด์อื่น

ต่อไปนี้แก้ไขปัญหาของฉันที่จะไม่ได้รับผลกระทบจาก netem ในขณะที่ไม่ได้ใช้ตัวกรอง แทนที่จะทำตามขั้นตอนข้างต้นฉันก็:

tc qdisc เพิ่ม dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

การดำเนินการนี้จะส่งปริมาณการเข้าชมทั้งหมดตามค่าเริ่มต้นไปที่แบนด์ 1: 3

จากนั้นฉันเพิ่มกฎเพื่อชะลอการรับส่งข้อมูล:

tc qdisc เพิ่ม dev eth0 parent 1: 1 handle 10: netem delay 100ms 10ms

สิ่งนี้สร้าง qdisc ในวง 0 แต่เนื่องจากทราฟฟิกทั้งหมดไปที่แบนด์ 3 มันไม่ได้ส่งผลกระทบต่อฉัน

หลังจากนั้นฉันเพิ่มตัวกรอง:

tc filter เพิ่ม dev eth0 โปรโตคอล ip ผู้ปกครอง 1: 0 prio 1 การแข่งขัน ip dst 10.0.0.1/32 การแข่งขัน ip dport 80 0xffff flowid 1: 1

ขณะนี้มีตัวกรองเฉพาะ IP / พอร์ตที่เลือกเท่านั้นที่จะได้รับผลกระทบเนื่องจากเราเปลี่ยนเส้นทางปริมาณข้อมูลที่เลือกไปยังแบนด์ 0

การรับส่งข้อมูลอื่น ๆ ทั้งหมดยังคงไม่ได้รับผลกระทบเนื่องจากยังคงไหลไปยังแบนด์ 3


"ip dst 10.0.0.1/32" คืออะไร นั่นคือปลายทาง ip หรือไม่ หมายความว่ามี "ip src xxx.yyy.zz.www / aa" หรือไม่
Zach Folwick

ใช่มันเป็น IP ปลายทางในตัวอย่างของฉัน และใช่มีตัวเลือก 'ip src'
Telegrapher

เหตุผลสำหรับคำสั่งแรก (tc qdisc del) คือการล้างสถานะก่อนหน้า - เช่นคุณอาจมีถ้าคุณกำลังทดลองพยายามทำให้งานนี้ FWIW คำตอบที่ได้รับการยอมรับทำงานให้ฉัน
Dan Pritts

ขอบคุณคำตอบนี้มีประโยชน์จริงๆ
PepeHands

1

ตัวอย่างง่ายๆจากhttps://wiki.linuxfoundation.org/networking/netemที่ช่วยให้คุณหน่วงเวลาแพ็กเก็ตเป็น IP ที่กำหนดโดยไม่ส่งผลกระทบต่อการรับส่งข้อมูลอื่น ๆ แม้ในระหว่างการกำหนดค่า:

tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
   match ip dst 192.168.1.2 flowid 1:3

ฉันต้องเพิ่มข้อแม้หลังจากนั้นดูเหมือนว่าความล่าช้าจะนำไปใช้ในวงกว้างมากกว่าที่ฉันคาดไว้และไม่สามารถไปถึงจุดต่ำสุดได้ ดูเหมือนว่าการรับส่งข้อมูลจะไม่ล่าช้าทั้งหมด
NeilenMarais

0

ฉันไม่ได้จัดการที่จะชะลอการรับส่งข้อมูลไปยังหนึ่ง IP ในขณะที่รักษาปริมาณการใช้งานปกติให้เป็น IP ปกติอื่น ๆ ด้วยวิธีการที่อธิบายไว้ในหัวข้อนี้

อย่างไรก็ตามฉันสามารถทำได้โดยใช้คำสั่งต่อไปนี้

tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1

เพื่อชะลอ15001msการรับส่งข้อมูลไปยัง IP 1.2.3.4จากโฮสต์ที่คำสั่งจะถูกดำเนินการ คำสั่งhostname -Iถูกใช้เพื่อรับ IP หลักของโฮสต์ แต่ค่าสามารถถูกแทนที่โดยตรงภายในคำสั่ง

ฉันต้องเพิ่มตัวกรองอื่นที่มี0msความล่าช้าเพื่อให้ตรงกับปริมาณการใช้งานที่มาจากโฮสต์ แน่นอนว่ามันไม่ได้สวยงาม แต่ฉันไม่ได้จัดการอะไรให้ดีกว่านี้

คำสั่งสุดท้ายสามารถถูกแทนที่เพื่อให้ตรงกับพอร์ตเดียว

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1

จะชะลอการจราจรไปยังพอร์ต18583แทน 1.2.3.4IP


ฉันได้พบวิธีที่สองในคำตอบนี้เพื่อชะลอการรับส่งข้อมูล1.2.3.4:18583โดยไม่มีผลกระทบต่อการรับส่งข้อมูลอื่น

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip  parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.