Vagrant で SSH の接続ポート番号を変える、という発想がそもそも間違ってた

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

2013年に書いていた、『Vagrant で SSH の接続ポート番号を変えると、けっこう複雑になるという話』(http://girigiribauer.com/archives/1127/)という記事の続きです。

2013年の段階では、まだまだ考え方みたいなものがまとまりきっておらず、Vagrant が用いる接続ポート番号を変えるという方向で色々考えていたのですが、今振り返ってみるとそもそも根本の考え方を見直すべきでした。


Vagrant の使いどころ・考えどころ

ざっと『Vagrant の使いどころ・考えどころ』(http://girigiribauer.com/archives/1729/)に書いたのですが、Vagrant を用いる用途としては大きく2種類あると考えています。

  1. ローカルの開発用としてローカルでのみ使い続ける
  2. 本番環境の検証用として、同じレシピを仮想マシン・リモート環境にそれぞれ適用

SSH の接続ポート番号を変えるという大きな理由はセキュリティにあると思います。 デフォルトの22番ポートで使っていると外部からのアタックに弱いため、ポート番号を変えたい、そのためのレシピを書きたい、という点が根本にあると思います。

つまり、2.の**『本番環境の検証用として、同じレシピを仮想マシン・リモート環境にそれぞれ適用』**ってのがやりたいわけです。

もし1.が目的だったのなら、わざわざポート番号を変える必要はありません。Vagrant で SSH の接続ポート番号を変えると、けっこう複雑になるという話 にもあるように、ホスト OS が 2424 番、ゲスト OS が 22 番で接続している最中に、**ゲスト OS を 22 番をレシピで別ポートに変更してしまうと接続が切れてしまいます。ローカルで動作しているのならわざわざ変える必要はありません。**何が面倒なのかは、詳しくはそちらの記事をご覧ください。

同じレシピをローカル、リモートに適用する

本番環境の検証用として利用したいという用途で、 同じレシピをローカル、リモートの両方に適用したいということであれば、json ファイルに設定をくくり出してやれば OK です。

ローカルは Vagrant で動いていますが、リモートはそうではないので、両方で同じレシピ適用方法が可能な knife コマンドを使いましょうー。

ローカル

以下は実際にそのまま使っているわけではないですが、nodes/localhost.json として Vagrant で動作しているローカル VM にレシピを適用するための設定ファイル(の一例)です

{
  "name": "localhost",
  "automatic": {
    "ipaddress": "192.168.24.24"
  },

  "fqdn": "localhost",
  "platform_family": "rhel",
  "platform": "centos",
  "platform_version": "6.6",

  "run_list": [
    "recipe[openssh]"
  ],

  "openssh": {
    "server": {
      "port": 22,
      "password_authentication": "no"
    }
  }
}

あとは knife コマンドにて、

knife solo bootstrap localhost

あるいは

knife solo prepare localhost
knife solo cook localhost

でレシピを適用してやるだけです。

Vagrant 上で openssh のレシピを適用するのですが、ポート番号は 22 から 22 に変える、みたいなレシピにしておくと良いです。変更後のポート番号を設定値としてくくり出しておきます。

あっ、Berkshelf の説明とか platform, platform_family とかの項目の説明は端折ってますが、また別記事にでも書いておきます。。。

リモート

同様に、リモートマシン(nodes/production.json)に対しては、

{
  "name": "production",
  "automatic": {
    "ipaddress": "123.456.789.012"
  },

  "fqdn": "example.com",
  "platform_family": "rhel",
  "platform": "centos",
  "platform_version": "6.6",

  "run_list": [
    "recipe[openssh]"
  ],

  "openssh": {
    "server": {
      "port": 12345,
      "password_authentication": "no"
    }
  }
}

同様にポート番号をくくり出しておき、それを利用してレシピを適用することで、 リモートのサーバの SSH のポート番号を変更することが可能です。

で、ちょっと気をつけないといけないのが、 初回のレシピ適用時と、2回目以降のレシピ適用時のポート番号が異なる点です。

僕は以下のように、初回のみオプションで上書きしています。

knife solo bootstrap production -p 22 -x root

knife solo prepare --help には以下のようなオプションがあり、

-p, --ssh-port PORT              The ssh port
-x, --ssh-user USERNAME          The ssh username

これを利用して、初回のみポート番号を 22 で、かつ root ユーザーにてレシピ適用します。 (この段階ではもちろんパスワード認証なので、何回かパスワードの入力を求められます。)

リモートにレシピを適用するときの注意点

それ以外にも、自分がはまったなーというものをメモっておきます。

初回アクセス時に ~/.ssh/known_hosts に接続情報が保持されます。

「あー、ぐちゃぐちゃしてきたから、一旦リセットして最初からレシピを適用し直したいなー」というときに、 上記ファイルに残っている情報をクリアしておかないと接続ができないケースがあるようです。

また、さくらVPS のサービスを利用しているのですが、OS のインストールをし直した際は、少し時間を置いてからでないとうまく適用できません。焦らずコーヒーでも飲みましょう。

まとめ

  • Vagrant を用いる際の目的をはっきりさせる
  • サーバの設定値をくくり出す

なお、本当にどうでもいい話ですが、ドラマ TwentyFour では、テロリストや CTU 職員が IP アドレスを指定するときに、262.xxx.xxx.xxx のような、実際には存在しない 255 を超えた数値をドラマ内で言ったりします。

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

もし記事内に誤りなどございましたら、 @girigiribauer @girigiribauer.com までご一報いただけると助かります。

Related articles