2005年6月18日土曜日

(QEMU)ゲストOSのFreeBSDから、外の世界(インターネット)にアクセスする

今日は、ゲスト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」と表示されます。



qemu-port

■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: close



Connection closed by foreign host.
>

proxy-test





■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/

こんな感じです。背景が黒って醜いですね。好みの問題かもしれませんが。。。



w3m



なにはともあれ、これで、なんとかFreeBSDにパッケージをインストールすることができるようになりました。
(通信の信頼性は気になりますが)




1 件のコメント:

  1. squid ローカル動作確認が役立ちました!
    ありがとうございました_o_

    返信削除