ミクロティック。 家庭向けQoS

今日は優先事項について少しお話ししたいと思います。

画像






この記事は、Mikrotikに関するすべてのQoS情報を網羅しているとは主張していません。 これは、単純なトラフィックの優先順位付けスキームを構成し、必要に応じてそれを補充できる一連のルールのデモです。



同僚がコメントのヒントを手伝ってくれることを願っています。



QoSについて言えば、通常は2つの方向を意味します。つまり、チャネルをユーザー数でほぼ均等に分割するか、トラフィックを優先します。 これらの指示は互いに完全に補完しますが、家庭にとって、家族にとっては、チャンネルを共有する意味がありません。このトピックに興味がある場合は、徹底的に明らかにする記事「 MikroTik QoS-神話を暴く 」を参照します。



トラフィックが少し簡単になるため、トラフィックの優先順位付けに焦点を当てます。



データレート制限は、次の2つの方法で実行できます。



1.送信レート制限(シェーパー)を超えるパケットはすべて破棄されます。

2.指定された伝送速度の制限を超えたキュー内のパケットの遅延と、できるだけ早くそれらを送信します。 伝送速度の均等化(シェダー)。



レート制限とイコライジングの原則






図からわかるように、シェーパーは収まらないものをすべてカットし、シェダーは単にスローダウンします。

したがって、シェダーが必要です。



ここで、トラフィックをクラスに分割し、各クラスに優先度を設定する必要があります。 最初のクラスが最初に提供され、最後のクラスが最後に提供されます。



よく使用されるこのようなソリューションの最も単純なバージョンは、単にVoIPトラフィックに優先順位を付けることであり、残りは残されますが、もう少し複雑にします。



したがって、計画は次のとおりです。



prio_1:DNS、ICMP、ACK- 公式トラフィックが最初に来ます。 接続の設定と切断、名前の解決など。

prio_2:SIP- VoIPはレイテンシが非常に少ないのが大好きです。

prio_3:SSHとゲーム- リモートアクセスは機能するために重要です。 ゲームはリラックスのためです。

prio_4:RDPおよびHTTP / HTTPS- ウェブ、ビデオなど

prio_5:上記で特定されていないものはすべて、原則として、ここで急流を強制することができます。 幸いなことに、顧客が働くポートはよく知られています。



少し叙情的な余談:



