web-dev-qa-db-ja.com

プライベート宛先IPアドレスに基づくLinux収入フィルタリング

インターネットからのトラフィックが低優先度クラスと高優先度クラスに分類されるように、OpenWRTボックスにQoSスクリプトを設定しようとしています。トラフィックを分類するための基準は、ホームネットワーク内の宛先IPアドレス、つまりプライベートIPアドレスです。具体的には、トラフィックがIP = 192.168.1.22にアドレス指定されている場合は、低い優先順位になり、そうでない場合は高い優先順位になります。

以前の方法を実装するために、eth1インターフェイスに到着するすべてのインターネットトラフィックをIFBデバイスにリダイレクトし、そこでトラフィックシェーピングを実装します。しかし、私が抱えている問題は、すべてのトラフィックがハイプリオクラスに送られることです。フィルタリングを行うために、iptablesを使用して着信トラフィックにマークを設定していますが、エラーが発生している場所があると思います。 PREROUTING、FORWARD、POSTROUTINGチェーンを試した「マングル」テーブルにフィルタリングルールを挿入していますが、これらのチェーンのいずれでも機能しません。

どんな助けでも大歓迎です。

宜しくお願いします

ダニエル

使用しているスクリプトをここに添付します。

# Variable definition
ETH=eth1
IFB=ifb1
IP_LP="192.168.1.22/32"
DL_RATE="900kbit"
HP_RATE="890kbit"
LP_RATE="10kbit"
TC="tc"
IPTABLES="iptables"

# Loading the required modules
insmod ifb
insmod sch_htb
insmod sch_ingress
insmod ipt_IMQ
insmod act_mirred
insmod act_connmark
insmod cls_u32
insmod cls_fw
insmod em_u32

# Bringing up the $IFB interface, and redirecting all the ingress traffic arriving to the $ETH interface to it
$TC qdisc del dev $ETH ingress
$TC qdisc add dev $ETH ingress
ifconfig $IFB up 
$TC filter add dev $ETH parent ffff: protocol ip prio 1 u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev $IFB

# Adding the HTB scheduler to the ingress interface
$TC qdisc add dev $IFB root handle 1: htb default 11

# add main rate limit classes
$TC class add dev $IFB parent 1: classid 1:1 htb rate $DL_RATE

# add leaf classes: set the maximum bandwidth that each priority class can get, and the maximum borrowing they can do
$TC class add dev $IFB parent 1:1 classid 1:10 htb rate $LP_RATE ceil $DL_RATE
$TC class add dev $IFB parent 1:1 classid 1:11 htb rate $HP_RATE ceil $DL_RATE

# filter traffic into classes by fwmark
$TC filter add dev $IFB parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10  # packets with MARK 10 go to classid 1:10
$TC filter add dev $IFB parent 1:0 prio 0 protocol ip handle 11 fw flowid 1:11  # packets with MARK 11 go to classid 1:11

# add MYSHAPER-IN chain to the mangle table in iptables
$IPTABLES -t mangle -N MYSHAPER-IN                      # create a user defined chain in the mangle table
$IPTABLES -t mangle -I PREROUTING -i $ETH -j MYSHAPER-IN            # insert a rule in the PREROUTING chain to jump to our chain

# add fwmark entries to classify different types of traffic - Set fwmark according to the priority.
$IPTABLES -t mangle -A MYSHAPER-IN -d $IP_LP -j MARK --set-mark 10              # rule to mark packets addressed to the low prio Host 
$IPTABLES -t mangle -A MYSHAPER-IN -m mark --mark 0 -j MARK --set-mark 11       # rule to mark any unmarked packets as high prio

ここでは、着信トラフィックがどのようにIFBインターフェイスに正常にリダイレクトされるかを確認できますが、すべて高優先度クラスに送られます(もちろん、この統計を取得したときに低優先度のホストがデータを受信して​​いました)。

:~# tc -s class show dev ifb1
class htb 1:11 parent 1:1 prio 0 rate 890000bit ceil 900000bit burst 1599b cburst 1599b 
 Sent 71763116 bytes 58364 pkt (dropped 7296, overlimits 0 requeues 0) 
 rate 893208bit 84pps backlog 0b 31p requeues 0 
 lended: 57510 borrowed: 823 giants: 0
 tokens: -50586 ctokens: -189649

class htb 1:10 parent 1:1 prio 0 rate 10000bit ceil 900000bit burst 1600b cburst 1599b 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 rate 0bit 0pps backlog 0b 0p requeues 0 
 lended: 0 borrowed: 0 giants: 0
 tokens: 20000000 ctokens: 222218

class htb 1:1 root rate 900000bit ceil 900000bit burst 1599b cburst 1599b 
 Sent 71720770 bytes 58333 pkt (dropped 0, overlimits 0 requeues 0) 
 rate 891776bit 84pps backlog 0b 0p requeues 0 
 lended: 823 borrowed: 0 giants: 0
 tokens: -189649 ctokens: -189649
2
Dani Camps

私はついに問題を解決することができたので、他の誰かに役立つ可能性がある場合に備えて、ここに文書化します。秘訣は、IFBデバイスの代わりにIMQデバイスを使用することでした。その後、iptablesで分類してIMQを使用しても問題はありませんでした。

宜しくお願いします

ダニエル

これは動作するスクリプトです:

#!/bin/sh

# This script classifies all the Internet traffic addressed to a given IP in our LAN (IP_LP) as low priority. 
# All the rest of traffic is classified as high priority. In the absence of high prio the low prio can grab all the bandwidth. 
# However, when there is high prio traffic the low prio one is limited to 10Kbos. 

INTERNET="eth1"
IMQ="imq1"
IP_LP="192.168.1.22/32"
DL_RATE="900kbit"
HP_RATE="890kbit"
LP_RATE="10kbit"
TC="tc"
IPTABLES="iptables"
IFCONFIG="ifconfig"

# Loading the required modules
insmod ifb
insmod sch_htb
insmod sch_ingress
insmod ipt_IMQ
insmod act_mirred
insmod act_connmark
insmod cls_u32
insmod cls_fw
insmod em_u32

# Bringing up the IMQ device
$IFCONFIG $IMQ up

# Adding the HTB scheduler to the ingress interface
$TC qdisc add dev $IMQ root handle 1: htb default 11

# add main rate limit classes
$TC class add dev $IMQ parent 1: classid 1:1 htb rate $DL_RATE

# add leaf classes: set the maximum bandwidth that each priority class can get, and the maximum borrowing they can do
$TC class add dev $IMQ parent 1:1 classid 1:10 htb rate $LP_RATE ceil $DL_RATE
$TC class add dev $IMQ parent 1:1 classid 1:11 htb rate $HP_RATE ceil $DL_RATE

# Filtering packets according to destination IP address
$TC filter add dev $IMQ parent 1: protocol ip prio 1 u32 match ip dst $IP_LP flowid 1:10

# Sending packets after SNAT has been done into the IMQ device
$IPTABLES -t mangle -A FORWARD -i $INTERNET -j IMQ --todev 1
1
Dani Camps