CentOS8で作ったRoonサーバのファイアウォール設定
えーと、先日書いた記事の改訂版です。
なぜ改訂せねばならなかったかというと、先日うちのマンションで全館停電がありまして。Roonサーバ(自作)に使っていたマシンはあらかじめダウンさせておいたのですが、再起動させたところ、Roon RemoteであるSONOS ONE SLがRoonサーバから見えなくなる、という事態になってしまったのです。
あいかわらずfirewalldを止めると繋がるようになるので、やはりこれはファイアウォールの設定が良くないのだろう、と。
というわけで、今週末を使っていろいろ調べた結果をまとめておきます。
最低限必要な設定
先日の調査で、どうやら
- 9100-9200/tcp
- 9003/udp
この2つについては間違いなく開けないといけないようでした。
それに加えて、
- IGMPプロトコルを許可
- マルチキャストを受け取るために、以下を許可
- 224.0.0.0/4からの入力
- 240.0.0.0/5からの入力
これらについてもまず間違いなく必要なようです。あと、一説によればダイレクトルールでマルチキャストとブロードキャストを許可しないといけないとのことなので、それも追加します。
ここまでをコマンドでまとめると、以下のようになります。
$ sudo firewall-cmd --permanent --add-port=9003/udp
$ sudo firewall-cmd --permanent --add-port=9100-9200/tcp
$ sudo firewall-cmd --permanent --add-port=9003/udp
$ sudo firewall-cmd --permanent --add-protocol=igmp
$ sudo firewall-cmd --permanent --add-source=224.0.0.0/4
$ sudo firewall-cmd --permanent --add-source=240.0.0.0/5
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m pkttype --pkt-type multicast -j ACCEPT
$ sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m pkttype --pkt-type broadcast -j ACCEPT
AirPlay用の設定
で、ここからが問題。
今の我が家の環境だと、SONOS ONE SLはSONOSデバイスとしてではなく、AirPlayデバイスとして使わざるを得ないのです(どうやら、Roonサーバが接続されているスイッチングハブとSONOS製品の相性が悪いらしいです……)。そういうわけで、AirPlayを通すための設定を施すことになります。
Appleの公式ドキュメントを見たところ、以下のポートがまず必要らしいです。
- 1900/udp
- 554/udp
- 554/tcp
- 3689/tcp
- 5353/udp
ここでポイントなのが、5353/udpです。これはマルチキャストDNSのポートなのですが、サーバ側からだけではなく、クライアント側からも同じポートから通信がおこなわれるらしいのです。というわけで、5353/udpをソースとしたアクセスも許可するようにします。
ここまでをコマンドでまとめると、以下のようになります。
$ sudo firewall-cmd --permanent --add-port=1900/udp
$ sudo firewall-cmd --permanent --add-port=554/udp
$ sudo firewall-cmd --permanent --add-port=554/tcp
$ sudo firewall-cmd --permanent --add-port=3689/tcp
$ sudo firewall-cmd --permanent --add-port=5353/udp
$ sudo firewall-cmd --permanent --add-source-port=5353/udp
さらなる問題
ここまでの設定で、SONOS ONE SLはAirPlay機器としてRoonサーバから認識されるようになりました。ですが、ここまでだと、SONOS ONE SLをゾーンとして指定してもなぜか音が出ません。firewalldを止めると音は出るようになるので、やはりファイアウォールの問題のようです。さて困りました。
しかたがないので、firewalldの拒否ログ(「firewall-cmd –set-log-denied=all」で/var/log/messageに吐かれるログ、詳しくはこちらの記事参照)を観察して、引っかかってるところを片っ端から許可してみることにしました。
まず、音楽を再生しようとすると6002/udpにアクセスが飛ぶようなので、これを許可します。すると、うまいことに音が出るようになりました。ですが、聴いていると音がブツブツと途切れます。まだ開けなければならないところがあるようです。ログを観察していると、だいたい40000~60000/udp辺りへのアクセスがバラバラと飛んできているようなので、思い切ってこの範囲を許可することにしました。すると、音の途切れもなくなりました。うん、乱暴だけど結果オーライ。
その後もログを見ていると、1902/udpと41957/tcpで時々引っかかるようなので(どうやらそのタイミングで音楽も途切れるらしい)、これも追加で開けておきます。ここまで来るとなんだか投げやりですが。
ここまでをコマンドでまとめると、以下のようになります。
$ sudo firewall-cmd --permanent --add-port=6002/udp
$ sudo firewall-cmd --permanent --add-port=40000-60000/udp
$ sudo firewall-cmd --permanent --add-port=1902/udp
$ sudo firewall-cmd --permanent --add-port=41957/tcp
最後に、設定を反映させるのを忘れずに。
$ sudo firewall-cmd --reload
あとがき
とまあ、ここまでしつこく問い詰めた結果、どうやら引っかかるところもなくなったようで、音楽も支障なく聴けるようになった次第です……疲れました。
ただ、この設定もサーバを再起動したらまたハズレが出る可能性があるので、戦々恐々です。
今回はサーバ屋としては誠に恥ずかしいアプローチでしたが、なまじ考えるよりは手を動かした方が早い、という言い訳でご勘弁を。
Roon 1.8 build 880 にアップグレードしたら、9330-9332/tcpを開けないと Roon Remoteが接続できないようになってしまいますた……orz
無言でこういう大事な設定を変えるの、勘弁してほしい。
参考:
https://community.roonlabs.com/t/connection-failed-roon-using-new-additional-network-ports-since-880/181528