ヤマハルーターのconfigを見直したところ、通信速度が速くなりました。
自宅でブロードバンドルーターとしてヤマハのFWX120を使っています。2017年10月に発売されたRTX830に乗り換えるべく、導入前の準備作業として、configを見直しました。理由としては、
・フィルター定義がごちゃごちゃして見づらく、RTX830乗り換えにあたってconfigをすっきりさせたい。
・RTX830未対応の入力遮断フィルターをIPパケットフィルターに置き換えたい。
といったものでしたが、config見直し後、思いがけず通信速度が速くなりました。なおインターネット回線はIIJmioひかり(IPoEオプション契約あり)で、IPv4(PPPoE)、IPv4(DS-Lite)、IPv6(IPoE)の3種類が使えるようになっています。
IPv4(PPPoE)については深夜早朝など回線の空いている時間帯で速くても600Mbps程度だったのが700Mbps超の速度が出るようになり、IPv4(DS-Lite)については270Mbps台止まりだったのが300Mbps超の速度が出るようになりました。すなわち、IPv4(PPPoE)にしてもIPv4(DS-Lite)にしても、通信速度が10%以上速くなったことになります。
config見直しに伴って通信速度が速くなった本当の理由はわからないものの、ルーターも内部構造はコンピューターそのものであり、コンピューターの処理速度向上のためのソフトウェア(プログラム)最適化の考えはルータにも準用でき、「おそらくこの修正が通信速度高速化に寄与したのでは?」と推測することはできるので、その推測をまじえつつ修正内容をまとめたいと思います。ルーターconfigの最適化の一助にしてもらえれば幸いです。(ルーターconfigの最適化というとコンピューター用語っぽい言い方なので、ヤマハですし、クルマやバイクになぞらえて(エンジンのROMチューンならぬ)「ヤマハルーターのconfigチューン」と言ってもいいかもしれません。)
(1)IPパケットフィルターを見直す
1.1 フィルターを使いまわす
1.2 フィルター番号の付け方を工夫する
1.3 複数のIPアドレス、プロトコルやポート番号をまとめて指定する
1.4 WAN側のフィルターは単純化できるかも
1.5 不要なフィルターは削除する
1.6 TCP・UDPに関係なくまとめる
1.7 複数のIPアドレス、複数のポート番号をまとめる
(2)設定値の最適化
2.1 MTU
(3)RTX830での実測例
(1)IPパケットフィルターを見直す
見直し前のIPパケットフィルターの件数です。
(IPv4 IPパケットフィルター(静的・動的) 54件)
ip filter 12件
ip filter dynamic 6件
ip inbound filter 36件
(IPv6 IPパケットフィルター(静的・動的) 13件)
ipv6 filter 6件
ipv6 filter dynamic 7件
見直しによって、IPパケットフィルターの件数は以下のようになりました。
(IPv4 IPパケットフィルター(静的・動的) 23件)
ip filter 16件
ip filter dynamic 7件
ip inbound filter 0件
(IPv6 IPパケットフィルター(静的・動的) 13件)
ipv6 filter 6件
ipv6 filter dynamic 7件
入力遮断フィルタ(ip inbound filter)はRTX830では対応していないので削除して、すべてIPパケットフィルター(ip filter/ip filter dynamic)に置き換え、IPv4用のIPパケットフィルターは半分以下の23件になりました。見直し項目の大半がこのパケットフィルタの見直しだったので、パケットフィルタの見直しで通信速度が速くなったことになります。
一度IPパケットフィルターで処理されたフローのパケットはファストパスを使って高速に動作するものの、フローの最初のパケットはノーマルパスでフィルターを実際に走査して処理されるわけであり、走査するフィルターの多寡は当然処理速度に影響するものと推測されます。ファストパス内部で使われるフローテーブルのサイズは有限ですし、かつフローテーブルはIDS他さまざまな処理でも使われているので、ルーターが多数のパケットを処理していくうちにフローテーブルがいっぱいになってしまって他のフローで上書きされてしまい、ファストパスで処理されていたフローのパケットが再びノーマルパスでIPパケットフィルターを走査するところからやり直し、という状況も珍しくないのではと考えられます。
これらの理由から、IPパケットフィルターを最適化して減らした方が、フィルターを実際に走査して処理する際の処理速度向上につながるものと考えられます。それだけではありません。ルーター、すなわちコンピューターのCPUはキャッシュ機能が働いているため、広範囲にメモリアクセスするよりも、局所的な範囲をひたすらメモリアクセスする方が、より高速にメモリアクセスしやすい、という特徴があります。IPパケットフィルターを最適化して減らすことでIPパケットフィルターのルーチンが小さくなれば、このCPUのキャッシュ機能がより働きやすくなり、結果として処理速度の向上につながるものと推測されます。
IPパケットフィルターをどのようにして見直していったのかを説明する前に、IPパケットフィルターがどこで働くのかをおさらいしましょう。
この図は、ヤマハRTシリーズのFAQ「IPパケット・フィルタリング機能がどこで働くかわからない。」の図表を基に、IPv4(PPPoE)+IPv4(DS-Lite)+IPv6(IPoE)環境用に再構成したものです。
IPv4(PPPoE)の場合のパケットフィルタリングが働く場所はNATの内側となります。またIPv4(DS-Lite)の場合のパケットフィルタリングが働く場所は、カプセル化が解除された(もしくはカプセル化される直前の)IPv4パケットとなります。
configの修正に先立ち、まずはLAN1、LAN2、PP#1、TUNNEL#1、LAN1/1など各インターフェースのIN側とOUT側に必要なフィルタをリストアップします。リストアップしたものを見ながら、configを修正していきます。
1.1 フィルターを使いまわす
同じフィルターが複数のインターフェースで使われることがあります。例えば、
ip filter 100 reject * * * * *
ip filter 101 pass * * * * *
のように、「すべて遮断する」「すべて通す」といったフィルターは、頻繁に使われます。複数のインターフェースで使われるフィルターは、ひとつだけ定義して、使い回しましょう。どういうことなのかを説明します。
ip filter 100 reject * * * * *
ip filter 200 reject * * * * *
ip pp secure filter in 100
ip lan2 secure filter in 200
上記例のようにインターフェース毎に同じ処理内容のフィルターを定義していたとします。同じ処理内容のフィルターはひとつだけ定義することとして、
ip filter 100 reject * * * * *
ip pp secure filter in 100
ip lan2 secure filter in 100
のように複数のインターフェースで使い回せば、フィルターを減らすことができます。
1.2 フィルター番号の付け方を工夫する
例えば、ip filterは100番台、ip filter dynamicは200番台、ipv6 filterは300番台、ipv6 filter dynamicは400番台、といったように分けると、configが読みやすくなります。さらに言うならば、前述のよく使われる「すべて遮断する」「すべて通す」フィルターは、
ip filter 100 pass (通すパケットの詳細)
ip filter 101 pass (通すパケットの詳細)
ip filter 102 pass (通すパケットの詳細)
ip filter 103 reject (遮断するパケットの詳細)
ip filter 104 reject (遮断するパケットの詳細)
ip filter 105 reject (遮断するパケットの詳細)
ip filter 198 reject * * * * * (すべて遮断する)
ip filter 199 pass * * * * * (すべて通す)
ip lan2 secure filter in 100 101 102 198
ip lan1 secure filter in 103 104 105 199
のように、各番台の最後に配置した方が、フィルターを追加・削除した際に、番号を変更せずに済みますし、ip interface secure filterコマンドでフィルターを適用する際のフィルター番号の並びがきれいになり、configが読みやすくなります。
1.3 複数のIPアドレス、プロトコルやポート番号をまとめて指定する
NetBIOS関連の通信を遮断するために使われるフィルターとして、
ip filter 100 reject * * tcp * 135
ip filter 101 reject * * tcp * netbios_ns-netbios_ssn
ip filter 102 reject * * tcp * 445
ip filter 103 reject * * udp * 135
ip filter 104 reject * * udp * netbios_ns-netbios_ssn
ip filter 105 reject * * udp * 445
ip filter 106 reject * * tcp 135 *
ip filter 107 reject * * tcp netbios_ns-netbios_ssn *
ip filter 108 reject * * tcp 445 *
ip filter 109 reject * * udp 135 *
ip filter 110 reject * * udp netbios_ns-netbios_ssn *
ip filter 111 reject * * udp 445 *
といったフィルターがありますが、このフィルターは
ip filter 100 reject * * tcp,udp * 135,netbios_ns-netbios_ssn,445
ip filter 101 reject * * tcp,udp 135,netbios_ns-netbios_ssn,445 *
とまとめて書くことができます。また宛先がプライベートIPアドレスのパケットをフィルタリングするために
ip filter 100 reject * 10.0.0.0/8 * * *
ip filter 101 reject * 172.16.0.0/12 * * *
ip filter 102 reject * 192.168.0.0/16 * * *
といったフィルターを使うことがありますが、このフィルターも
ip filter 100 reject * 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 * * *
とまとめて書くことができます。まとめて書くことで、フィルタ定義の行数が少なくなってconfigが読みやすくなります。通信速度にはたぶん影響しないです、
1.4 WAN側のフィルターは単純化できるかも
ヤマハルーターをブロードバンドルーターとしてしか使っておらず、パソコンやタブレット、スマホでネットが使えればよく、リモートアクセスやゲーム、自宅サーバーのためのポート開放などが不要であれば、WAN側インターフェースのIPv4用フィルター設定は単純化できます。
ip filter 100 reject 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 * * * *
ip filter 101 pass * * icmp 3,11 *
ip filter 198 reject * * * * *
ip filter 199 pass * * * * *
ip filter dynamic 200 * * domain
ip filter dynamic 201 * * www
ip filter dynamic 202 * * ftp
ip filter dynamic 203 * * smtp
ip filter dynamic 204 * * pop3
ip filter dynamic 205 * * tcp
ip filter dynamic 206 * * udp
ip pp secure filter in 100 101 198
ip pp secure filter out 199 dynamic 200 201 202 203 204 205 206
ip pp intrusion detection in on reject=on
ip filter source-route on
ip filter directed-broadcast on
外から入ってくるパケットは一部のICMPを除いてすべて遮断、外へ出ていくパケットはすべて通過、その戻りパケットも通過、IDSは効かせる、との設定で事足りるはずです。(ip filter 100のフィルタは、IPアドレス・スプーフィング攻撃(ip spoofing)対策のフィルタです。ICMPについては、Path MTU Discoveryブラックホール等に起因する通信不能に陥らないよう、Type 3″Destination Unreachable”とType 11″Time Exceeded”の2種類を通します。)
1.5 不要なフィルターは削除する
おそらくですが、フィルターは定義しているだけでルーター内のメインメモリ(主記憶)上に展開されるはずであり、使わないフィルターを定義しておくのはメモリ・CPUリソースの浪費につながる可能性があります。使っていないフィルター定義は、思い切って削除しましょう。
1.6 TCP・UDPに関係なくまとめる
以下のようなフィルターがあったとします。
ip filter 100 reject * * tcp,udp * 135,netbios_ns-netbios_ssn,445
ip filter 101 reject * * tcp,udp 135,netbios_ns-netbios_ssn,445 *
ip filter 102 reject * * udp * 1900
ip filter 103 reject * * udp 1900 *
ip filter 100と101はNetBIOS関連の通信の遮断、ip filter 102と103はUPnPもしくはSSDP関連の通信の遮断のためのフィルターで、ip filter 100と101はTCPとUDPがフィルタリングの対象なのに対し、ip filter 102と103はUDPのみがフィルタリングの対象です。
でもよくよく考えてみると、ip filter102と103で遮断しているポート番号1900番はIANA登録済みのポート番号であり、エフェメラルポート(IP通信を行うためにTCP/IPプロトコルスタックが動的に割り当てるポート)のポート番号として使われることはないので(※)、登録されたソフトウエア(UPnPもしくはSSDP)を使用したりカスタム設定でTCPの1900番を使用していない限り、TCPの1900番は使われないわけであり、TCPの1900番も遮断して問題ないはずです。となると、上記フィルターは、古いWindowsを使っていない限り(※)、以下のようにまとめられる可能性があります。
ip filter 100 reject * * tcp,udp * 135,netbios_ns-netbios_ssn,445,1900
ip filter 101 reject * * tcp,udp 135,netbios_ns-netbios_ssn,445,1900 *
フィルタの対象ポートがウェルノウンポート(0-1023)もしくはIANA登録済みポート(1024-49151)であれば、TCP・UDPに関係なくフィルタをまとめられないか、検討してみましょう。
※:Windows XPとWindows Server 2003まではエフェメラルポートとしてデフォルトで1025番から5000番までを使用していたので、Windows XPもしくはWindows Server 2003までが稼働している環境下で「ウェルノウンポートもしくはIANA登録済みポートのポート番号に登録されたソフトウェアを使用していないから」と1025番から5000番までのポート番号をよく考えないでフィルタリングすると、通信不能等のトラブルの原因になります。Windows Vista/7およびWindows Server 2008以降はIANAの勧告通り、エフェメラルポートはデフォルトで49152番から65535番までを使用しています。
1.7 複数のIPアドレス、複数のポート番号をまとめる
ルーターのLAN側にサーバーを設置し、ルーターでポート開放の上、WAN側からLAN内のサーバーにアクセスできるようにする場合等に、以下のようなフィルタ設定が使われることがあります。(ヤマハのルーターを使っている人は自宅サーバーの設置率が高そうな気がします。)
ip filter 100 pass * 192.168.0.1 udp * 100,200
ip filter 101 pass * 192.168.0.2 udp * 300,400
ip filter 102 pass * 192.168.0.3 udp * 500,600
ip filter 103 pass 192.168.0.1 * udp 100,200 *
ip filter 104 pass 192.168.0.2 * udp 300,400 *
ip filter 105 pass 192.168.0.3 * udp 500,600 *
nat descriptor masquerade static 100 1 192.168.0.1 udp 100
nat descriptor masquerade static 100 2 192.168.0.1 udp 200
nat descriptor masquerade static 100 3 192.168.0.2 udp 300
nat descriptor masquerade static 100 4 192.168.0.2 udp 400
nat descriptor masquerade static 100 5 192.168.0.3 udp 500
nat descriptor masquerade static 100 6 192.168.0.4 udp 600
LAN内にサーバーを3台設置して各々のサーバーにWAN側からアクセスできるようにする場合を想定したものですが、前述通り、100番・200番・300番・400番・500番・600番はエフェメラルポートのポート番号として使われることはないので、以下のようにまとめられる可能性があります。
ip filter 100 pass * 192.168.0.1-192.168.0.3 udp * 100,200,300,400,500,600
ip filter 101 pass 192.168.0.1-192.168.0.3 * udp 100,200,300,400,500,600 *
nat descriptor masquerade static 100 1 192.168.0.1 udp 100
nat descriptor masquerade static 100 2 192.168.0.1 udp 200
nat descriptor masquerade static 100 3 192.168.0.2 udp 300
nat descriptor masquerade static 100 4 192.168.0.2 udp 400
nat descriptor masquerade static 100 5 192.168.0.3 udp 500
nat descriptor masquerade static 100 6 192.168.0.4 udp 600
もっと細かく言うと、元のフィルタの対象になっていなかった以下のIPアドレスとポート番号の組み合わせもフィルタの対象とし、通す設定にしてしまっても、実際にはそうしたパケット自体が発生しないはずです。WAN側のUDPの100番と200番宛に来たパケットは192.168.0.1宛のみに転送されて192.168.0.2宛もしくは192.168.0.3宛に転送されることはなく、300番・400番・500番・600番も同様です。100番・200番・300番・400番・500番・600番はエフェメラルポートのポート番号としては使われないので、以下のIPアドレス・ポート番号の組み合わせ発の通信(ソースアドレスとソースポート番号が以下の組み合わせになるような通信)も発生しません。
192.168.0.1 udp/300
192.168.0.1 udp/400
192.168.0.1 udp/500
192.168.0.1 udp/600
192.168.0.2 udp/100
192.168.0.2 udp/200
192.168.0.2 udp/500
192.168.0.2 udp/600
192.168.0.3 udp/100
192.168.0.3 udp/200
192.168.0.3 udp/300
192.168.0.3 udp/400
(2)設定値の最適化
2.1 MTU
MTUの設定は通信速度に大きく影響するので、忘れずに設定しましょう。MTUの推奨値は、IPv6(IPoE)は1500、IPv4(DS-Lite over IPoE)は1460、IPv4(PPPoE)は1454、となります。
ipv6 lan2 mtu 1500
ip tunnel mtu 1460
ip pp mtu 1454
参考までに、MTU値の根拠も書いておきます。東日本電信電話株式会社 『IP通信網サービスのインタフェース 第三分冊(第39版)』に以下の記述があります。(最新版の資料の探索はこちらから。)
【フレッツ光クロス編】2.4.1.1.5 最大転送単位(MTU):IP通信網におけるIPv6(IPoE)通信のMTUの値は1500byteです。
【フレッツ光ネクスト編】2.4.1.2 最大転送単位(MTU):フレッツ光ネクストではIP通信網におけるIPv4通信のMTU値は1454byteです。
【フレッツ光ネクスト編】2.4.2.1.5 最大転送単位(MTU):IP通信網におけるIPv6(IPoE)通信のMTUの値は1500byteです。
IPv4(DS-Lite over IPoE)でのMTU値については、IPv6(IPoE)でのMTU値(1500byte)からIPv6ヘッダーのサイズ(40byte)を引いた値(1500-40=1460byte)となります。
Path MTU Discoveryを使って、適切なMTUサイズを調査・確認する方法も併せて紹介します。
$ traceroute -F -N 1 --mtu www.iij.ad.jp
traceroute to www.iij.ad.jp (202.232.2.164), 30hops max, 65000 byte packets
1 _gateway (192.168.XXX.XXX) 0.203ms F=1500 0.213ms 0.189ms
2 ike-gwXX.transix.jp(XXX.XXX.XXX.XXX) 5.024ms F=1460 4.744ms 4.951ms
...
IPv4通信がDS-Lite経由になっている環境下で、「ip tunnel mtu 1460」と設定した上でLinux(Ubuntu)上でtracerouteコマンドを上記のように実行しました。(一部伏字にしています。) _gateway(ヤマハRTX830)まではEthernetなのでF=1500、すなわち1500byteと表示され、DS-LiteのAFTR(ike-gwXX.transix.jp)まではF=1460、すなわち1460byteと表示されました。「ip tunnel mtu 1461」と設定して再度tracerouteコマンドを実行すると、途中で止まって(進まず)うまく動作しなかったので、1460byteが適正値(設定できる最大値)と考えてよいと思われます。なお「no ip tunnel mtu」とMTU設定を削除した上で再度コマンドを実行したところ、F=1280、すなわち1280byteと表示されました。1280byteはIPv6通信での最小のMTUサイズであり規格通りの値であるものの、このままだと高速化の恩恵にあずかることができません。なお、Path MTU DiscoveryはICMP(type 3,code 4)を使って応答が返ってくるので、ルーターでICMPのパケットを遮断していると、うまく動作しません。
(3)RTX830での実測例
家庭用Wi-Fiルーターでは、NECの「IPv6 High Speed」、アイ・オー・データ機器の「IPv6ブースト」のように、IPv6 IPoE、IPv4 over IPv6(DS-Lite、MAP-E)での通信速度の高速化を売りにした製品が発売されており、これらに触発されて、本ページに記載の内容に従ってルーターconfigの見直しをあらためて行った上で、スピードテストを行いました。(再見直し時の修正事項は、本ページに追記しています。)
毛流麦花の環境では、RTX830で下り848Mbpsが限界でした。セキュリティ確保のために必要なパケットフィルタリングやIDS等はすべて設定の上で、この速度が出ています。常用できる設定で高速化するところに、ルーターconfig最適化の醍醐味があるので。なおコンスタントに下り800Mbps台を出せているわけではなく、下り848Mbpsは最大瞬間風速的な値です。
後日再度測定したら、下り856Mbpsが出たので、この画面も以下に載せておきます。最大瞬間風速的な値であり、848Mbpsでも856Mbpsでも大差はないものの、「RTX830で下り856Mbpsをマークした」はインパクト大なので。
1Gbpsの回線かつ1GbpsのEthernet対応のルーターなので、856Mbpsは限界に近いように思います。DS-LiteというかIPv4 over IPv6では、IPv4とIPv6の両方でルーティングが行われるので、ルーターにはかなり負荷がかかるはずであり、それを考慮すると856Mbpsはかなりの数値、というかRTX830の処理能力はかなりのものと思います。RTX830は、NECの「IPv6 High Speed」搭載機種、アイ・オー・データ機器の「IPv6ブースト」搭載機種に十分対抗できます。願わくは、WAN/LAN共に10Gbpsに対応し、10Gbps回線で十分なスループットを発揮できる新製品の発売に期待したいところです。フレッツ光クロスやauひかりのように、10Gbps対応のひかり回線が出てきているので。