Sử dụng tc để trì hoãn các gói đến một địa chỉ IP duy nhất


20

Tôi mới sử dụng tcnetem . Tôi muốn trì hoãn các gói được gửi đến một địa chỉ IP cụ thể. Tuy nhiên, các lệnh bên dưới khiến tất cả các gói trên hệ thống bị trì hoãn, thay vì chỉ đến địa chỉ 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

Tôi đoán là tôi cần một số loại bộ lọc bắt tất cả ở cuối để chỉ định rằng tất cả lưu lượng truy cập còn lại không nên đi qua netem. Nhưng tôi không thể làm gì được. Làm thế nào tôi có thể làm việc này?

Câu trả lời:


14

Ok, tôi đã giải quyết vấn đề của riêng tôi. Nó chỉ ra rằng nếu bạn thực thi 3 dòng đầu tiên ở trên (các dòng "tc qdisc"), nó sẽ trì hoãn tất cả các gói vì chưa có bộ lọc nào. Dòng thứ 4 thay đổi nó thành chỉ trì hoãn các gói từ địa chỉ IP duy nhất đó. Các dòng bộ lọc bổ sung có thể được thêm vào để thêm các địa chỉ IP bổ sung vào danh sách "bị trì hoãn". Vì vậy: không tạo dòng "netem delay" mà không có bộ lọc trỏ đến nó.


Cảm ơn bạn đã trở lại và đăng câu trả lời. Kì lạ là tôi thấy rằng nó hoạt động tốt cả hai cách, nhưng dù sao đi nữa. Tôi đã viết một kịch bản trình bao quanh ba lệnh đó để giúp kiểm tra, chỉ nghĩ rằng tôi sẽ trả lại một chút :)
Arran Cudbard-Bell

13

Câu trả lời được chọn là không chính xác / không đầy đủ. Tôi phải đối mặt với một vấn đề tương tự, câu trả lời được chọn đã giúp đỡ, nhưng không đủ.

Đầu tiên, lệnh sau không thực sự cần thiết.

tc qdisc del dev eth0 root

Nó sẽ 'xóa' gốc qdisc, nhưng ngay lập tức được thay thế bằng pfifo_fast (vì vậy bạn không bị mất kết nối).

Lệnh thứ hai:

tc qdisc thêm dev eth0 root xử lý 1: tiên sinh

Sẽ thay thế qdisc pfifo_fast bằng một tiên tri. Theo mặc định, hàng đợi có 3 băng tần (0, 1, 2) được quản lý bởi một lớp (1: 1, 1: 2 và 1: 3).

Các gói sẽ được gửi đến một trong các băng tần đó bằng trường TOS của gói IP. Cấu hình này được hiển thị khi bạn thực thi:

tc qdisc ls

nhìn vào các giá trị 'tiên tri'.

Sau đó, bạn thêm một netem qdisc:

tc qdisc thêm dev eth0 cha 1: 1 xử lý 2: độ trễ netem 500ms

Với lệnh này, bạn trì hoãn tất cả lưu lượng truy cập vào băng tần 1: 1 (cho đến khi bộ lọc được đặt đúng chỗ).

Nhưng có hai hãy cẩn thận:

  • Lưu lượng truy cập của bạn có thể có giá trị TOS khác nhau và sau đó được gửi đến một băng tần khác.
  • Các qdisc có thể được cấu hình để lưu lượng truy cập đến một băng tần khác.

Sau đây đã giải quyết vấn đề của tôi để không bị ảnh hưởng bởi netem trong khi bộ lọc không được áp dụng. Thay vì các bước trên, tôi đã làm:

tc qdisc thêm dev eth0 root xử lý 1: tiên tri 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Điều này sẽ gửi tất cả lưu lượng theo mặc định cho băng tần 1: 3.

Sau đó, tôi đã thêm quy tắc để trì hoãn lưu lượng:

tc qdisc thêm dev eth0 cha mẹ 1: 1 xử lý 10: độ trễ netem 100ms 10ms

Điều này tạo ra qdisc trong băng 0, nhưng vì tất cả lưu lượng truy cập vào băng 3, nên nó không ảnh hưởng đến tôi.

Sau đó, tôi đã thêm bộ lọc:

bộ lọc tc thêm dev eth0 giao thức ip cha mẹ 1: 0 tiên sinh 1 u32 khớp ip dst 10.0.0.1 / 32 kết hợp ip dport 80 0xffff Flowid 1: 1

Bây giờ với bộ lọc, chỉ IP / cổng được chọn sẽ bị ảnh hưởng, vì chúng tôi chuyển hướng lưu lượng đã chọn sang băng tần 0.

Tất cả các lưu lượng khác tiếp tục không bị ảnh hưởng kể từ khi nó tiếp tục chảy sang băng 3.


"ip dst 10.0.0.1 / 32" là gì? Có phải đó là ip đích? điều đó có nghĩa là có "ip src xxx.yyy.zz.www / aa"?
Zach Folwick

Vâng, đó là IP đích trong ví dụ của tôi. Và vâng, có một tùy chọn 'ip src'.
Điện báo viên

Lý do cho lệnh đầu tiên (tc qdisc del) là để xóa bất kỳ trạng thái nào trước đó - giống như bạn có thể có nếu bạn đang thử nghiệm để làm cho công việc này hoạt động. FWIW câu trả lời được chấp nhận Làm việc cho tôi.
Dan Pritts

Cảm ơn, câu trả lời này thật sự hữu ích.
PepeHands

1

Ví dụ đơn giản từ https://wiki.linuxfoundation.org/networking/netem cho phép bạn trì hoãn các gói đến một IP nhất định mà không ảnh hưởng đến bất kỳ lưu lượng nào khác, ngay cả trong khi định cấu hình:

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

Tôi phải thêm một lời cảnh báo, sau đó có vẻ như sự chậm trễ được áp dụng rộng rãi hơn mà tôi mong đợi và tôi không thể đi đến tận cùng của nó. Không phải tất cả giao thông dường như bị trì hoãn mặc dù.
NeilenMarais

0

Tôi đã không quản lý để trì hoãn lưu lượng truy cập đến một IP trong khi giữ cho lưu lượng truy cập bình thường đến các IP khác bình thường với phương pháp được mô tả trong chuỗi này.

Tuy nhiên, tôi quản lý để làm điều đó bằng cách sử dụng các lệnh sau.

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

Để trì hoãn 15001mslưu lượng đến IP 1.2.3.4từ máy chủ lưu trữ lệnh được thực thi. Lệnh hostname -Iđược sử dụng để lấy IP chính của máy chủ nhưng giá trị có thể được thay thế trực tiếp bên trong lệnh.

Tôi đã phải thêm một bộ lọc khác có 0msđộ trễ để phù hợp với lưu lượng truy cập đến từ máy chủ lưu trữ. Để chắc chắn rằng nó không thanh lịch nhưng tôi đã không quản lý để có một cái gì đó đẹp hơn làm việc.

Lệnh cuối cùng có thể được thay thế để khớp với một cổng duy nhất.

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

Để trì hoãn lưu lượng đến cổng 18583thay vì IP 1.2.3.4.


Tôi cũng đã tìm thấy một phương pháp thứ hai cho câu trả lời này để trì hoãn lưu lượng truy cập 1.2.3.4:18583mà không ảnh hưởng đến lưu lượng khác.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.