アスタリスク:VoIPトラフィックの優先順位付けとMikroTikの2つのプロバイダーのインターネットアクセスの予約

見出しに記載されていることは非常に簡単で、グローバルネットワーク上の多くの場所で説明されているように見えますが、これは一見しただけです。 最も一般的なヒントをテストした後、いくつかの「落とし穴」、ブロック、さらには岩の形成を見つけました。



しかし、これらはすべて言葉であり、要点に近いものです。

かなり一般的な状況は、MikroTikルーターの背後にあるLKS内のアスタリスクです。

PBXがインストールされているサーバーのトラフィックを分離するために、管理者はプロバイダーのチャネルの一部を遮断し、特定のIP専用に割り当てます。

または、必要なトラフィックがPBX IPアドレスだけでなく、パケットのサイズとプロトコルによっても決定される場合の別の実装。

試した-それは動作します。 忘れられますか? しかし、ありません。



管理者がサーバーのコンソールにいる間にインターネットから何かをマージしたい場合、またはその逆がインターネット上のどこかに大量のトラフィックを送信したい場合はどうなりますか? そうです-Pikからの有用なトラフィックと同様にMikroTikで優先され、最終的にIPテレフォニーの問題につながります。



ここでの解決策はIPv4自体と同じくらい古いものです。それによって生成されたアスタリスクでのみサーバー上のトラフィックをマークし、MikroTikがそれを「見る」、リリースする(このような失礼な英語主義についてはごめんなさい)ためだけに優先順位を付けます。



次の項目は、2つのインターネットプロバイダーからチャンネルを予約することです。

家庭でMikroTikルーターを使用するすべてのシステム管理者は、wikiのスクリプトを知っていると思います-wiki.mikrotik.com/wiki/Failover_Scripting

彼は誰にとっても良いですが、前の状況のように、多くの「しかし」があります。

最も重要なのは「接続追跡」という名前で、これは次のとおりです。

主要なISPが義人の仕事から休憩するように設計すると、トラフィックはバックアップに切り替わります。



誰もが喜んでいるようで、YouTubeも機能していますが、いくら専門家を叫んだとしても

sip reload
      
      





そして必死に高次の魔法を適用しようとしませんでした

 core restart now
      
      





SIP登録は増加しません。



しかし、実際には、「接続追跡」メカニズムでは、「古い」(メイン)インターネットチャネルのレコードがハングしたままであり、削除する必要があります。その後、登録が正常に発生し、通話が開始されます。



ラクダが誰であるかをMikroTikに証明する方法、およびスクリプト内の「古い」化合物のリセットを自動化する方法に興味がある場合は、猫のすぐ下にいます。





パート1. VoIPトラフィックの適切な優先順位付け



非常におしゃべりな紹介から、実際の部分に移りましょう。

MikroTikがこのタグを認識するようにトラフィックにタグを付ける方法は?

答えは簡単です-DSCP!

OK、特定のデーモン、この場合はアスタリスクのトラフィックはどうですか?

ここで問題ありません、先生(マダム)-iptables --uid-owner!



PBXを搭載したサーバーで、アスタリスクが持っているユーザーIDを確認します(アスタリスクはそれです)

 grep -i asterisk /etc/passwd|cut -d: -f3 1001
      
      







必要なDSCP値を示すルールを追加します(VoIPトラフィックの場合、CS5を指定するのが一般的です。数値形式では40)

ksg222によるコメント

通常、音声トラフィックは、信号用のCS5(シスコの場合はCS3)とRTPトラフィック用のEFの2つのDSCP値で「色付け」されているという事実に注目したいと思います。 もちろん、あなたの例では、これは重要ではありません。設定の主なことは、残りの中で音声トラフィックを強調することだからです。 とにかく、インターネット上のDSCPフィールドの優先順位付けはありません。



tools.ietf.org/html/rfc4594#section-2.3



www.cisco.com/c/en/us/td/docs/solutions/Enterprise/WAN_and_MAN/QoS_SRND/QoS-SRND-Book/QoSIntro.html#pgfId-46256





 iptables -I OUTPUT 1 -t mangle -m owner --uid-owner 1001 -j DSCP --set-dscp 40
      
      





