Synology NASで複数ドメインをDockerでつなぐ方法

最初にファイルのバックアップと共有用にNASを購入したときは、ファイル共有以外には特に機能がありませんでした。しかし、その後、軽量なウェブサーバー機能が追加され、自動インストールでWordPressなどが使えるようになりました。数年前からはDockerにイメージをアップロードする機能まで追加されました。小規模なスタートアップなら、これ1台でメールサービスやバックオフィス、ウェブサイトまで運営できるでしょうね。スタートアップでなくても、興味がある方もいるかもしれませんね。私のように…

自宅で自分だけが使うシステムなら、特に作業せずにNASが提供する機能を簡単に使えます。しかし、外部とつながるサービスを構築したい方、たとえばブログ運営などを考えている方には、ネットワークの基本知識がないと作業が難しいでしょう。インターネットで問題を解決することは簡単ですが、後に構造を変更したり拡張したいときに再び苦労するかもしれません。そこで、私と似た趣味を持つ方々のために、少し簡単にネットワークサービスの動作構造を説明したいと思います。もう少し具体的に言うと、

外部からドメイン名を通じて自宅のNASに配置したDockerサービス(ウェブサイト)にアクセスするネットワーク構造についての説明

ということになりますね。では、行きましょう。✨

まず、私がドメインを持っていると仮定しましょう。このドメイン名はネームサーバーサービスを通じて私のグローバルIPと接続されています。すると、Dockerにアップロードしたサービスまでは以下の経路でアクセスされます。

ネットワーク伝達経路

ユーザーがURL(Dockerにアップロードしたサービスに接続されたドメイン)をブラウザに入力すると、ネームサーバーを通じて事前に接続しておいた私のグローバルIPを探し、サービスをリクエストします。一般的なウェブサービスなので80ポートで呼び出しますね。そのとき最初に出会うのが私のルーターです。ルーターはユーザーのリクエストを処理できるサーバー側に接続する作業をしなければなりません。このルーターの外側は外部で、内側は内部であり、この2つのネットワークは互いに独立して存在します。ルーターがそれらをつないでいるのです。単に接続するだけでなく、ルーター内で私の部屋のネットワーク全体を構成する役割も果たしています。2つのネットワークが分離されているので外部のユーザーはNAS内部のIPを知ることができず、アクセスもできません。このときルーターが仲介者の役割を果たしています。✨

ポートフォワーディング: コンピュータネットワークでパケットがルーターやファイアウォールのようなネットワークゲートウェイを横断している間に、1つのIPアドレスとポート番号の結合の通信リクエストを他の場所に渡すネットワークアドレス変換(NAT)の応用です。✨ウィキペディア: ポートフォワーディング

ウィキに載っているポートフォワーディングの定義ですが、簡単に言うとユーザーのリクエストを受け取って、その内容を処理できる側(サーバーでしょうね)に信号をフォワードするということです。そうやって信号がNASに伝えられると、NASは内部の特定のDocker側にそのリクエストを伝えなければなりませんね。🚀

リバースプロキシ: コンピュータネットワークでクライアントの代わりに1台以上のサーバーからリソースを取得するプロキシサーバーの一種です。その後、これらのリソースがまるでウェブサーバー自体から起源したかのように該当クライアントに返されます。関連クライアントのために任意のサーバーに接続する中間媒介物であるフォワードプロキシとは反対に、リバースプロキシは関連サーバーのために任意のクライアントが該当サーバーに接続する中間媒介物です。🍏ウィキペディア: リバースプロキシ

NASで内部のDocker側にリクエストを伝えるときはリバースプロキシを使用します。説明が少し複雑ですが、リバースプロキシを説明する前にまずフォワードプロキシ(通常プロキシと呼ぶとフォワードプロキシを指します)について話してみましょう。フォワードプロキシはユーザーのリクエストを中間でキャッチして、欲しいものを持ってきてくれるサービスです。ユーザーがAというお店でリンゴを買いたいとき、使者のように活用すると考えてください。そうするとユーザーはAというお店に行かなくても、リンゴを手に入れることができますね。フォワードプロキシサーバーはAというお店のリンゴを多くの人がリクエストすると、事前にリンゴを買っておくこともあります。そうすると、より早くリンゴを受け取れますね。CDNサービスも(実際にはもっと複雑なサービスや技法を使用していますが)基本的にはこの構造を活用しています。🌐

