8
27
2018
UPnP/OpenHome Music Server の自作(その7)
APU2C4をルータとして機能させる(応用編:NAPT IPマスカレード)
今回は、前回のNATルーティングに引き続き、NAPT(IPマスカレード)機能を使ったオーディオ専用ネットワークを構築してみることにする.

APU2C4の3番目のポートを使ってNAPTによる準オーディオ専用ネットワークを作ってみる
今回のNAPTルーティングの実験では、3番目のポート(“eth2”) とLAN側ポート(“eth0”)との間でNAPT変換を行うことにする.前回のNATルーティングが1対1の双方向変換であったのに対し、今回のNAPTルータではLAN側からはオーディオ専用のネットワークに置かれた機器類にはアクセスできないことが異なっている.
何もわざわざ自分でLinuxを使った面倒なルータを作らなくても、NAPT機能のある家庭用のブロードバンドルータを2台用意しそれらをタンデムに繋げばそれなりの効果はあるのだが、LAN側からもう一段内側のオーディオ用のネットワークにアクセスする事が困難なため、使い勝手がとても悪いのだ.
家庭用のブロードバンドルータのNAPT機能は一つのグローバルIPアドレスを効果的に利用する事が主目的のため、一般的なWEBやメールなどの用途には向いているのだが、NFSやSMB/CIFSなどのファイルサービスとはとても相性が悪く、これらのサービスを利用するにはファイルサーバや途中に介在するネットワーク機器などを正しく設定する必要があるため、一般的な家庭用のブロードバンドルータではWAN側(外側)とLAN側(内側)との間でファイルサービスを利用するにはそれなりのスキルが要求される.
勿論、ファイルサービスを提供するNASや”Kazoo”や”fidata”などのコントローラアプリをオーディオ用ネットワークの配下に置けば面倒な設定を行うことなく使い勝手は改善されるのだが、今度はこれらの機器が発する余計なトラフィックがオーディオネットワークを汚染してしまうので、音質向上という意味ではマイナスに働いてしまう.
という訳で、今回はNAPTの弱点をカバーするような形でAPU2C4にNAPT機能を搭載してみることにする.
さて、NAPT機能の利用で問題となるファイルサービスへのアクセスと各種コントローラアプリの置き場所だが、ファイルサービスに関しては、APU2C4自体にNFSファイルサービスを実装しているので、今回はNAPTの内側のネットワークからでも直接アクセス可能だ.但し、LAN側に置かれたNAS装置(上記の図では Synology NAS)へはアクセスできないことに留意して欲しい.また、各種コントローラアプリはLAN側に置いたままの状態で使うことにする.
NAPT機能の実装
APU2C4の3番目のポートにNAPT機能を実装するのは、前回のNAT機能の実装と同じようにファイアウォール機能を使う.前回のNAT機能の実装では、3つのポートを全て 標準で備わっている”trusted” というゾーンに割り当てたので、ファイアウォールとしては完全なスルー(全パケットを許可する)状態であった.今回はLAN側からNAPTの内側へmpdなどの特定の通信を許可(ポートフォワード)させるために、LAN側(”eth0″)を別なゾーンに割り当てることにする.
LAN側(”eth0″)に割り当てるゾーン名をとりあえず “lan_trusted” とするが名前は何でも良い.このゾーンの振る舞いは”trusted” と全く同じ扱いとする.標準のゾーンに関する定義ファイルは、”/usr/lib/firewalld/zones” 配下に ”ゾーン名.xml”という名前で定義ファイルが置かれている.自分専用のゾーン定義を作成するには、”/etc/firewalld/zones” 配下に定義ファイルを置けば良い.
今回は 標準の”trusted” の定義ファイル “/usr/lib/firewalld/zones/trusted.xml” の内容を単純にコピーして名前だけを付け替えて “/etc/firewalld/zones/lan_trusted.xml” を作成する.同様にNAT用のネットワークゾーンを”nat_trusted”、NAPT用のゾーンを “napt_trusted” としておく.
3つのポートが所属するゾーン名を変更したところで、NAPTに関するファイアウォールのルールを追加する.前回のNATはファイアウォールのダイレクトルールという設定方法を使って実装しているが、今回のNAPTではゾーンに対してNAPTのルールとポートフォワーディングルールを適用することにする.
前回と同様、これらのコマンドや設定の細かい内容については気にすること無く、単純なおまじないとして実行して欲しい.この状態で、”eth2″ のネットワーク内の機器から外部の家庭内LAN(“eth0″側)や更に外側(インターネット)のネットワークへ通信可能となっている筈だ.勿論、この状態では “eth2” のネットワークから外部方向への一方的な通信(outbound: 発信接続)しか許されていないので、家庭内LAN(“eth0″側)からは”eth2” のネットワークは一切アクセスできない状態だ.

