sshd
VirtualBoxのゲストOS(Ubuntu 12.04 LTS)からホストOSへコピペしたいときがあり、うまくいかないときがあるので、ホストOSからsshクライアントで接続して作業することにした。sshサーバーのパッケージは最初から
$ apt-get update $ apt-get install openssh-server $ sudo vi /etc/ssh/sshd_config PermitRootLogin no # YesからNoに変更 $ sudo service ssh restart
とやれば、同じネットワーク(セグメント)内ならすぐにクライアントで接続できるはずだが*1、ホストOSとVirtualBoxのネットワークの構造は次のようになっているため、少し設定が必要である。尚、ホストOSは、この時点では固定IPアドレスにはしていない。つまり、DHCPによってクラスレス静的ルーティングが設定されており、適当なアドレスが与えられている。私がアドレスを確認したときは10.0.2.*であった。
ホストOS(192.168.v.w) | ホストOS VirtualBox Host-Only Ethernet Adapter(192.168.x.y) | ゲストOSからみた上記のアダプター(10.0.a.b) | ゲストOS(10.0.a.c)
VirtualBoxのネットワーク設定でNATを利用しているので、ポートフォワーディングを利用してホストOSのsshクライアントからゲストOSのsshサーバーに接続可能にする。ネットワーク画面でNATを選択肢して「高度」設定画面から「ポートフォワーディング」を押し、デフォルトの名前がRule1(変更してよい)の「ホスト ポート」を適当なポート、「ゲスト ポート」を"22"に設定する。ゲストOSのsshクライアントから設定した「適当なポート番号」で接続できるはずだ。
ホストOS(192.168.v.w) | port 適当なポート番号 | ホストOS VirtualBox Host-Only Ethernet Adapter(192.168.x.y) | ゲストOSからみた上記のアダプター(10.0.a.b) | port 22 | ゲストOS(10.0.a.c)
敢えて、セキュリティ的なことは考えない。とりあえずつながればよいのだ。
適当なポート番号
多くのLinuxディストロはユーザーがローカル環境内で好き勝手に利用できるポートの範囲がデフォルトで32768から61000までと設定されている。これはLinux Kernelバージョン3.14まではソースLinux/net/ipv4/sysctl_net_ipv4.cに直に書かれていた。ソースリポジトリをGitに移行したあたりから*2直に書かなくなっている。他のソースファイルに書かれているのか、別の仕組みで値を得ているのかはわからなかった(後日調べてみよう)。
この値はユーザーが調べることが可能になっており、次のコマンドで確認できる。
$ cat /proc/sys/net/ipv4/ip_local_port_range
変更も可能で、次のように設定できる。
# echo 9000 65500 > /proc/sys/net/ipv4/ip_local_port_range
上記のようにカーネルに情報を与えただけでは次回ブート時に設定がデフォルトに戻ってしまう。カーネルに設定した値を永続化したいときは次のように/etc/sysctl.confに書いておく。
$ sudo vi /etc/sysctl.conf net.ipv4.ip_local_port_range = 9000 65500 #このような行を追加するか、既にあればポート番号を修正。9000と65500は例。 編集後にネットワークを再スタート $ sudo service network restart
因みに、上記のようなローカルで使われ、ウェルノウンポートに比べれば利用・設定期間が相対的に短命なポートはエフェメラルポートと呼ばれる。
参考: