Solaris 10 ゾーンネットワーク構成

Solaris 10 ゾーンネットワーク構成

私は、Generic_142901-04 カーネルを搭載した Solaris 10、リリース 10/09 (s10x_u8wos_08a) でゾーンをテストしています。

ホスト サーバーには 2 つの物理 NIC (bnx0 と bnx1) があり、複数の (3 つ以上の) ゾーンを実行する予定であるため、ゾーンに NIC を専用にすることは不可能です。現在、これらのゾーンに割り当てられた「専用」 IP アドレスがないため、DHCP からリースを取得しています。

私の質問は、主にこのネットワーク構成に関するもので、現在の設定を説明した後でまたお答えします。

ゾーンを設定するために私が実行した手順(および追加情報)は次のとおりです。

erikn@global:~ $ zpool status zpool1
  pool: zpool1
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        zpool1      ONLINE       0     0     0
          c1t1d0    ONLINE       0     0     0

errors: No known data errors

erikn@global:~ $ zfs list zpool1
NAME     USED  AVAIL  REFER  MOUNTPOINT
zpool1  84.1G   183G  6.14G  /zpool1

erikn@global:~ $ pfexec zfs create zpool1/zones

erikn@global:~ $ pfexec zfs set mountpoint=/zones zpool1/zones

erikn@global:~ $ pfexec zonecfg -z test \
> 'create -b ;
> set zonepath=/zones/test ;
> verify ;
> commit'

erikn@global:~ $ zoneadm list -vic
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - test             configured /zones/test                    native   shared

ゾーンのインストールを進めました

erikn@global:~ $ pfexec zoneadm -z test install
A ZFS file system has been created for this zone.
Preparing to install zone <test>.
Creating list of files to copy from the global zone.
Copying <196614> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1595> packages on the zone.
Initialized <1595> packages on zone.
Zone <test> is initialized.
Installation of these packages generated errors: <SUNWvbox SUNWpostgr-83-server-data-root CSWcacertificates CSKmysql32 SUNWpostgr-82-libs SUNWpostgr-82-server SUNWpostgr-82-client SUNWpostgr-82-devel CSKphp5 SUNWpostgr-82-contrib CSKapache2 SUNWpostgr-82-server-data-root>
Installation of <1> packages was skipped.
The file </zones/test/root/var/sadm/system/logs/install_log> contains a log of the zone installation.

そのため、一部のパッケージでエラーが発生しましたが、いずれにしてもこのゾーン内では必要ないので、それほど心配する必要はありません。

とにかくインストールはゼロで終了しました。

erikn@global:~ $ echo $?
0

ゾーンを起動しました

erikn@global:~ $ pfexec zoneadm -z test boot

そして「コンソール」に接続します。

erikn@global:~ $ pfexec zlogin -C test

私はインストール手順に従いました。言語 (英語) の選択、ロケールの設定 (米国 (en_US.ISO8859-1))、端末タイプ (DEC VT100)、ホスト名の指定 (テスト)、タイムゾーンの設定 (Europe/Oslo)、ルート パスワードの設定 (「password123」 - 冗談です) などです。

ルートシェルを bash に変更しました:

# usermod -s /usr/bin/bash root
UX: usermod: root is currently logged in, some changes may not take effect until next login.

ログアウトして再度ログインしました。

有効になっているサービスが多数あったため (telnet や finger など)、すべてを無効にして、システムが動作するまでサービスを再度有効にする方が簡単だと考えました。

-bash-3.00# svcs | grep " svc:" | sed "s/ \{1,\}/ /g" | cut -d' ' -f3 | \
> xargs svcadm disable

これを実行すると、予想どおり、ゾーンはシステム メンテナンス モードに入りました。

すべてのミルストーン サービスを再度有効にしました。

-bash-3.00# svcs -a | grep " svc:/milestone/" | sed "s/ \{1,\}/ /g" | \
> cut -d' ' -f3 | xargs svcadm enable

sshd と syslogd を有効にしました。

-bash-3.00# svcadm enable svc:/network/ssh:default
-bash-3.00# svcadm enable svc:/system/system-log:default

依存サービスをループして有効にします:

-bash-3.00# while [ $( svcs -xv | wc -l ) -gt 0 ] ; do
> svcs -xv | grep "^svc" | cut -d' ' -f1 | xargs svcadm enable
> done
Hostname: test
Reading ZFS config: done.

コンソールログインを有効にしてステータスを確認しました。

-bash-3.00# svcadm enable svc:/system/console-login:default

-bash-3.00# svcs -xv
svc:/system/console-login:default (Console login)
 State: offline since August 27, 2012 11:38:04 AM CEST
Reason: Unknown.
   See: http://sun.com/msg/SMF-8000-AR
   See: man -M /usr/share/man -s 1M ttymon
Impact: This service is not running.

ゾーンを再起動しました。

-bash-3.00# reboot

コンソールのログイン プロンプトが表示されました。ログインしました。サービス ステータスを確認しました:

-bash-3.00# svcs -xv

出力がないことは良い出力です。

念のため、ゾーンを停止し、グローバル ゾーンからスナップショットを取得しました。

-bash-3.00# halt
Aug 27 12:10:08 test halt: halted by root
Aug 27 12:10:09 test syslogd: going down on signal 15

[NOTICE: Zone halted]
~.
[Connection to zone 'test' console closed]

erikn@global:~ $ pfexec zfs snapshot zpool1/zones/test@neat

その後、ゾーンを再度起動し、インストールされたパッケージの依存関係の順序を調べました(「pkgdep」スクリプトを使用)。ここで見つかりました)、不要なものをいくつか削除しました。

次に、ネットワークを構成する時間になりました。これがこの質問の目的です。

グローバル ゾーンから論理インターフェイスを作成し、それをゾーン「test」に割り当てました。

erikn@global:~ $ pfexec ifconfig bnx1:1 plumb zone test

これがゾーンに割り当てられたことは確認できます。

-bash-3.00# ifconfig bnx1:1
bnx1:1: flags=1100842<BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 1500 index 5
        inet 0.0.0.0 netmask 0

現在、ゾーンは IP タイプ「共有」に設定されているため、インターフェース上で DHCP 要求を送信することはできません。したがって、グローバル ゾーンからこれを実行します。

erikn@global:~ $ pfexec ifconfig bnx1:1 dhcp start
ifconfig: bnx1:1: wait timed out, operation still pending...

あまりうまくいかなかったですね。

erikn@global:~ $ echo $?
4

ゾーンに戻る。

-bash-3.00# ifconfig bnx1:1
bnx1:1: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 5
        inet 10.0.6.92 netmask fffffc00 broadcast 10.0.7.255

さて、IP アドレスはあります... (ここでは、ネットワークを 10.0.4.0/22 に置き換えましたが、ネットマスクは同じです)。

ネーム サーバーを使用するために、/etc/nsswitch.conf と /etc/resolv.conf を変更します。

私たちのネットワークでは HTTP プロキシを使用しているため、それをエクスポートすることを忘れないようにする必要があります (通常は ~/.bash_profile に配置します)

-bash-3.00# export http_proxy=http://proxy.example.com:8080

-bash-3.00# /usr/sfw/bin/wget http://www.google.com
--2012-08-27 13:03:30--  http://www.google.com/
Resolving proxy.example.com... 10.0.7.17
Connecting to proxy.example.com|10.0.7.17|:8080... connected.
Proxy request sent, awaiting response... 302 Found
Location: http://www.google.no/ [following]
--2012-08-27 13:03:40--  http://www.google.no/
Connecting to proxy.example.com|10.0.7.17|:8080... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: `index.html'

    [ <=>                                   ] 11,343      --.-K/s   in 0s

2012-08-27 13:03:40 (65.3 MB/s) - `index.html' saved [11343]

動作しているように見えますが、完璧ではありません。グローバル ゾーンに戻りましょう。

まず、DHCP も使用している実際の bnx1 インターフェイスがあります。

erikn@global:~ $ ifconfig bnx1 dhcp status
Interface  State         Sent  Recv  Declined  Flags
bnx1       BOUND         2357  1558       778
(Began, Expires, Renew) = (08/27/2012 12:09, 08/31/2012 12:09, 08/29/2012 12:09)

次に、論理インターフェースを作成します。

erikn@global:~ $ ifconfig bnx1:1 dhcp status
Interface  State         Sent  Recv  Declined  Flags
bnx1:1     PRE_BOUND       20    14         6

別の論理インターフェースを作成しますが、これはどのゾーンにも割り当てず、グローバル ゾーンに属するようにします。

erikn@global:~ $ pfexec ifconfig bnx1:2 plumb

erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start

erikn@global:~ $ echo $?
0

erikn@global:~ $ ifconfig bnx1:2
bnx1:2: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 5
        inet 10.0.6.123 netmask fffffc00 broadcast 10.0.7.255

erikn@global:~ $ ifconfig bnx1:2 dhcp status
Interface  State         Sent  Recv  Declined  Flags
bnx1:2     BOUND            5     4         1
(Began, Expires, Renew) = (08/27/2012 13:11, 08/31/2012 13:11, 08/29/2012 13:11)

それで、それはかなり完璧に機能しました。残念ながら、それはあまり役に立ちません。

そのインターフェースをゾーン「test」に渡そうとしました。

erikn@global:~ $ pfexec ifconfig bnx1:2 zone test
erikn@global:~ $ echo $?
0

それはあまり嬉しくないことでした。

erikn@global:~ $ ifconfig bnx1:2 dhcp status
Interface  State         Sent  Recv  Declined  Flags
bnx1:2     DECLINING        6     4         2

そして、インターフェース上で DHCP クライアントを解放して新たに起動すると、前回と同じ結果になります。

erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp release

erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
ifconfig: bnx1:2: wait timed out, operation still pending...

最後の必死の試みとして、私は次のことを試しました。

erikn@global:~ $ pfexec ifconfig bnx1:2 plumb \
> netmask 0xfffffc00 \
> broadcast 10.0.7.255 \
> zone test \
> up

そんな幸運はない。

erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
ifconfig: bnx1:2: wait timed out, operation still pending...

私の質問は基本的に次のとおりです。

  • Solaris 10/09 ゾーンに独自の物理 NIC を与えずに、DHCP で IP を割り当てることは可能ですか?

  • やり方が間違っているのでしょうか? 代わりにゾーンにプライベート IP を割り当てて、ホスト コンピューターに NAT を実行させるべきでしょうか? それは可能ですか?

私の最終目標は、それぞれのゾーンで異なるネットワーク接続サービスを実行することです。

  • ゾーン間でネットワーク通信が行われ、

  • また、ネットワーク上の他のホストによって使用されるネットワーク アクセス可能なサービスも実行される予定です。

答え1

ゾーン仮想インターフェイスにはいくつかの機能が制限されています... 一部の状態は設定できず、パケット フィルターもゾーンでは機能しません。 私の記憶が正しければ、ゾーン インターフェイスはイーサネット ブロードキャストを送信できないため、DHCP はありません。

ところで、ゾーン インターフェイスの設定についてなぜそんなに面倒なことをするのですか? これについてはどうですか?

pfexec zonecfg -z test
> 'create -b ;
> set zonepath=/zones/test ;
> add net ;
> set physica=bnx1 ;
> set address=10.0.6.92 ;
> end ;
> verify ;
> commit'

グローバル ゾーン インターフェイスからネットマスクを継承します。 もちろん、より多くのインターフェイスを設定することも、ゾーンを「内部」インターフェイス (パブリック IP なし) にのみ配置して、 let ipfprovide を実行することもできますNAT

関連情報