Test PCのIPアドレスを192.168.20.101/24 に設定してNAPT機能をテスト

LAN側に置かれた”smokeping”サーバや外部のインターネットサイトへも問題無く接続できている

勿論、APU2C4上のNFSボリュームも直接アクセス可能だ
LAN側からのアクセス経路の設定(ポートフォワーディング:静的NAPT)
NAPT機能が上手く実装できたところで、LAN側からNAPTの内側のネットワーク内の機器へアクセスするために、ファイアウォールに穴を開ける(通信を許可させる)設定を実施することにしよう.今回はNAT/NAPTで行ったダイレクトルールを設定するのではなく、もう少し簡単なゾーン間にポートフォワーディング転送ルールを追加する方法を採用することにする.
オーディオネットワークプレイヤーが使用しているプロトコルに応じたポートフォワーディング設定(mpdの場合、TCP/6600)を行えば良い.今回は例として、テストPC上のWEBサーバ(TCP/80)に対するポートフォワーディング設定を行ってみることにする.
先に、LAN側(“eth0”) のゾーンを “lan_trusted” に変更したのは、LAN側のゾーンだけにポートフォワーディング設定を適用させたかったためで、3つのポートが同じ”trusted”というゾーン設定では内側のオーディオネットワークに対しても適用されてしまうことになり、おかしな事になってしまうためだ.
LAN側(“eth0”)のゾーンに対して、テストPC(192.168.20.101)宛のWEBアクセス要求HTTP(TCP/80)が届いたら、それをオーディオ用のネットワーク側(“eth2″)にそのまま転送する設定(ポートフォワーディング)を施す.このためのファイアウォールコマンドは、”# firewall-cmd –zone=ext-trusted –permanent –add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.20.101” のようになるだろう.
【注記】ゾーン “lan_trusted” に対して80番ポートをポートフォワードでNAPT用ネットワークの192.168.20.101 へ転送する設定を行うと、NAT用のネットワーク配下に置いたVolumio2に対して、LAN側からWEBコンソルを接続する場合に問題が発生する.これは、Volumio2のWEBコンソールがAJAXを多用しているため、LAN側のWEBブラウザとVolumio2との間で、NAT中継IP(192.168.100.51)を介さずに直接Volumio2(192.168.10.101)と tcp:80 でセッションを張ってしまう.ポートフォワード設定で tcp:80 を192.168.20.101 へ転送する設定を行っているので、Volumio2(192.168.10.101)へはAJAXセッションが張れないので、AJAXがタイムアウトエラーとなってWEBコンソール画面がいつまで経っても ”ぐるぐる” 状態のままになってしまう.
これを避ける方法としては、NAT側のVolumio2(192.168.10.101)に対するポートフォワーディング設定を追加しておけば良いだろう.

Test PC上のWEBサーバにLAN側のiMacからアクセスしてみる
(この場合のIPアドレスは、”eth0″ に付けられた実IPアドレス)
今回は、ポートフォワーディングの設定方法についてだけ説明したが、実際にVolumioなどのmpdオーディオプレイヤーを繋ぐ場合の設定は別途説明する予定だ.今回は、ポートフォワーディングで設定を行ってみたが、前回のNAT設定が理解できていれば、ポートフォワーディングではなくてNATで設定しても全く問題無いことがお解りだろうか.前回のNATのIPとは別のIP(例えば192.168.100.52)を設定して、宛先を 192.168.20.xxx とすれば良い.
DHCPサーバ、DNSプロキシ機能の実装
さて、NAPTとポートフォワーディング機能を実装できたところで、DHCPサーバ、DNSプロキシ機能を追加実装してみることにしよう.勿論、ポートフォワーディングを行うには、オーディオプレイヤー側はIPアドレス固定でなければ難しい(浮動IPアドレスに対応させるにはかなり高度なテクニックが必要)のだが、配下にネットワークスイッチを置き、無線LANのアクセスポイントや外付けNASなどを置いて、簡易オーディオ専用ネットワークとして利用する想定だ.勿論、音質的には好ましくはないのだが、それよりも使い勝手の向上を目指すという方向性だ.