MikrotikでQoSに関する情報を検索すると、Greg Sowellによる巨大なQOSスクリプトまたはそれに明示的に基づいたすべてのQoSツリーのマザーから始まり、 トラフィック優先順位付けスクリプトで終わるいくつかのスクリプトオプションが見つかります(ところで、注意することをお勧めします、著者は自分が何をしているかをはっきりと理解していないので、スクリプトは明らかに意図したことをしていないことは明らかです。 これらのすべてのスクリプトには、1つの共通の問題があります-それらは長い間書かれていて、1つの単純な理由で大部分が時代遅れです-世界は変わりました。



現在、ユニバーサルトラフィック暗号化のおかげで、L7-regexpを使用してYouTubeトラフィック(Skypeなど)を簡単にキャッチして使用することはできません。 したがって、このようなスクリプトを使用して、トラフィックを決定する問題を慎重に検討してください。 私の意見では、これがこの問題の唯一の難しさです。



次に、上記の計画に従ってトラフィックをマークします。 コードでは、interfaceBandwidth、つまり チャネル幅。 対称的で100Mに等しい。 チャネル幅が異なる場合は、interfaceBandwidth値を必要な値に変更する必要があります。 チャネルが非同期の場合、着信トラフィックと発信トラフィックのパケットを個別にマークする必要があるため、スクリプトはより困難になります。 これは難しいことではありませんが、スクリプトを大幅に増やして読みやすさを損ない、一般的には記事の範囲外です。



アドレスリストでは、FQDNからアドレスを一括挿入する機能を示します(たとえば、World of Tanksのwikiからクラスターのアドレスが取得されます)。 もちろん、必要なIPを手動で登録するだけです。



#Set bandwidth of the interface :local interfaceBandwidth 100M # address-lists :for i from=1 to=10 do={/ip firewall address-list add list=WoT address=("login.p"."$i".".worldoftanks.net")} # /ip firewall mangle # prio_1 add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=icmp add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=tcp port=53 add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=udp port=53 add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=tcp tcp-flags=ack packet-size=0-123 # prio_2 add chain=prerouting action=mark-packet new-packet-mark=prio_2 dscp=40 add chain=prerouting action=mark-packet new-packet-mark=prio_2 dscp=46 add chain=prerouting action=mark-packet new-packet-mark=prio_2 protocol=udp port=5060,5061,10000-20000 src-address=192.168.100.110 add chain=prerouting action=mark-packet new-packet-mark=prio_2 protocol=udp port=5060,5061,10000-20000 dst-address=192.168.100.110 # prio_3 add chain=prerouting action=mark-packet new-packet-mark=prio_3 protocol=tcp port=22 add chain=prerouting action=mark-packet new-packet-mark=prio_3 src-address-list=WoT add chain=prerouting action=mark-packet new-packet-mark=prio_3 dst-address-list=WoT # prio_4 add chain=prerouting action=mark-packet new-packet-mark=prio_4 protocol=tcp port=3389 add chain=prerouting action=mark-packet new-packet-mark=prio_4 protocol=tcp port=80,443      : <source>queue tree add max-limit=$interfaceBandwidth name=QoS_global parent=global priority=1 :for indexA from=1 to=4 do={ /queue tree add \ name=( "prio_" . "$indexA" ) \ parent=QoS_global \ priority=($indexA) \ queue=ethernet-default \ packet-mark=("prio_" . $indexA) \ comment=("Priority " . $indexA . " traffic") } /queue tree add name="prio_5" parent=QoS_global priority=5 \ queue=ethernet-default packet-mark=no-mark comment="Priority 5 traffic"
      
      





最後に、MikrotikはWMMをサポートしているので、トラフィックも彼のためにマークすることは論理的です。



これは、set_priorityコマンドを使用して同じマングルによって行われます。 Mikrotikのwikiによると、WMM優先順位テーブルは非常に奇妙に見えます。



1,2-背景

0.3-ベストエフォート

4,5-ビデオ

6.7-音声。



パケットのマーキングと同じルールを使用して優先順位を付けます。



 /ip firewall mangle # prio_1 add chain=prerouting action=set-priority new-priority=7 protocol=icmp add chain=prerouting action=set-priority new-priority=7 protocol=tcp port=53 add chain=prerouting action=set-priority new-priority=7 protocol=udp port=53 add chain=prerouting action=set-priority new-priority=7 protocol=tcp tcp-flags=ack packet-size=0-123 # prio_2 add chain=prerouting action=set-priority new-priority=6 dscp=40 add chain=prerouting action=set-priority new-priority=6 dscp=46 add chain=prerouting action=set-priority new-priority=6 protocol=udp port=5060,5061,10000-20000 src-address=192.168.100.110 add chain=prerouting action=set-priority new-priority=6 protocol=udp port=5060,5061,10000-20000 dst-address=192.168.100.110 # prio_3 add chain=prerouting action=set-priority new-priority=5 protocol=tcp port=22 add chain=prerouting action=mark-packet new-packet-mark=prio_3 src-address-list=WoT add chain=prerouting action=mark-packet new-packet-mark=prio_3 dst-address-list=WoT # prio_4 add chain=prerouting action=set-priority new-priority=3 protocol=tcp port=3389
      
      





原則として、それだけです。



将来、必要に応じて、次のようなスクリプトによってDNSキャッシュから定期的に生成される動的アドレスリストの作成を検討できます。



 :foreach i in=[/ip dns cache all find where (name~"youtube" || name~"facebook" || name~".googlevideo")] do={:put [/ip dns cache get $i address]}
      
      





オンライン動画を選択します。



または、upnpルールを検索してSkypeを検出します。



 :foreach i in=[/ip firewall nat find dynamic and comment~"Skype"] do={:put [/ip firewall nat get $i dst-port]}
      
      





しかし、これまでのところ私はそのような必要はありません。



この記事のスクリプトはGitHubで入手できます 。 何かうまくいかなかった場合は、アイデアやコメントを書いてください。



ご清聴ありがとうございました!



UPD:記事の元のバージョンでは、スクリプトにエラーがありました(誤って選択されたチェーン)。 修正されたスクリプト。



All Articles