*好奇心の強い人のために-記事の最後に、私がそれを手に入れた理由を見つけるためのリンクがあります





コメントでvarnavが提案したように、sip.confですぐに目的の値を設定できます

sip.confでDSCPラベルを作成できるのであれば、なぜIptablesでDSCPラベルを付けるのですか:



tos_sip = cs3; SIPパケットのTOSを設定します。

tos_audio = ef; RTPオーディオパケットのTOSを設定します。

tos_video = af41; RTPビデオパケットのTOSを設定します。



IP PBXを搭載したサーバーでのsimの場合、ルーターの構成を完了して続行します。

この資料を基礎として取りました-voxlink.ru/kb/voip-devices-configuration/mikrotik-voip-traffic-configuration

再投稿せず、すべてがそこに描かれ、リストのみを表示します。

MANGLEファイアウォールテーブル:

 /ip fm exp # nov/26/2015 17:09:20 by RouterOS 6.21.1 # software id = 5QIF-MH9A # /ip firewall mangle add action=mark-packet chain=forward new-packet-mark=def_out src-address=192.168.5.0/24 add action=mark-packet chain=forward new-packet-mark=def_out src-address=192.168.6.0/24 add action=mark-packet chain=forward dst-address=192.168.5.0/24 new-packet-mark=def_in add action=mark-packet chain=forward dst-address=192.168.6.0/24 new-packet-mark=def_in add action=mark-packet chain=forward dscp=40 new-packet-mark=voip_out src-address=192.168.7.10 add action=mark-packet chain=forward dscp=40 dst-address=192.168.7.10 new-packet-mark=voip_in
      
      





概要で説明したように、必要なトラフィックをIPおよびDSCPフィールドで照合します。



そしてキュー:

 /queue tree export # nov/26/2015 17:09:27 by RouterOS 6.21.1 # software id = 5QIF-MH9A # /queue tree add max-limit=30M name=in parent=global add max-limit=28M name=def-in packet-mark=def_in parent=in add limit-at=1M max-limit=2M name=voip-in packet-mark=voip_in parent=in priority=1 add max-limit=30M name=out parent=global add max-limit=28M name=def-out packet-mark=def_out parent=out add limit-at=1M max-limit=2M name=voip-out packet-mark=voip_out parent=out priority=1
      
      





ちなみに、ルータはとにかく高いDSCP値でトラフィックに優先順位を付ける必要がありますが、それでも2 Mb / sの帯域を確保しています。



パート2.フェールオーバースクリプト



最初から始めましょう。プロバイダーリンクとルーティングの構成方法を説明します。

2つのISPがあり、1つはイーサネットを介して接続され、もう1つはPPPoEによって接続されます。

明確にするために、リストを提供します。 イーサネット接続:

 [f@777777] > ip addr pr where interface=ether7 Flags: X - disabled, I - invalid, D - dynamic # ADDRESS NETWORK INTERFACE 0 46.11.6.78/30 46.11.6.76 ether7
      
      





PPPoE:

 [f@777777] > int pppoe-cl pr Flags: X - disabled, R - running 0 R name="rtk" max-mtu=auto max-mru=auto mrru=disabled interface=ether8 user="f" password="w" profile=default keepalive-timeout=60 service-name="" ac-name="" add-default-route=no dial-on-demand=no use-peer-dns=yes allow=pap,chap,mschap1,mschap2
      
      





注-インターフェイスを上げるときにデフォルトルートを追加しません。手動で静的に追加されます



