Jestem nowy w używaniu tc i netem . Chcę opóźnić wysyłanie pakietów na określony adres IP. Poniższe polecenia powodują jednak opóźnienie wszystkich pakietów w systemie, a nie tylko adres 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
Domyślam się, że potrzebuję na końcu jakiegoś filtru typu catch-all, aby określić, że cały pozostały ruch nie powinien przechodzić przez netem. Ale nic nie mogę zrobić. Jak mam to zrobić?
źródło
Wybrana odpowiedź jest niepoprawna / niepełna. Napotkałem podobny problem, wybrana odpowiedź pomogła, ale niewystarczająco.
Po pierwsze, następujące polecenie nie jest tak naprawdę potrzebne.
„Usunie” root qdisc, ale natychmiast zostanie zastąpiony przez pfifo_fast (abyś nie stracił łączności).
Drugie polecenie:
Zamieni qdisc pfifo_fast na prio. Domyślnie kolejka prio ma 3 pasma (0, 1, 2), każdy zarządzany przez jedną klasę (1: 1, 1: 2 i 1: 3).
Pakiety zostaną wysłane do jednego z tych pasm przy użyciu pola TOS pakietu IP. Ta konfiguracja jest wyświetlana po wykonaniu:
patrząc na wartości „priomap”.
Następnie dodajesz qdisc netem:
Za pomocą tego polecenia opóźniasz cały ruch do pasma 1: 1 (aż filtr zostanie zainstalowany).
Ale są dwa zastrzeżenia:
Poniższe rozwiązało problem, który nie ma wpływu na netem, gdy filtr nie jest zastosowany. Zamiast powyższych kroków zrobiłem:
Spowoduje to domyślnie wysłanie całego ruchu do pasma 1: 3.
Następnie dodałem regułę opóźniającą ruch:
To tworzy qdisc w paśmie 0, ale ponieważ cały ruch trafia do pasma 3, nie miało to na mnie wpływu.
Następnie dodałem filtr:
Teraz z filtrem wpłynie to tylko na wybrany adres IP / port, ponieważ przekierowujemy wybrany ruch do pasma 0.
Cały pozostały ruch pozostaje niezmieniony, ponieważ nadal przepływa do pasma 3.
źródło
Prosty przykład z https://wiki.linuxfoundation.org/networking/netem, który pozwala opóźnić pakiety do danego adresu IP bez wpływu na inny ruch, nawet podczas konfiguracji:
źródło
Nie udało mi się opóźnić ruchu do jednego adresu IP, utrzymując ruch normalny w stosunku do innych adresów IP normalnie, przy użyciu metody opisanej w tym wątku.
Udaje mi się to jednak wykonać za pomocą następujących poleceń.
Aby opóźnić
15001ms
ruch do IP1.2.3.4
z hosta, na którym wykonywane jest polecenie. Poleceniehostname -I
służy do uzyskania głównego adresu IP hosta, ale wartość można zastąpić bezpośrednio w poleceniu.Musiałem dodać kolejny filtr z
0ms
opóźnieniem, aby dopasować ruch przychodzący z hosta. Na pewno nie jest elegancki, ale nie udało mi się uzyskać czegoś ładniejszego.Ostatnie polecenie można zastąpić, aby pasowało do jednego portu.
Aby opóźnić ruch do portu
18583
zamiast adresu IP1.2.3.4
.Znalazłem również drugą metodę tej odpowiedzi, aby opóźnić ruch
1.2.3.4:18583
bez wpływu na inny ruch.źródło