web-dev-qa-db-ja.com

iptables、ipset、およびtcを使用したトラフィックシェーピング(--match-setおよび--set-mark)

かなり単純なトラフィックシェーピングの問題であると私が信じていることに問題があります。

ルーター/ 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
Scalamoosh

うまくいけば、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の問題は解決するはずです。

0
David M. Syzdek

ある考え...あなたのセットにはMACアドレスが含まれていますが、PREROUTINGルールがMACアドレスではなくsrcまたはdstIPアドレスに一致しようとしているのではないかと思います。

1
interoperate