今回のNAPT機能によるオーディオネットワークの利用イメージ
普通の家庭用ブロードバンドルータには、DHCPサーバ、DNSプロキシ機能が実装されているので、ユーザはIPアドレスの設定やDNSの設定などを意識すること無く簡単に使えるのだが、今回はできるだけ簡単にこれらの機能を実装してみることにする.Linux OS なのでDHCPサーバとDNSサーバを個別に実装すれば良いだけの話なのだが、今回はこれらの機能を一体化した “dnsmasq” という簡易型のDNSフォワーダ&DHCPサーバソフトウェアアプリケーションが有るので、それを使ってこれらの機能を実装してみることにする.
“dnsmasq”の実装は簡単で、”yum -y install dnsmasq” でインストールするだけだ.後は、”/etc/hosts” に関連するホスト名とIPアドレスの組みあわせを追記し、”dnsmasq”の設定ファイル “/etc/dnsmasq.conf” に必要な設定を書き込むだけだ.但し、”/etc/dnsmasq.conf”の中身が膨大(約1000行)で雑然としていて、必要な設定項目を探し出すのが大変だ.
今回、”/etc/dnsmasq.conf”に設定した項目として、
no-dhcp-interface=eth0 (115行目あたり)
domain=openhome.home.yoko,192.168.20.0/24 (144行目あたり)
dhcp-range=192.168.20.101,192.168.20.150,255.255.255.0,12h (157行目あたり)
dhcp-option=option:router,192.168.20.254 (339行目あたり)
dhcp-option=option:netmask,255.255.255.0 (追加)
dhcp-option=option:ntp-server,133.243.238.243,133.243.238.163 (343行目あたり)
を設定している.”no-dhcp-interface” はDHCPサーバ機能を除外するインタフェース指定で、LAN側(“eth0”)を除外している.これは、既にブロードバンドルータ側でDHCPサーバ機能が働いているので、DHCPサービスの対象から除外している.原則として、DHCPサーバは同じLANセグメント内に1つしか置いてはいけないからだ.除外しておかないと、LAN側の機器が混乱してネットワークが大混乱となる可能性が高い.これらのパラメータを自分のネットワークに合わせて適宜変更すれば良いだろう.
“dnsmasq”が便利なのは、ホスト側(APU2C4のCentOS7)の”/etc/resolv.conf”情報を参照して、上位側(フォワーダー)にDNSクエリーを送ってくれる機能(DNSプロキシ)を簡単に実装してくれる.今回は、LAN側(“eth0”)のDHCPによる設定で得られた上位(ブロードバンドルータ)に設定されているDNSサーバ情報が、そのまま”dnsmasq”のDNSフォワーダに引き継がれることになる.この場合のオーディオネットワーク配下に置かれたDHCPクライアントには、”eth2″のIPアドレスがそのままDNSサーバとして利用することになる.勿論、DNS情報はクライアント側がDHCPでネットワークを設定するようになっていれば、自動で設定してくれるので、ユーザは何も意識する必要はない.
前回のNATと今回のNAPTによるオーディオ専用ルータの作成について要点が理解できたであろうか.Linux OS のファイアウォール機能を駆使しなければならないので、多少Linuxを弄った程度の知識では、太刀打ちできなかったと思う.この辺は日頃Linuxを扱っている専門のITエンジニアでも困難を極める箇所なので、内容がわからなくてもあまり気にする必要はない.今回の内容をきちんと理解できる人は専門のITエンジニアだけかもしれない....
次回は、音質的な面では有利なmpdを、UPnP/OpenHomeインタフェースを使って市販のオーディオネットワークプレイヤー的な使い方ができるようにする仕組みを、今回のオーディオ用ルータに導入する方法を紹介することにする.これにより、”Kazoo”や”ifidata”などのポピュラーなネットワークオーディオコントローラを通じてmpdプレイヤーを操作することが可能となり、使い勝手が向上する.
実験君(NAT編)
先ずは、家庭内LAN上のiMacからNATルータ配下のネットワーク上に置かれたMPDプレイヤー(lightMPD)に対してきちんとアクセスできるかどうか確かめてみよう.lightMPDの設定を今回のNAT変換の仕様に合わせて、IPアドレスを 192.168.10.101(255.255.255.0)に設定する.gatewayは 192.168.10.254、DNSサーバはLAN側に置かれたDNSサーバ 192.168.100.11 としている.”lightmpd.conf” の内容を下記に示す.

iMac上のMPDクライアント(Cantata)で問題無くアクセスできる事を確認
この場合の、MPDクライアント(Cantata)の設定は簡単で、MPDクライアントの接続先を単にLAN側のNAT変換用アドレスに設定すれば良い.勿論使い勝手は、MPDプレイヤーがLAN側に置かれている場合と違いはない.ついでに、世間ではポピューラーなMPDクライアントである、”Volumio2″ でも試してみよう.

Volumio2のWEBインタフェースも同じIP(192.168.100.51)でアクセス可能だ

ルーティング情報が設定されていればクライアントの実IP(192.168.10.101)でもアクセス可能だ
今回のNATによるアクセスでは、LAN側に作成した玄関ポートのIPアドレス(192.168.100.51)にアクセスしたが、IPルータとしても機能しているので、MPDクライアント側の実IPアドレス(192.168.10.101)にアクセスしても繋ぐことは可能だ.但し、MPDクライアント側のネットワーク(192.168.10.0/24)に対するルーティングテーブルが上位のルータ(ブロードバンドルータ)やiMacなどのLAN側の機器に正しく設定されていればの話である.今回は、APU2C4のLAN側(”eth0″)インタフェースを固定IPアドレスではなく、DHCPによる自動設定にしてあるので、上位側のルータにMPDクライアント側のネットワーク(192.168.10.0/24)に対する宛先(Gateway)アドレスを設定するのは現実的ではない.
LAN側に作成した玄関ポート(192.168.100.51)はAPU2C4のLAN側(”eth0″)インタフェースのIPアドレスに依存しないので、常に固定されている玄関ポートのIPアドレスにアクセスすれば良い.
実験君(NAPT編)
NATの場合と同じように “Volumio2” で実験環境を作るが、”Volumio2″のIPアドレスを 192.168.20.101 に設定しておく.NAPTポート(“eth2”)の先に家庭用のL2SWを接続し、そこから “Volumio2” とテスト用のPC(DHCPで設定)を繋いでいる.

NAPT環境でのMPDテスト用にL2SWを繋いで実験

Cantataの設定では、LAN側(“eth0”)のポートのIPアドレスを指定する

Volumio2のWEBコンソールアクセスも問題無いように思えたが...

LAN側のiMacからVolumio2のWEBコンソールへのアクセスに問題発生
LAN側のiMacからVolumio2のWEBコンソールへのアクセスに問題が発生した原因であるが、WEBブラウザのDeveloperツールで、エラーとなっている箇所を探した結果、AJAXの処理部分(XHR)が機能していないことが確認された.AJAX通信が行われていないのだ.この原因は簡単で、LAN側のiMacのWEBブラウザ上で実行される AJAX Javaスクリプトが、Volumio2サーバとAJAXで通信を行う必要があるが、その宛先IPアドレスがVolumio2サーバの実アドレス(192.168.20.101)となっている為である.iMac側がVolumio2のネットワーク(192.168.20.0/24)に関するルーティング情報を持っていないため、デフォルートルートに向けられたが、上位のルータ(NEC IX2215)にもVolumio2のネットワーク(192.168.20.0/24)に関するルーティング情報が登録されていなかったからだ.
これを解決する一番簡単な方法は、上位のルータ(NEC IX2215)にVolumio2のネットワーク(192.168.20.0/24)に関する宛先を登録すれば良い.

今度は無事iMacのWEBブラウザからVolumio2のWEBコンソールへアクセスできた