かなり単純なトラフィックシェーピングの問題であると私が信じていることに問題があります。
ルーター/ NATとして機能しているUbuntu(16.04)サーバーがあります。一部のデバイスを512kbpsに調整しながら、ほとんどのユーザーが2mbpsインターネットを使用できるようにしたいと思います。
ipset
にスロットルされたデバイスのリストがあります。これらのデバイスからのパケットを--mark-set
して、tc
がトラフィックシェーピングでそれらをターゲットにできるようにしようとしています。
私の現在の設定は次のとおりです。
tc qdisc del root dev $LAN
tc qdisc add dev $LAN root handle 1: htb default 20
tc class add dev $LAN parent 1: classid 1:1 htb rate 6mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:10 htb rate 5mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:20 htb rate 2mbit ceil 2mbit burst 15k
tc class add dev $LAN parent 1:1 classid 1:30 htb rate 512kbit ceil 512kbit burst 15k
tc qdisc add dev $LAN parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $LAN parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $LAN parent 1:30 handle 30: sfq perturb 10
tc filter add dev $LAN protocol ip parent 1: prio 1 handle 6 fw flowid 1:30
$IPS create throttled hash:mac -exist
$IPS add throttled 00:11:22:33:44:55 -exist
$IPT -A PREROUTING -t mangle -m set --match-set throttled src,dst -j MARK --set-mark 6
これは512kbpsに私を絞ることはありません(私のMacアドレスが提供されたものであると仮定して)、それはデフォルトの2mbpsにフォールバックします
--match-set
の部分を削除すると、すべてのデバイスが512kbpsまで正しく抑制されます(これにより、tc
セクションが正しいと思います)
ただし、このセットに一致するパケットをDROP
すると、パケットは正しくドロップされます(これにより、iptables
セクションが正しいと思います)
ここで何かが足りないのでしょうか、それともこれら2つのコマンドをこのように一緒に使用できないのでしょうか。
どんな助けでも大歓迎です。
ありがとう、
うまくいけば、1年後にあなたはあなたの問題を理解しました、しかし次の人々の利益のために、以下はあなたの問題の少なくとも1つの説明です。
提供したipset
の例に基づくと、iptables
ルールは無効です。セットタイプhash:mac
は、単一のフィールドのみを格納します。ただし、iptablesステートメントは、データペア(つまり、mac、IPまたはmac、netなどの2つのフィールド)が含まれているかのようにセットをテストしています。そのため、パケットの送信元MACアドレスとパケットの未定義の宛先フィールドを使用して、セット内のエントリを照合します。
ipset create throttled hash:mac -exist
ipset add throttled 00:11:22:33:44:55 -exist
iptables -A PREROUTING -t mangle -m set --match-set throttled src,dst -j MARK --set-mark 6
ただし、使用されるセットタイプのため、1つのフィールドに対してのみ一致させることができます。次のiptablesステートメントは、セットに含まれる送信元MACアドレスと一致する正しい方法を示しています。
ipset create throttled hash:mac -exist
ipset add throttled 00:11:22:33:44:55 -exist
iptables -A PREROUTING -t mangle -m set --match-set throttled src -j MARK --set-mark 6
説明のために、ファイアウォールにhash:net,port,net
タイプのセットがあるかどうかを検討してください。セットにはトリプル(2つのネットワークと1つのポート)が格納されます。
ファイアウォールに次のipsetエントリとiptablesルールがあると仮定しましょう。
# creates set
ipset create throttled hash:net,port,net
ipset add services 192.168.0.0/16,tcp:80,192.168.1.80/32
ipset add services 192.168.0.0/16,tcp:443,192.168.1.80/32
# clear all rules (to illustrate that conntrack is not being used)
iptables -F FORWARD
# allows traffic to web server
iptables -A FORWARD -m set --match-set services src,dst,dst -j ACCEPT
# allows traffic from web server
iptables -A FORWARD -m set --match-set services dst,src,src -j ACCEPT
# drop all other traffic
iptables -P DROP
上記のルールは、機能的に次のものと同等です。
# clear all rules (to illustrate that conntrack is not being used)
iptables -F FORWARD
# allows traffic to web server
iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 80 -d 192.168.1.80/32 -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 443 -d 192.168.1.80/32 -j ACCEPT
# allows traffic from web server
iptables -A FORWARD -d 192.168.0.0/16 -p tcp --sport 80 -s 192.168.1.80/32 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/16 -p tcp --sport 443 -s 192.168.1.80/32 -j ACCEPT
# drop all other traffic
iptables -P DROP
上記の2つの方法は機能的には同等ですが、ハッシュテーブルルックアップとiptablesルールの線形評価を利用するため、ipsetメソッドは多数のエントリでパフォーマンスが向上します。
セットを使用する場合、セットタイプによって、使用される一致フィールドの数が決まります。 iptablesステートメントは、パケットの送信元フィールドと宛先フィールドのどちらを使用してセットの各フィールドを照合するかを指定します。
以下は、説明するためのいくつかのマッピングです。
ipset type | iptables match-set | Packet fields
------------------+--------------------+---------------------------------
hash:net,port,net | src,dst,dst | src IP address, dst port, dst IP address
hash:net,port,net | dst,src,src | dst IP address, src port, src IP address
hash:ip,port,ip | src,dst,dst | src IP address, dst port, dst IP address
hash:ip,port,ip | dst,src,src | dst IP address, src port, src ip address
hash:mac | src | src mac address
hash:mac | dst | dst mac address
hash:ip,mac | src,src | src IP address, src mac address
hash:ip,mac | dst,dst | dst IP address, dst mac address
hash:ip,mac | dst,src | dst IP address, src mac address
TC/iptablesの相互作用内に追加の問題がある可能性がありますが、これで少なくともipset/iptablesの問題は解決するはずです。
ある考え...あなたのセットにはMACアドレスが含まれていますが、PREROUTINGルールがMACアドレスではなくsrcまたはdstIPアドレスに一致しようとしているのではないかと思います。