次のステップはルーティングを構成することです

 [f@777777] > ip rpdt 0 AS comment=RTK_TABLE dst-address=0.0.0.0/0 gateway=rtk gateway-status=rtk reachable distance=1 scope=30 target-scope=10 routing-mark=RTK_mark 1 AS comment=GoodLine_TABLE dst-address=0.0.0.0/0 gateway=46.18.6.77 gateway-status=46.18.6.77 reachable via ether7 distance=1 scope=30 target-scope=10 routing-mark=GoodLine_mark 2 AS comment=MAIN_TABLE dst-address=0.0.0.0/0 gateway=46.18.6.77 gateway-status=46.18.6.77 reachable via ether7 distance=1 scope=30 target-scope=10 3 S comment=MAIN_TABLE dst-address=0.0.0.0/0 gateway=rtk gateway-status=rtk reachable distance=2 scope=30 target-scope=10 4 ADC dst-address=10.155.177.1/32 pref-src=10.155.177.13 gateway=pptp-out1 gateway-status=pptp-out1 reachable distance=0 scope=10 5 S dst-address=10.155.177.1/32 gateway=pptp-out1 gateway-status=pptp-out1 reachable distance=1 scope=30 target-scope=10 6 ADC dst-address=46.18.6.76/30 pref-src=46.18.6.78 gateway=ether7 gateway-status=ether7 reachable distance=0 scope=10 7 ADC dst-address=172.16.79.1/32 pref-src=172.16.79.251 gateway=l2tp-out1 gateway-status=l2tp-out1 reachable distance=0 scope=10 8 ADC dst-address=192.168.77.0/24 pref-src=192.168.77.1 gateway=bridge-local gateway-status=bridge-local reachable distance=0 scope=10 9 AS comment=thecall dst-address=192.168.254.0/24 gateway=172.16.79.1 gateway-status=172.16.79.1 reachable via l2tp-out1 distance=1 scope=30 target-scope=10 10 ADC dst-address=213.22.11.99/32 pref-src=217.11.15.125 gateway=rtk gateway-status=rtk reachable distance=0 scope=10
      
      





多くの過剰があり、0、1、2、3のみに関心があります。

2と3はデフォルトのルートです。2はメトリック(距離)「1」で現在アクティブであり、3はメトリック「2」で現在使用されていません



0と1が必要です。これにより、ルーターは、要求が来たのと同じインターフェース、つまり デフォルトで現在アクティブになっているルートに関係なく

次のルーティングルールのリストのルール0.1も同じロジックを提供します。

 [f@777777] > ip r ru pr Flags: X - disabled, I - inactive 0 src-address=217.11.15.125/32 action=lookup table=RTK_mark 1 src-address=46.18.6.78/30 action=lookup table=GoodLine_mark 2 dst-address=192.168.77.0/24 action=lookup table=main
      
      





ルール2は、MikroTikの背後にあるLANデバイスに必要です。



これはすべて「ポリシーベースのルーティング」と呼ばれ、最後にこれらのルールメカニズムの動作を理解するための便利なリンクをいくつか紹介します。

*はい、最小限の実装を行っていますが、これが必要です



私たちは食前酒を扱った、私たちはメインコースに従事します。

スクリプトリストは、次のようにスポイラーの下にまとめられています。 大きすぎます(すべてのUPDは既に含まれています)。

UPD1-スクリプトは2015年11月28日に修正されました。

条件を変更しました(ISP2にも当てはまります):

 - :if ($PingFailCountISP1 < ($FailTreshold)) + :if ($PingFailCountISP1 < ($FailTreshold+1))
      
      





ルート追加も追加

 :if ([/interface get value-name=running $InterfaceISP1]) do={ /ip route add dst-address=$PingTarget gateway=$GatewayISP1 :set PingResult [ping $PingTarget count=3]
      
      





なぜなら 目的のインターフェイスを指定するだけで、ルートがアクティブになっていない場合、pingは通過しません



各ISPチェックの最後に、ルートが削除されます

 /ip route rem [find dst-address="$PingTarget" . "/32"]
      
      









UPD2-スクリプトはRouterOSバージョン6.33.1で正常に実行されます



UPD3

PBXIP変数は引用符で囲む必要があります

 :local PBXIP "192.168.77.10"
      
      





接続の削除の各行「接続追跡」には引用符を付けないでください

 /ip firewall connection { remove [find src-address~$PBXIP] }
      
      









非表示のテキスト
 # ------------------- header ------------------- # Script by Tomas Kirnak, version 1.0.7 # If you use this script, or edit and # re-use it, please keep the header intact. # # For more information and details about # this script please visit the wiki page at # http://wiki.mikrotik.com/wiki/Failover_Scripting # ------------------- header ------------------- #------------------- header_1 ------------------ # FessAectan has made some changes: # - add ISPs link state checking - # - add clearing connection tracking states for selected IP - # ------------------ header_1 ------------------ # ------------- start editing here ------------- # Edit the variables below to suit your needs # Please fill the WAN interface names :local InterfaceISP1 ether7 :local InterfaceISP2 rtk # Please fill the gateway IPs (or interface names in case of PPP) :local GatewayISP1 46.18.6.77 :local GatewayISP2 rtk # Please fill the ping check host - currently: resolver1.opendns.com :local PingTarget 21.7.2.77 # Please fill how many ping failures are allowed before fail-over happends :local FailTreshold 1 # Define the distance increase of a route when it fails :local DistanceIncrease 2 # Editing the script after this point may break it # -------------- stop editing here -------------- # Declare the global variables :global PingFailCountISP1 :global PingFailCountISP2 :global InterfaceFailISP1 :global InterfaceFailISP2 # This inicializes the PingFailCount variables, in case this is the 1st time the script has ran :if ([:typeof $PingFailCountISP1] = "nothing") do={:set PingFailCountISP1 0} :if ([:typeof $PingFailCountISP2] = "nothing") do={:set PingFailCountISP2 0} # IntercaceFail variables. First time initialization. :if ([:typeof $InterfaceFailISP1] = "nothing") do={:set InterfaceFailISP1 0} :if ([:typeof $InterfaceFailISP2] = "nothing") do={:set InterfaceFailISP2 0} # This variable will be used to keep results of individual ping attempts :local PingResult # Your PBX IP :local PBXIP "192.168.77.10" # Check ISP1 :if ([/interface get value-name=running $InterfaceISP1]) do={ /ip route add dst-address=$PingTarget gateway=$GatewayISP1 :set PingResult [ping $PingTarget count=3 interface=$InterfaceISP1] :if ($PingResult = 0) do={ :if ($PingFailCountISP1 < ($FailTreshold+1)) do={ :set PingFailCountISP1 ($PingFailCountISP1 + 1)} :if ($PingFailCountISP1 = $FailTreshold) do={ :log warning "ISP1 has a problem en route to $PingTarget - increasing distance of routes." :foreach i in=[/ip route find gateway=$GatewayISP1 && static && comment=MAIN_TABLE] do=\ {/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)} :log warning "Route distance increase finished." /ip firewall connection { remove [find src-address~$PBXIP] } } } } else={ :if ($InterfaceFailISP1 = 0) do={ :set InterfaceFailISP1 1 :log warning "ISP1 intarface link is down - clear all connections from $PBXIP" /ip firewall connection { remove [find src-address~$PBXIP] } } } :if ([/interface get value-name=running $InterfaceISP1]) do={ :if ($InterfaceFailISP1 = 1) do={ :set InterfaceFailISP1 0 :log warning "ISP1 intarface link is up - clear all connections from $PBXIP" /ip firewall connection { remove [find src-address~$PBXIP] } } } :if ($PingResult > 0) do={ :if ($PingFailCountISP1 > 0) do={ :set PingFailCountISP1 ($PingFailCountISP1 - 1) :if ($PingFailCountISP1 = ($FailTreshold -1)) do={ :log warning "ISP1 can reach $PingTarget again - bringing back original distance of routes." :foreach i in=[/ip route find gateway=$GatewayISP1 && static && comment=MAIN_TABLE] do=\ {/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)} :log warning "Route distance decrease finished." /ip firewall connection { remove [find src-address~$PBXIP] } } } } /ip route rem [find dst-address="$PingTarget" . "/32"] # Check ISP2 :if ([/interface get value-name=running $InterfaceISP2]) do={ /ip route add dst-address=$PingTarget gateway=$GatewayISP2 :set PingResult [ping $PingTarget count=3 interface=$InterfaceISP2] :if ($PingResult = 0) do={ :if ($PingFailCountISP2 < ($FailTreshold+1)) do={ :set PingFailCountISP2 ($PingFailCountISP2 + 1)} :if ($PingFailCountISP2 = $FailTreshold) do={ :log warning "ISP2 has a problem en route to $PingTarget - increasing distance of routes." :foreach i in=[/ip route find gateway=$GatewayISP2 && static && comment=MAIN_TABLE] do=\ {/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)} :log warning "Route distance increase finished." /ip firewall connection { remove [find src-address~$PBXIP] } } } } else={ :if ($InterfaceFailISP2 = 0) do={ :set InterfaceFailISP2 1 :log warning "ISP2 interface link is down - clear all connections from $PBXIP" /ip firewall connection { remove [find src-address~$PBXIP] } } } :if ([/interface get value-name=running $InterfaceISP2]) do={ :if ($InterfaceFailISP2 = 1) do={ :set InterfaceFailISP2 0 :log warning "ISP2 intarface link is up - clear all connections from $PBXIP" /ip firewall connection { remove [find src-address~$PBXIP] } } } :if ($PingResult > 0) do={ :if ($PingFailCountISP2 > 0) do={ :set PingFailCountISP2 ($PingFailCountISP2 - 1) :if ($PingFailCountISP2 = ($FailTreshold -1)) do={ :log warning "ISP2 can reach $PingTarget again - bringing back original distance of routes." :foreach i in=[/ip route find gateway=$GatewayISP2 && static && comment=MAIN_TABLE] do=\ {/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)} :log warning "Route distance decrease finished." /ip firewall connection { remove [find src-address~$PBXIP] } } } } /ip route rem [find dst-address="$PingTarget" . "/32"]
      
      







変数の説明ですべてが明確になった後、ロジック自体について簡単に説明します。

1.インターフェイスにリンクがあるかどうかを確認します(PPPoE接続があります)

2.はい-$ PingTargetの可用性を確認します

2a。 いいえ-PBXのsrc-addressへのすべての接続を削除します。 「2」メトリックのルートがアクティブになるため、SIP登録がアップするように古い接続を削除する必要があります。

3. $ PingTargetが利用可能です-ISP2を確認しましょう

3a。 $ PingTargetは利用できません-ISP1を経由するルートのメトリックを2減らし、「接続追跡」から古い接続を削除します



インターフェイス状態チェックを追加したのはなぜですか?

ポートにリンクがない場合、pingを送信しても意味がありません。

または、PPPインターフェース(私のような)の場合、pingはまったく機能せず、スクリプトロジックに違反します。

 [f@777777] <SAFE> interface pppoe-cl di 0 [f@777777] <SAFE> [f@777777] <SAFE> [f@777777] <SAFE> [f@777777] <SAFE> [f@777777] <SAFE> :if ([/ping 8.8.8.8 interface=rtk count=3]>0) do={:put "Yes sir"} SEQ HOST SIZE TTL TIME STATUS <!--         -    --> [f@777777] <SAFE> interface pppoe-cl en 0 [f@777777] <SAFE> :if ([/ping 8.8.8.8 interface=rtk count=3]>0) do={:put "Yes sir"} SEQ HOST SIZE TTL TIME STATUS 0 8.8.8.8 timeout 1 8.8.8.8 timeout 2 8.8.8.8 56 254 52ms sent=3 received=1 packet-loss=66% min-rtt=52ms avg-rtt=52ms max-rtt=52ms Yes sir
      
      







事は小さいので、タスクをルーターのシェダーに追加します。

 [f@777777] > sys sch exp # nov/26/2015 17:37:29 by RouterOS 6.30 # software id = LY7Z-747B # /system scheduler add interval=30s name=check_ISPs on-event=check_gateways policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=nov/20/2015 start-time=05:37:37
      
      





そして、ここまでで、デザートに移りましょう-使用されるリソースです。



パート3.結論、使用されるリソース



DSCPについて読みたい場合は、次のリンクを使用することをお勧めします。

1. シスコ

2. ru.wikipedia

3. msdn.microsoft

4. ミクロシン



MikroTikでのパケットの転送方法、ポリシールーティングの構成について:

1.wikiマニュアル:Packet_Flow

2.wiki Policy_Base_Routing

3. nixman Policy_Base_Routing

4. blog.butchevans Policy_Base_Routing



iptablesのマニュアルは誰もが知っていると思いますが、いくつか便利です:

1. ru.wikibooks.org/wiki/Iptables

2. opennet iptables guid



このため、私はそれを読んだ人のおかげで、私の休暇を取る。

これが本質であるので、私が役に立つとわかるならば、私は非常にうれしいです。

皆さん、幸運を祈ります!



All Articles