今日は、ゲストOSのFreeBSDからインターネット側にアクセスできるようにしましょう。
とりあえず、httpとftpが通れば十分ということにしておきましょう(管理が厳しい企業ネットワークだったら、もっと不自由ですから、httpとftpだけでいいということに。。。苦しい言い訳だな)。
今回は、SSHのポート・フォワーディング機能を使います。あと、HTTP/FTPのProxyサーバを使います。Proxyサーバがない場合は、なんとかして用意してください。
私の環境では、Proxyサーバとしてsquidが、IPアドレス192.168.0.21、ポート番号3128で動いています。ホストOS(Windows)のPCは、このProxyサーバに自由にアクセスできるようになっています。
■ SSHのポート・フォワーディング機能
SSHのポート・フォワーディングは、SSHを実行した側のホスト(ローカルホストと呼ぶことにする)と、SSHでログインした先のホスト(リモートホストと呼ぶことにする)の間で、特定のポートをつないでしまう機能です。具体的には、つぎの2種類の使いかたがあります。
LocalForward・・・ローカルホストのあるポートが、リモートホストを通じて、「あるホスト」のあるポートにつながってしまう。つまり、あっちの世界のポートを、ローカルホストにひっぱりこむ。「あるホスト」は、リモートホストから接続できるホストでないといけない。
例 LocalForward 5999 cvsup2.jp.freebsd.org:5999
ローカルホストのポート5999にコネクションを張ろうとすると、SSHのコネクションを通じてリモートホストに抜けたあと、cvsup2.jp.freebsd.orgのポート5999につながる。ファイアウォールの内側から、外の世界にアクセスするためなどに、よく使う。
LocalForwardは、QEMUの-redir相当の機能だといえます。
RemoteForward・・・リモートホストのあるポートが、ローカルホストを通じて、「あるホスト」のあるポートにつながってしまう。つまり、こっちの世界のポートを、リモートホストに見せてあげる。「あるホスト」は、ローカルホストから接続できるホストでないといけない。
例 RemoteForward 10080 192.168.1.1:80
リモートホスト上で、自分(127.0.0.1)のポート10080にアクセスすると、SSHのコネクションを通じてローカルホストに達したのち、192.168.1.1のポート80につながる。SSHでログインした先から、ログイン元の世界へアクセスするために使う。
さて、今回の場合は、RemoteForwardを使用します。
RemoteForward 3128 192.168.0.21:3128
これで、ゲストOS上で、3128に接続すると、Proxyサーバ(ここでは192.168.0.21)のポート3128につながります。こうして、ゲストOS(FreeBSD)から、Proxyサーバに接続する手段が生まれるのです。
リモート、ローカル、ゲスト、ホスト、何がなんだか、混乱してきますが・・・、ここでの場合をもう一度整理すると、こんな感じ。
- リモートホスト=QEMUの中でFreeBSDを実行している仮想マシン
- ローカルホスト=QEMUを動かしているWindowsパソコン
- ゲストOS=QEMUの中で実行されているFreeBSDのこと
- ホストOS=QEMUを実行しているWindowsのこと
それでもって、
- Windowsでssh(PuTTY)を実行して、FreeBSDにログインする。
- Proxyサーバは、Windows側の世界に存在している
- FreeBSDから、Proxyサーバにアクセスしたい
- そのために、sshでポートフォワーディングを行う
- sshでログインした先から、sshを実行している側へ通じるの「穴ぼこ」をあけるので、RemoteForwardとなる
混乱したら、紙に絵を書いて整理するとわかりやすいかも?
■PuTTYで、ポート・フォワーディングの設定をする
PuTTY設定で、[接続]の[SSH]の[トンネル]にて、
源ポートに、「3128」
送り先に、「192.168.0.21:3128」
送り先に、「ローカル」、「自動」
を設定し、[追加]ボタンをクリックします。「R3128 192.168.0.21:3128」と表示されます。
■FreeBSDで、Proxyの設定をする
FreeBSDにログインし、FreeBSD側でProxyサーバを環境変数で設定します。
setenv http_proxy http://localhost:3128/
setenv ftp_proxy http://localhost:3128/
ログインする毎に設定するのはいやなので、~/.cshrcに書いておきます。
動作確認します。www.asahi.comにアクセスできるかためしてみます。
こんな風になればOKです。
> telnet localhost 3128
Trying ::1...
Connected to localhost.
Escape character is '^]'.
HEAD http://www.asahi.com/ HTTP/1.0
(もう1回、Enterキーだけ押す)HTTP/1.0 200 OK
Server: Netscape-Enterprise/6.0
Date: Fri, 17 Jun 2005 13:28:52 GMT
Content-Type: text/html
Content-Length: 0
X-Cache: MISS from なんとかかんとか
Proxy-Connection: closeConnection closed by foreign host.
>
■FreeBSDでパッケージをインストールしてみよう
例として、ja-w3m-0.5.1.tbzというテキストブラウザをインストールしてみます。このあたりにあります。
ftp://ftp2.jp.freebsd.org/pub/FreeBSD/
ports/i386/packages-5-stable/
japanese/ja-w3m-0.5.1.tbz
まず、FreeBSDでrootになります。
> su
Password: (rootのパスワードを入力)
freebsd#
パッケージをインストールするのは、pkg_addコマンドです。こんな感じで実行します。
freebsd# pkg_add ftp://ftp2.jp.freebsd.org/pub/FreeBSD/
ports/i386/packages-5-stable/
japanese/ja-w3m-0.5.1.tbz
注意: 見やすいように改行しています。本来は、1行のコマンドです。
パッケージがネットワークからダウンロードされ、インストールされます。依存するパッケージも、自動的に、どんどんインストールされていきます。
ところが困ったことに、QEMUのネットワーク機能の調子が悪いのか、それともSSHのポートフォワーディングの調子が悪いのか、よくわかりませんが、FTPサイトからダウンロードしたファイルが壊れていることがよくあります(ファイルのお尻が切れているみたい)。
根気よく、なんどかpkg_addを繰り返し実行すれば、いずれ成功するみたいです。少し時間をあけてから、実行するほうがいいみたいです。なんだこりゃ?で、とほほ・・・な気分ですね。
失敗したときの様子。
freebsd# pkg_add ftp://ftp2.jp.freebsd.org/pub/FreeBSD/
ports/i386/packages-5-stable/
japanese/ja-w3m-0.5.1.tbz
Fetching ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/japa
nese/ja-w3m-0.5.1.tbz...bin/w3m: Premature end of bzip2 compressed data: Input/o
utput error
tar: Premature end of bzip2 compressed data: Input/output errorPremature end of
bzip2 compressed data: Input/output errorPremature end of bzip2 compressed data:
Input/output error
Done.
何度か繰り返して、やっと成功したときの様子。
freebsd# pkg_add ftp://ftp2.jp.freebsd.org/pub/FreeBSD/
ports/i386/packages-5-stable/
japanese/ja-w3m-0.5.1.tbz
Fetching ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/japanese/ja-w3m-0.5.1.tbz... Done.
Fetching ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/All/gettext-0.14.4_1.tbz... Done.
freebsd# ls /var/db/pkg
boehm-gc-6.4 ja-w3m-0.5.1
gettext-0.14.4_1 libiconv-1.9.2_1
■ w3mを実行する
インストールしたばかりのw3mを使って、ウェブサイトにアクセスできるか試してみます。
> rehash
> w3m http://www.asahi.com/
こんな感じです。背景が黒って醜いですね。好みの問題かもしれませんが。。。
なにはともあれ、これで、なんとかFreeBSDにパッケージをインストールすることができるようになりました。
(通信の信頼性は気になりますが)
squid ローカル動作確認が役立ちました!
返信削除ありがとうございました_o_