背景
前回、サークルの部室にISPとピアリングしてもらい、ネットワークを構築したというお話をしました。その後、所有しているIPアドレスを活用し、Docker専用のサーバを構築し、部室運営に必要なサービスをDockerのコンテナにして運営してきましたが、「Webサーバを使わせてもらいたい」、「Linux仮想サーバを使わせて欲しい」等の要望があり、要請がある度にアプリケーションをコンテナ化してもらいDocker上にデプロイしましたが、外部の人が直接仮想基盤をいじらせたくないことや、デプロイが煩わしいこともあり仮想基盤の内部にLXCを作り、外部からのSSHによりLXC内部に直接アクセスしてもらえるように、ProxmoxVEへの移行を決定しました。
ただ、ProxmoxVEへ移行するだけじゃ今回の要件を全部満たすことはできないので、ProxmoxVEを導入した後、どのように構成したかを簡単にまとめてみようと思います。
要件定義
- リバースプロキシによるHTTPルーティングができること
- ProxmoxVE内部のコンテナに外部から直接SSHができること
- NATによるプライベートIP割り当てでグローバルIPの節約
構成図
SSHPiper
SSHPiperはユーザ名でSSHのコネクションをルーティングしてくれるもので、同じIPでも、
user200@AAA.BBB.CCC.DDD -> root@10.0.0.2
user201@AAA.BBB.CCC.DDD -> root@10.0.0.3
のようにルーティングしてくれます。
したがって、コンテナごとにグローバルIPアドレスの割り当てや、ポートフォワーディング(マスカレード)をせずに外部から一つのIP、一つのポートだけでも十分アクセスができるようになります。
Nginx Proxy Manager
HTTPも同様に、ホストごとのルーティングを行うべく、GUIで手軽にルーティングの制御ができるNginx Proxy Managerを導入しました。
Nginx Proxy ManagerはProxmoxVE内部のNATと接続しているため、ユーザにユーザ所有のホストにコンテナのグローバルIPを登録してもらい、Nginx Proxy Managerでホスト名に対応させプライベートIPの10.0.0.2~254を登録することで、一つのIPで複数のWebサービスを運用することができます。
移行後の感想
- 仮想基盤をDockerのみ運用していたため、ユーザが直接SSHにアクセスできず、いちいちdocker-compose.ymlやDockerfileを受け取り、デプロイしていましたが、その手間が省けました。
- また、ProxmoxVEからデフォルトでQoSを提供してくれるため、コンテナのネットワークスピードの制限も可能で、不意にコンテナ内部でネットワーク障害を起こす恐れを防ぎました。
- VPNを構成し、貸出用のコンテナを除きすべての操作はVPN経由でできるようにしたため、外部からProxmoxVEの管理者パネルやSSHの攻撃の可能性を完全に封じました。
- DockerをそのままProxmoxVEに移行させたため、多少構成が雑になってしまいました。
- 貸出用コンテナの内部からユーザが任意にDockerをインストールし、CI/CDパイプラインの構成もできるため、管理の融通が効くようになりました。