Chinachu / Mirakurun

A Modern DVR Tuner Server for Japanese TV.
https://chinachu.moe
Apache License 2.0
626 stars 101 forks source link

TCP ポートが有効化されている場合、プライベートな IPv4 アドレスのない環境で起動しない #64

Closed rhenium closed 4 years ago

rhenium commented 4 years ago

Environment

Issue

システムに非プライベートな IPv4 アドレスのみが設定されている環境にて(試していませんが、恐らく IPv6-only な環境でも)、Mirakurun のサーバー設定で TCP ポートの listen が有効化されている場合、起動中に延々と Server hasn't detected IPv4 addresses... のログが吐かれ続けるだけで、TCP / UNIX ドメインソケットどちらにもサーバーが立ち上がりません。

エラー文から探ったところ、コミット ff603b444cefa27ada63d4a4aa1e077174cda5ce (v2.12.0+) が原因のようです。

60 のような問題への解決策としては、Mirakurun に 0.0.0.0 / :: へ bind させる手段を用意して、細かいアクセス制御はユーザーに別途ファイアウォールで行ってもらうのが最も簡単なのではないかと思います。

kanreisa commented 4 years ago

こんにちは。

ご指摘の挙動は仕様です。UX やコンプラ等様々な観点から 0.0.0.0 / :: での listen と、グローバル IP からのアクセスはサポートしていません。必要であれば、仮想 NIC (eth0:n 等のこと) や xinetd 等を利用してください。この仕様は Mirakurun を今後も継続して公開・メンテするための必要な措置であります。(詳しいことはお察しください/個別で聞いてください。)

IPv6 のみでの listen は需要があれば対応するかもしれません。 PR は welcome です 😄

また既にお察しの通り、 server.ymlpath が設定された状態で port~ (null) にして起動すると UNIX ドメインソケットのみで listen できます。

ディスカッションについては Discord をお気軽にご利用ください。 どうぞよろしくお願いいたします。

rhenium commented 4 years ago

わたしは UNIX ドメインソケット経由でのみで利用していたため、サーバー設定の port をそのように設定することで現在は対処しています。ただ、TCP の listen はデフォルトで有効化されている機能であり、以前のバージョンでは正常に(localhost と IPv6 リンクローカルアドレスにのみ bind するという形で)動作していたことから Issue を立てました。

いずれにしても、数秒おきにエラーログを吐き続けるだけで一向に起動しない、という現在の挙動が望ましいものであるとは思えません。

また、コミット ff603b444cefa27ada63d4a4aa1e077174cda5ce の方法では、(極めてレアなケースではあるでしょうが)複数のプライベート IP アドレスを持つ環境において #60 の問題を必ずしも回避できるわけではありません。例えば Debian の ifupdown は各インターフェースを(並列化せずに)順に立ち上げていたはずですので、システム起動時に全てのインターフェースが立ち上がるまでに数秒以上の時間がかかることは十分考えられます。その場合には Mirakurun が一部のアドレスについて bind し損ねることがありえます。

これらを踏まえると、コミット ff603b444cefa27ada63d4a4aa1e077174cda5ce の変更は revert されるべきだと私は考えています。

60 への対応としては、やはり 0.0.0.0 / :: に bind した上で、実際のアクセス発生時にアクセス元 IP アドレスを検証するようにするのはいかがでしょうか。

~(個人的には、こういったアクセス制御はユーザーに委ねるべきだと思いますが、設定ミスによって Mirakurun をインターネットに公開することの危険性と、そのような需要が実際にはまず考えられないということは理解できます)~

rhenium commented 4 years ago

アクセス時の IP アドレス検証は既になされているようでした。

https://github.com/Chinachu/Mirakurun/blob/d23fd6bba5e608fe6150229d87b84518fc72b923/src/Mirakurun/Server.ts#L93-L96

この状態では 0.0.0.0 / :: に bind してしまっても問題がないように思えます。(過去の議論については確認していないので、何か見落としていたらすみません)

kanreisa commented 4 years ago

すいませんが続きは Discord か DM でやってください。本当にお願いします。察してください。