Matthewの備忘録

忘れたときはここを見ろ。何か書いてある。

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

 因みに、上記のようなローカルで使われ、ウェルノウンポートに比べれば利用・設定期間が相対的に短命なポートはエフェメラルポートと呼ばれる。


参考:

*1:今回は、公開鍵を登録しておくなどはしなかった。脅威はないので。

*2:カーネルバージョン3.15か3.16