TeraTerm(Win7)からVirtualBox(Ubuntu14)へNAT経由でSSH接続

#0. モチベーション
WindowsPCで手頃な仮想環境を整えたいけど、
SSH接続に合わせてネットワークを設定するのが面倒でならない方向けです。
ただし、作業記述的な内容ですので、技術的な貢献はありません。
したがって地味です。

#1. 用意するもの

ホスト側

- OS: **Windows7** ( 64-bit )
- SSHクライアント: **Tera Term** 4.82 ( #SVN5513 )

ゲスト側

- OS: **Ubuntu** 14.04.3 LTS
- 仮想化ソフト: **VirtualBox** ( 4.3.10 r93012 ) ( **4以降** )

細かなバージョンは参考程度で。

#2. 手順

##2-1. Ubuntuディスクイメージの入手

Node.js Virtual Machines : https://bitnami.com/stack/nodejs/virtual-machine
**bitnami**は様々な開発環境を仮想環境が付属する形で手軽に入手できるサービスです。
今回はこの手軽さを利用して、Ubuntuディスクイメージを手に入れます。
上記リンクの**Node.js 5.4.1-0 (64-bit)** (zip) をダウンロード後、
お好みのフォルダに展開すると10個の**vmdk**ファイルが手に入ります。

**※Q1.** bitnami のダウンロードページに**VMWare**って書いてあるんだけど、平気？[^1]

##2-2. VirtualBoxでの仮想マシン作成と起動前の設定

Virtual Appliances Quick Start Guide - Bitnami documentation : 
https://wiki.bitnami.com/Virtual_Appliances_Quick_Start_Guide#Virtual_Box
英語の読める方は、上記リンクのbitnamiの解説Wikiを読みましょう。
ただし、以下の手順の**項目6**と内容が異なることに注意してください。
このWikiは後の節で何度か参照します。

1. VirtualBox **4以上**であることを確認。
2. 仮想マシンを新規作成して**Linux Ubuntu (64 bit)**を選択。
3. 「メモリーサイズ」を**512**より大きく設定。今後マシンをRubyやJavaアプリに利用するなら**1GB**より大きくするのが推奨。
4. 「すでにある仮想ハードドライブファイルを使用する」を選択して、ファイルブラウザから**#2-1節**で展開した「**vmdk**」ファイルのうち~~なんでもよいので~~**bitnami-nodejs-5.4.1-0-ubuntu-14.04.vmdk**を選択(差はない)すると設定終了[^2]。
5. VirtualBoxメニューから「設定」を開き、「システム」＞「起動順序」の☐**ネットワーク**に☑チェック。
6. 「ネットワーク」＞「アダプター1」の「割り当て」に**NAT**を選択すると「ポートフォワーディング」が有効化。
7. 同じ「ネットワーク」から「ポートフォワーディング」を開いて「新規ルールを追加」を選択したら、追加されたルールの「ホストポート」に**3333**(空いていればなんでもよい)を、「ゲストポート」に**22**を入力後「OK」して設定終了。

Wikiではアダプターで**ブリッジアダプター**を選択していますが、本記事では**NAT**を選択しているのが相違点です。~~ブリッジを選択した時のやり方知りたいな、誰か同じ環境で試して記事書いてほしいな。~~

##2-3. 仮想マシン起動後のSSHクライアントの導入

Virtual Appliances Quick Start Guide - Bitnami documentation : 
https://wiki.bitnami.com/Virtual_Appliances_Quick_Start_Guide#How_to_enable_sshd.3f
の通りでOK。以下のコマンドを叩いてください。

```ssh-install.sh
sudo mv /etc/init/ssh.conf.back /etc/init/ssh.conf
sudo start ssh
```
今後このマシンでのSSH接続を何度も利用する場合、次のコマンドを叩いてください。


```ssh-permanent.sh
sudo apt-get update    #２~３分かかります
sudo apt-get install sysv-rc-conf -y
sudo sysv-rc-conf ssh on
```
sshサービスを起動時に開始するようにしています。
**sysv-rc-conf**はUbuntu14では使えない**chkconfig**に代わるコマンドです。
参考：ubuntu版chkconfigのsysv-rc-confを使う - Qiita ： 
http://qiita.com/muraikenta/items/df0082b7f7d0f310d942

**※Q2.** **ssh-keygen**はしないのですか？[^3]

#2-4. TeraTermによるSSH接続

新しい接続を開いたら、**#2-2節**の**項目7**に対応させる形で、
「ホスト」には**127.0.0.1:3333**を、「ポート」には**22**を入力。
初回にはセキュリティ警告が表示されますがエラーではありません。
Linuxのアカウントとパスワードを入力、「プレインテキストを使う」を選択後「OK」。
これでSSH接続に成功しました。

#3. 課題

課題は、仮想化ソフトのネットワークアダプターに**ブリッジ**を選ぶ手順です。
この場合、まずifconfigコマンドでstaticなIPアドレスを設定するのですが、
それらのIPではなぜかTeraTermからの通信に失敗されるか、拒否されてしまいます。

- [VirtualBox上のCentOSにTeratermからssh接続する - フルスタックエンジニアを目指して] (http://skkskynw.hateblo.jp/entry/2015/10/12/011236)
- [TeraTermが動かない - yoneyoreの日記](http://d.hatena.ne.jp/yoneyore/20150401/1427819639)

上の2つの記事では、後者の記事が指摘するような様々な外部要因はさておいて、
CentOSの/etc/sysconfig/network-scripts/ifcfg-****中でONBOOT=yesとして
ネットワークインターフェースの有効化を図ることでの解決が報告されていますが、
Ubuntuでは/etc/network/interfacesに置き換わり記法も変わってしまい、
筆者も試行錯誤してみたのですが残念ながら分からずじまいでした。
ブリッジによるUbuntuの仮想マシンへのSSH接続成功例が今後期待されます。

#4. まとめ

本記事の手順について、SSH接続を達成するための本質的なポイントは次の３つです。

1. 仮想化ソフトのネットワークアダプタに**NAT**を選んで**ポートフォワーディング**する。
2. ゲストOSで**SSHサービスを起動**する。
3. **SSHクライアント側の接続情報と仮想化ソフトのネットワーク設定を対応**させる。

#脚注

[^1]: **A1.** 聡い読者さまは bitnami のダウンロードページに **VMWare**と書いてあることにお気づきでしょう。ですが、**vmdkはVirtualBoxでも利用できる形式**であることと、以前からVirtualBoxを導入済みであった筆者の勝手な都合から、本記事内容は**VMWare向けと書かれたものをVirtualBoxで動作する試み**を兼ねています。結果としては成功しているので、細かなこだわりが無ければ利用にたえうる、ということでよいではないのでしょうか。
[^2]: 1個1個確認したのではなく、サイズを確かめると明らかに差が見られたので、私が使用したファイル名に訂正しました。申し訳ありません。
[^3]: **A2.** 本記事のゴールはあくまでもSSH接続の成功なので、**ssh-keygen**までやりたい人はやはり詳しく載っているWikiをご覧ください。~~というか誰か編集して~~　https://wiki.bitnami.com/Virtual_Appliances_Quick_Start_Guide#How_to_configure_your_sshd_server_to_support_key_based_authentication.3f