以前の回答を見つけました(https://serverfault.com/questions/461153/vlan-based-rate-limiting-using-tc)が、私のスクリプトにVLANマッチングを追加しようとすると、次のようになります。
「ノブ」とは何ですか?使用法: ...basic[EMATCH_TREE 一致][アクション ACTION_SPEC][classid CLASSID]
そのうち: SELECTOR := SAMPLE SAMPLE ... FILTERID := X:Y:Z ACTION_SPEC := ...各タスクを表示
注:CLASSIDは16進入力として解析されます。
私のスクリプトは次のとおりです。物理インターフェイスではうまく機能しますが(XXはVLAN番号です!)にem1
置き換えると失敗します。vlanXXX
オペレーティングシステムはopenSUSE LEAP15(4.12.14-lp150.12.16-default#1 SMP Tue Aug 14 17:51:27 UTC 2018(28574e6)x86_64 x86_64 x86_64 GNU / Linux)です。
#!/bin/bash
tc qdisc add dev vlanXX root handle 1:0 htb default 10
tc class add dev vlanXX parent 1:0 classid 1:10 htb rate 1000mbit ceil 1000mbit prio 0
tc class add dev vlanXX parent 1:0 classid 1:20 htb rate 15mbit ceil 16mbit prio 0
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 20
iptables -A OUTPUT -t mangle -p tcp --dport 443 -j MARK --set-mark 20
tc filter add dev vlanXX parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
VLAN マッチングに対する他の回答に基づいて試みたフィルタは次のとおりです。
tc filter add dev em1 parent 1:0 prio 0 protocol ip basic match "meta(vlan mask 0xfff eq 0x07D1)" handle 20 fw flowid 1:20
***修正する:
うまくインストールするには、次の構文が見つかりました。
tc filter add dev em1 parent 1:0 prio 0 protocol ip handle 20 basic match "meta(vlan mask 0xfff eq 0xB2)" flowid 1:20
sudo tc filter show dev em1 フィルタ 親 1: プロトコル ip pref 49152
基本フィルタ 親 1: プロトコル ip pref 49152 基本ハンドル 0x14
flowid 1:20元(VLANマスク0x00000fff eq 178)
しかし、構文がどのように機能するかわかりませんfw
(インターフェイス全体の速度を制限するのではなく、iptablesを使用して速度制限が適用されるポートを設定できます)。
たとえば、次は機能しません。
sudo tc filter add dev em1 parent 1:0 prio 0 protocol ip handle 20 fw basic match "meta(vlan mask 0xfff eq 0xB2)" flowid 1:20
基本一致 "meta (vlan マスク 0xfff eq 0xB2)" flowid 1:20
「基本」とは何ですか?使用法: ... fw [ classid CLASSID ] [ indev DEV ] [ action ACTION_SPEC ] CLASSID := X:Y CLASSID 形式で識別されたクラスに一致するパケットをプッシュします。 CLASSIDは16進入力として解析されます。 DEV:= 受信装置クラスの装置を指定します。 ACTION_SPEC:= 一致するパケットにアクションを適用します。注:ハンドルはHANDLE [/ FWMASK]として表示されます。 FWMASK のデフォルト値は 0xffffffff です。
答え1
パラメータの順序が重要です。マニュアルページから:
tc [ OPTIONS ] filter [ add | change | replace | delete | get ] dev DEV
[ parent qdisc-id | root ] [ handle filter-id ] protocol protocol prio priority
filtertype [ filtertype specific parameters ] flowid flow-id
したがって、ハンドルの仕様を前にしてくださいprotocol
。
tcコマンド自体はこれを反対方向に表示しますが:
$ tc filter help
Usage: tc filter [ add | del | change | replace | show ] [ dev STRING ]
[...]
[ pref PRIO ] protocol PROTO [ chain CHAIN_INDEX ]
[ estimator INTERVAL TIME_CONSTANT ]
[ root | ingress | egress | parent CLASSID ]
[ handle FILTERID ] [ [ FILTER_TYPE ] [ help | OPTIONS ] ]
^^^
しかし、それでも実際のフィルタ条件であるFILTER_TYPEの前に来ます。
あなたの命令に従って:
tc filter add dev em1 parent 1:0 prio 0 protocol ip basic match "meta(vlan mask 0xfff eq 0x07D1)" handle 20 fw flowid 1:20
...ハンドルはフィルタ(デフォルト一致...)の後に来るため、認識されなくなりました。もちろん、handle
独自のパラメータを持つフィルタを持つことは可能ですが、ここではそうではありません。
このフィルタが適しているかどうかを確認していませんが、「ハンドルは何ですか?」解析エラーは引数の順序でのみ発生する必要があります。表示される他のコマンドに対してもこのエラーは発生しません。