VoIP設定 · 1 min read · Jan 22, 2026

VoIPユーザーのためのQoSとトラフィックシェーピング:iproute2とAsteriskを使用

VoIPユーザーのためのQoSとトラフィックシェーピング:iproute2とAsteriskを使用

私のVoIP電話の通話品質は、何かをダウンロードまたはアップロードしているときに悪化しました。これは特に、私に電話をかけている人々にとってイライラするものでした(私は彼らの声をよりよく聞くことができました)。そこで、Iproute2や他のハウツーを調べてみましたが、特にVoIPトラフィックに関しては、うまくいくものを見つけることができませんでした。いくつか試行錯誤した結果、私にとって適切な設定を見つけました:ワイヤ上の活動に関係なく、一貫したVoIP品質です。

私のVoIPシステムについての注意点:私は予備のノートパソコン(IBM T20)でAsteriskを使用しており、私のVoIPプロバイダーはカナダの優れたUnlimitelです。自分のAsteriskボックスをホストしているので、ほぼ何でも設定できます。また、イントラネット上にあるIAXハードフォンも購入しました。

セットアップ

Linuxファイアウォールがすでに設定されていると仮定します。VoIPパケットはファイアウォールを通過し、NATはすでに設定されて機能しています。このセットアップではファイアウォールには触れません。必要なのは、VoIPパケットを優先するための適切なqdisc、クラス、およびフィルターを作成することだけです。Iproute2のtcコマンドがそれに役立ちます。

あなたのネットワークが次のようになっていると仮定しましょう:

Internet <------> Cable modem <-------> Linux Firewall <-----> Intranet <-----> VoIP phone

私はIAXを使用してAsteriskを使用しているので、関心のあるポートはポート4569です。SIPを使用している場合は、次の行のポートを適応させてください。

一部の背景情報

IPパケットにはQoS(サービスの質)を事前設定できる領域があります。あなたのISPはおそらくそれを無視するでしょうが、ローカルネットワーク内でトラフィックシェーピングに利用できます。4つのQoSビットは次の通りです:

0x02: 金銭的コストの最小化

0x04: 信頼性の最大化

0x08: スループットの最大化

0x10: 遅延の最小化

公式には、これらのビットのうち1つだけをオンにすることが許可されています。ファイアウォールは、パケットが到着するとそれを見て、通常は遅延を最小化するものを最初に転送するかどうかを判断します。

非公式には、これらのビットを同時にオンにすることができます。つまり、遅延を最小化し、スループットを最大化するパケットを持つことができます。このことを念頭に置いて、Iproute2のいくつかの機能を見てみましょう。

Iproute2とtc

デフォルトでは、パケットは先入れ先出しで送信されます。tcを使用すると、それを劇的に変更できます。非常にシンプルなキューイングシステムを使用しましょう:3つの「パイプ」(またはキュー)を持ち、それに優先順位を割り当てます。つまり、キュー1に何かがある限り、キュー2を空に(またはデキュー)しません。そして、キュー2に何かがある限り、キュー3をデキューしません。

これは次のコマンドで行います(注意:eth1は外部インターフェースです):

tc qdisc add dev eth1 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0

priomapの16の値は重要です。基本的に、ほとんどのパケットは3番目のキューに入ります(ゼロから始まるため、「2」と呼ばれます)。ただし、QoS遅延最小化のビットを持つパケットは2番目のキューに入れられ、すべてのQoSビットがオンのパケットは1番目のキューに入れられます。(prioキューイングディシプリンはデフォルトで3つのキューを設定します)

16の値は次のQoSの順序です:

1: 0x00: QoSが設定されていない -> 3番目のキュー(2)

2: 0x02: 金銭的コストの最小化(MMC)(2)

3: 0x04: 信頼性の最大化(MR)(2)

4: 0x06: MMC + MR(2)

5: 0x08: スループットの最大化(MT)(2)

6: 0x0a: MT + MMC(2)

7: 0x0c: MT + MR(2)

8: 0x0e: MT + MR + MMC(2)

9: 0x10: 遅延の最小化(MD)(1)

10: 0x12: MD + MMC(1)

11: 0x14: MD + MR(1)

12: 0x16: MD + MMC + MR(1)

13: 0x18: MD + MT(1)

14: 0x1a: MD + MT + MMC(1)

15: 0x1c: MD + MT + MR(1)

16: 0x1e: MD + MT + MR + MMC(0)

これが私たちの最初のステップでした。

次に、各キューを調整して、それ自体にいくつかのキューイングディシプリンを持たせます:

tc qdisc add dev eth1 parent 1:1 handle 10: sfq limit 3000
tc qdisc add dev eth1 parent 1:2 handle 20: sfq
tc qdisc add dev eth1 parent 1:3 handle 30: sfq

これにより、最初のキューには3000パケットの容量があるとされます。実際には、tcプログラムにハードコーディングされているため、サイズは128パケットになります。

この時点で、ほとんどのパケットは3番目のキューを通過しますが、遅延最小化QoSビットが設定されたものは除きます。

Asteriskボックスのiax.confを次のように調整すると、一部のパケットが最初のキューに入る可能性があります:

tos=0x1e

ただし、これは保証ではないため、tcの別のトリックでそれらをキュー1に強制します。

IAXはポート4569を使用することを忘れないでください。したがって、このポートへの送信および受信のすべてのパケットを最初のキューを通過させるように強制します:

tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 4569 0xffff flowid 1:1
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 4569 0xffff flowid 1:1
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip tos 0x10 0xff flowid 1:2

技術的には、最後の行は必要ありませんが、残しておいても問題ありません。

これで完了です!すべてのVoIPパケットが最初にデキューされます。重いダウンロードやアップロード中でも、電話の通話のインタラクティビティを失うことはありません。

統計を確認するには、次のコマンドを実行します:

tc -s qdisc ls dev eth1

キューを削除して通常の状態に戻すには、次のコマンドを実行します:

tc qdisc del dev eth1 root

これで、起動時に適切なコマンドを自動的に実行するのはあなた次第です。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。