では、リバースプロキシとは何でしょうか?ユーザーはリバースプロキシサーバーをAというリンゴ屋だと思ってリクエストをする、と考えてください。プロキシサーバーは事前にリンゴを購入できるお店(サーバー)を知っていて、その方向にリクエストしてリンゴを受け取り、ユーザーに届けます。理解を助けるための説明なので、細かい内容を知りたい方はぜひ該当用語で詳細検索をしてみることをお勧めします。🍎

図をもう一度描いてみましょう。

もっと正確なネットワーク伝達経路

実際、NASは製品名であり、その製品内でリバースプロキシサーバー(サービス)とDockerサービスが同時に動いています。最新のNASを持っている皆さんは、AWSサービスを手のひらの中に持っているようなものです。興味はないかもしれませんが…🤷‍♂️

では、実際にルーターからどのように設定するのかについて話してみましょう。まず、前述のようにドメインを呼び出すと、ウェブサービス用ポートである80ポートでリクエストがルーターに到着します。もちろんルーターにです。すると、ルーターはそのリクエストをリバースプロキシサーバーにフォワードする必要があります。ここで理解を助けるために設定を一度やってみましょう。 

  • ドメイン: domain.com
  • ドメインに接続されたグローバルIP: 1.1.1.1
  • NASの内部IP: 192.168.1.2
  • リバースプロキシサーバーポート: 80/443
  • Dockerローカルポート: 8081
  • Dockerコンテナーポート: 80

まずユーザーがブラウザにドメインを入力して呼び出すと、基本ポートである80でリクエストがルーターに到着します。すると、ルーターはそのリクエストをポートフォワードでリバースプロキシサーバーに送信する必要があります。このとき、ポートフォワード内容は80ポートをNASのIPである192.168.1.2の同じポートにフォワーディングするように設定しておけばいいです。(SSL使用のための443ポートも同様に設定しておいてください)🔧

もしNASではなく、リバースプロキシ専用のサーバーに接続するのであれば、理解しやすいでしょう。NASはほとんどのサービスをDSM(DiskStation Manager)というNASオペレーティングシステムに機能として作っているため、構造的な理解が難しいです。このDSMを1つのウェブサービスと考えると、少し理解しやすいでしょう。そして、このDSMウェブサービスは80および443ポートでアクセスするようになっています。そのため、ルーターから80および443でのリクエストをそのままNASの80および443ポートに伝えるのです。そうするとDSMのリバースプロキシでそのリクエストを受け取れるように設定されます。🔍

次はリバースプロキシサーバーの設定です。もしdomain.com以外にもdomain2.comをもう1つ使いたいと仮定してみましょう。そうすれば同じグローバルIP(1.1.1.1)の80ポートで両方のリクエストが入ってきます。このリクエストはそのままリバースプロキシサーバーに送信されますね。そうすると、リバースプロキシサーバーではIPではなくリクエストDomainを確認して、適合するDocker側に正しく接続できるようにしなければなりません。ホスト名(ドメイン)とポートを設定側に入力し、それを送信する対象ホスト(Docker、通常はlocalhostと入力)とDockerのローカルポートを指定すれば、すべての設定が完了します。そうやってリクエストがDockerのローカルポートに送信されると、もう一度Dockerに定義されているコンテナーポートに送信され、実際にユーザーに届けるページをささっと作って届けるのです。💻

このように設定すれば、NASのパフォーマンスが許す限り複数のドメインに接続された個別のウェブサービスを提供できるようになります。サービスごとにDockerにアップロードすれば、上記の内容だけで簡単に運営が可能で、1つのDockerにアップロードしたウェブサービスに複数のサイトをアップロードしたい場合は、そのDockerのウェブサーバー内でバーチャルホストを使用すればいいです。🌍


実際、企業で運営されているセンターも上の構造で運営されているのです。もちろんユーザーが多い場合は、より良い仕様の独立したサーバーを構成しなければなりませんが、ソーシャルネットワーク企業でない限り、同時ユーザーが多くない一般製造業やスタートアップの紹介ページはこれで十分でしょう。実際、ハードウェアが飛躍的に発展しているために可能な話ですが…もちろん情報保護やリスクヘッジ観点での二重化やセキュリティソリューションなどはビジネス特性を考慮しながら検討しなければなりませんね。🔒

とにかく、まとめた内容がNASを使用している皆さんにとって良い情報になれば嬉しいです。🙏🏻


Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *