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

あとがき

とまあ、ここまでしつこく問い詰めた結果、どうやら引っかかるところもなくなったようで、音楽も支障なく聴けるようになった次第です……疲れました。
ただ、この設定もサーバを再起動したらまたハズレが出る可能性があるので、戦々恐々です。
今回はサーバ屋としては誠に恥ずかしいアプローチでしたが、なまじ考えるよりは手を動かした方が早い、という言い訳でご勘弁を。

CentOS8で作ったRoonサーバのファイアウォール設定” に対して1件のコメントがあります。

  1. てんぽく より:

    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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください