すっかりDiscord - PlusUltra内では廃れてしまい、アクティブなのは自分を含めて2人ほどになったRustサーバですが、サーバ管理者としては色々と考えたり試したりしています。

悩みごと

現状悩んでいるのは下記の2点です。

  • ログやユーザ一覧に表示されるユーザのIPアドレスがある同一のプライベートIPアドレスで表示される
  • ゲーム内のサーバ一覧に掲載されない

前者は気にしなければいい話ではありますが、仮にCountry Blockのmodを追加して国別ブロックすることになった場合にIPアドレスが正確に判別できず機能不全になる恐れがあります。後者もゲーム内のコンソールからclient.connectコマンドでログインすることはできるのですが、リストに入らないのはとても気持ちが悪いです。

考えられる原因

ググりまくって調べた限りでは、悩みごとのどちらもNAT環境下で起こりやすいようです。今回はDocker(+Swarm Mode)を使っていますが、通常設定だとDockerが単一ホスト内で仮想ネットワークを作り、NAT(iptables)でホスト-コンテナ間の通信をコントロールしてくれます。

ネットワーク構成

で、NATによるIPアドレス変換が入るので、コンテナからは(インターネットからではなく)ホストからのアクセスがきたようにしか見えない。ログなどに同一のプライベートIPアドレスとして記録されるのはおそらくこれが原因でしょう。

ゲーム内のサーバ一覧に掲載されない件については完全に当てずっぽうですが、Rust Dedicated Server(以下RDS)を再起動した直後はサーバ一覧に表示されるのですがその後見えなくなるという流れで発生しているように見えるので、下記のようなことになっているのではないかと…

  1. RDS起動時にはRDSからサーバ一覧管理サービスに通知が送られる
  2. その後はサーバ一覧管理サービスからRDSに対しポーリングが行われる
  3. RDSが回答できないか、動作中のIPアドレスをプライベートIPアドレスで答えてしまう
  4. サーバ一覧管理サービスはこのRDSをインターネットからは接続できないと判断してサーバ一覧から排除してしまう

こう考えると一応辻褄は合うように思います。

対応予定(WIP)

Rust関連のフォーラムなどを調べていると似たようなケースはあるようなのですが、NAT環境下のまま上記の問題に対処するベストプラクティスが見当たりません。いい方法をご存じの方がいらっしゃったら教えていただけるとありがたいです。

一方で、Docker Swarm Modeのままコンテナが利用するネットワークをDockerのNATを経由せずホストのネットワークに直接割り当てる機能がDocker v17.06.2あたりからちゃんと動作するようになったようです。 →参考Issue

NATを経由しなければIPアドレス変換もなくなるので今回の悩みは解消できそうな気はします。Swarm Modeを使う意味が減りそうな気はしますが、docker-composeをインストールしなくてもcomposeファイルを使って管理できるメリットくらいは残るのでまぁいいでしょう。

近日中に設定を変更し、期待通りに動作してくれるようならまたcomposeファイルを晒すことにします。