今までのネットワーク接続はeth0でTAP-WIN32のアダプタに接続し、ホストマチン(Windows)のインターネット共有している。この方法で簡単にゲストのLinuxから外部(インターネットなど)に接続することはできるけど、外部(社内ネットワーク)からはゲストので動いているサーバへアクセスできない。社内ネットワークではcoLinuxのインスタンスに勝手にIPアドレスを与えることはできない場合サーバを公開したいならホストからゲストへポートをフォーワードするしかない。
以下の設定はetho0にTAP-WIN32の設定が既にあることを前提としている。
ホスト(Windows)側のcoLinuxの設定ファイルにslirpのインタフェースを追加する:
shell-unix-generic>>
eth1=slirp,,tcp:22:22/tcp:80:80/tcp:443:443
<<shell-unix-genericゲスト(Linux)側の
/etc/network/interfacesにeth1を追加:
shell-unix-generic>>
secondary network for external network access
iface eth1 inet static
address 10.0.2.15
network 10.0.2.0
broadcast 10.0.2.255
netmask 255.255.255.0
gateway 10.0.2.2
<<shell-unix-generic
10.0.2.15は適当なアドレスだけど、gatewayの10.0.2.2は特別で、slirpデーモンのデフォルトアドレスだ。
この記事ではcolinux0.7.3のUbuntuで行なったけど、DebianやFedoraでも設定が同じだろう。ちなみに、XAMPPやandLinuxのようなパッケージを使えばこの設定は不要らしい。
注意点
- windows側のfirewall設定
- 複数default gatewayのルーティング問題。解決策が二つ:
- SLiRPのgatewayのみにする。要するにeth0/tapにgatewayを定義せず、インターネットの通信をslirpに通す。このやりかたがわりと簡単だけど、SLiRPが若干遅いことと10.0.2.2(slirpデーモン)以外のところにpingできない
- 複数default gatewayのルーティングの設定をする (iproute2でpolicy routing)
- SLiRPはIPv6に対応していないため、ゲスト側で効果したいサービスがIPv6のアドレスにバインドしてしまうとうまくいかない。
netstat -n --inet6 --listeningなどで確認んできる。たとえば、sshの場合は:
shell-unix-generic>>
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp6 0 :::22 :::* LISTEN
<<shell-unix-generic
この問題を解決するにはIPv6を無効化にするか、各種サービスを明示的にIPv4のアドレスに設定する。