ここでは、Solaris OS における BIND 9 DNS ネームサービスの構成および管理について説明します。
Solaris オペレーティングシステム (Solaris OS) には、BIND 9.x DNS ネームサーバーが付属しています。この章では、Solaris オペレーティングシステムで BIND 9 を使用する場合の構成および管理について説明します。BIND および DNS の全般については、「関連資料」を含め、豊富な資料が用意されています。
この章の内容は次のとおりです。
DNS と BIND の管理については、次の文書を参照してください。
『BIND 9 Migration Notes』 (/usr/share/doc/bind/migration.txt)
『BIND 9 管理者のマニュアル』(ISC (Internet Systems Consortium) の Web サイト (http://www.isc.org))
BIND の機能、既知のバグと不具合、および ISC の Web サイト (http://www.isc.org) 上の資料へのリンク
『DNS & BIND』Paul Albitz/Cricket Liu 著 (高田広章/小島育夫監訳、小舘光正訳、オライリー・ジャパン、2002 年)
BIND 9 は、BIND 8 の大部分の機能と上位互換性があります。ただし、BIND 9 を使用するために既存の BIND 8 インストールをアップグレードする際に知っておく必要のある多数の注意事項があります。BIND 9 のインストールや使用の前には、必ず『Migration Notes』をお読みください。『Migration Notes』は、/usr/share/doc/bind/migration.txt から入手可能です。また、BIND のパッケージ名は SUNWbind および SUNWbindr に変更されています。SUNWbindr パッケージに DNS サーバー目録が含まれています。
BIND 8 と BIND 9 の相違点の概要を次に示します。詳細については、『Migration Notes』を参照してください。
構成ファイルの互換性
実装されないオプションの警告メッセージ
transfer-format オプションの変更
構成ファイルのエラー
ロギングカテゴリの変更
通知メッセージと更新照会の変更
複数のクラスの変更
ゾーンファイルの互換性
ゾーンファイルにおける TTL に関するより厳密なルール
SOA シリアル番号の変更
対になっていない引用符によるエラー
改行および構文の変更
ドメイン名における $$ に代わる \$ の使用
新しいプロトコルの機能による相互運用性への影響
BIND 9 の新規 EDNS0
ゾーン転送のデフォルトの変更
文字セットの制限解除
文字セットに関する制限の解除
セキュリティー上の問題、不適切な命名
サーバー管理ツール
ndc プログラムの rndc プログラムへの置き換え
nsupdate: 複数更新における変更
ゾーン間の情報漏れの防止
グルー NS レコードの異なる処理
変更されない umask
umask のアクセス権に関する問題
DNS/BIND named サービスは、サービス管理機能 (SMF) によって管理できます。SMF の概要については、『Solaris のシステム管理 (基本編)』の第 18 章「サービスの管理 (概要)」を参照してください。さらに、詳細は、svcadm(1M)、svcs(1)、および svccfg(1M) のマニュアルページを参照してください。 /var/svc/manifest/network/dns にある DNS サーバー目録 server.xml も確認してください。
このサービスに関する有効化、無効化、再起動などの管理アクションは svcadm コマンドを使用して実行できます。
-t オプションを使用してサービスを一時的に無効化すると、そのサービス構成に対していくらかの保護を提供できます。-t オプションを指定してサービスを無効にした場合、リブート後に元の設定が復元されます。-t オプションを指定しないでサービスを無効にした場合、リブート後もそのサービスは無効のままです。
DNS サービスに対する障害管理リソース識別子 (FMRI) は、svc:/network/dns/server:<instance> および svc:/network/dns/client:<instance> です。
DNS サーバーおよびクライアントの状態の照会は、svcs コマンドを使用して実行できます。
svcs コマンドと出力の例を、次に示します。
# svcs \*dns\* STATE STIME FMRI online Nov_16 svc:/network/dns/server:default online Nov_16 svc:/network/dns/client:default |
svcs -l コマンドと出力の例を、次に示します。
# svcs -l /network/dns/server fmri svc:/network/dns/server:default name Internet domain name server (DNS) enabled true state online next_state none restarter svc:/system/svc/restarter:default contract_id 25 dependency require_all/none svc:/system/filesystem/minimal (online) dependency require_all/none file://localhost/etc/named.conf (online) dependency require_any/error svc:/network/loopback (online) dependency optional_all/error svc:/network/physical (online) |
DNS サービスを異なるオプション (たとえば、/etc/named.conf 以外の構成ファイル) によって開始する必要がある場合、svccfg コマンドを使用して DNS サーバー目録の start method のプロパティーを変更します。
BIND 9 ネームサービスの複数のコピーを実行する場合にのみ、SMF サービスの複数のインスタンスが必要です。追加インスタンスはそれぞれ、異なる開始メソッドを使用して DNS サーバー目録で指定できます。
サーバーの管理には svcadm を使用することをお勧めしますが、rndc も使用できます。管理に svcadm と rndc のどちらを使用しても、SMF は BIND 9 の named サービスの状態変化を認識します。
サービスをコマンド行から手動で実行した場合は、SMF は BIND 9 の named サービスを認識しません。
BIND 8 ndc と BIND 9 rndc のネームサーバー制御ツールは、下位互換性がありません。rndc は BIND 8 ネームサーバーに接続できず、ndc は BIND 9 ネームサーバーに接続できません。機能、オプション、操作のデフォルトモード、および構成ファイルの要件が変更されています。そのため、BIND 9 サーバーで ndc を使用すると、機能が使用できなくなったり操作が不安定になったりすることがあります。詳細は、rndc(1M) のマニュアルページを参照してください。
BIND 8 の ndc と BIND 9 の rndc とのもっとも大きな違いは、rndc はそれ自身の構成ファイル rndc.conf を必要とすることです。rndc-confgen コマンドによってこのファイルを生成できます。rndc.conf ファイルは、制御を行うサーバー、およびそのサーバーが使用する必要のあるアルゴリズムを指定します。
options { default-server localhost; default-key "rndc-key"; }; key "rndc-key" { algorithm hmac-md5; secret "qPWZ3Ndl81aBRY9AmJhVtU=="; }; |
controls { inet * allow { any; } keys { "rndc-key"; }; }; key "rndc-key" { algorithm hmac-md5; secret "qPWZ3Ndl81aBRY9AmJhVtU=="; }; |
ndc ユーティリティーと rndc ユーティリティーはどちらも、コマンドをネームサーバーに送信し、情報をネームサーバーから取り出すために制御チャネルを使用します。ただし、これらのユーティリティーには相違点があります。
BIND 8 の ndc は、AF_UNIX ドメインソケット (UNIX 制御チャネル) または TCP/IP ソケット (inet 制御チャネル) を使用できます。デフォルトでは、BIND 8 サーバーは、in.named にコンパイルされたパス (/var/run/ndc.d/ndc) によって UNIX ドメインソケットを使用するので、ndc は /etc/named.conf のサポートを必要としません。
これに対して BIND 9 の rndc は、認証された TCP/IP inet 制御チャネルのみを使用するので、BIND 8 と下位互換性がありません。BIND 9 サーバーには、制御チャネルのための UNIX ドメインソケットのサポートがありません。
rndc を使用する場合、ネームサーバーと通信するために「key」句を指定する必要があります。BIND 9 サーバーと rndc クライアントは、同じキーを共有する必要があります (/etc/named.conf と /etc/rndc.conf で定義される)。BIND 9 で BIND 8 の制御エントリを使用すると、エラーメッセージが表示されます。
一部のコマンドオプションが、ndc 実装から rndc 実装に変更されました。-c オプションもそれに含まれ、BIND 9 では構文が異なります。そのため、BIND 9 で制御チャネルを指定するには、rndc -s <server> -p <port> を使用します。
rndc コマンドの一覧を次に示します。
構成ファイルおよびゾーンを再読み込みする
単一ゾーンを再読み込みする
ゾーンの即時保守をスケジュールする
構成ファイルと新しいゾーンのみを再読み込みする
サーバー統計を統計ファイルに書き込む
照会ロギングを切り替える
キャッシュをダンプファイル (named_dump.db) にダンプする
保留中の更新をマスターファイルに保存し、サーバーを停止する
保留中の更新を保存せずにサーバーを停止する
デバッグレベルを 1 ずつ増分する
デバッグレベルを変更する
デバッグレベルを 0 に設定する
サーバーのキャッシュをすべてフラッシュする
表示用のサーバーのキャッシュをフラッシュする
サーバーの状態を表示する
サーバーを再起動する (未実装)
BIND 9 の一部のコマンド、ファイル、ツール、およびオプションは、BIND 8 と同じです。ただし、その他は変更または追加されています。この項では、BIND 9 の多くのコマンド、ファイル、ツール、オプション、およびそれぞれに関連付けられた新しい動作または変更された動作について説明します。
Solaris オペレーティングシステムで使用できる BIND 9.x ツールを次に示します。
named |
nsupdate |
rndc |
dnssec-keygen |
nslookup |
dig |
dnssec-makekeyset |
dnssec-signkey |
dnssec-signzone |
named-checkconf |
named-checkzone |
rndc-confgen |
host |
Solaris 10 リリースでサポートされている BIND 9.x 構成ファイルを次に示します。
/etc/rndc.conf |
BIND 8 と BIND 9 のコマンドおよび構成ファイルの違いを次の表に示します。
BIND 8 のコマンド |
BIND 9.x で置き換えられたコマンド |
---|---|
dnskeygen(1M) |
dnssec-keygen(1M) |
rndc(1M) |
rndc(1M) |
named-bootconf(1M) |
必要なし |
nsupdate(1M) |
nsupdate(1M) |
nslookup(1M) |
nslookup(1M) |
named-xfer(1M) |
必要なし |
in.named(1M) |
named(1M) |
named.conf(4) |
named.conf [詳細な named.conf マニュアルページは BIND 9.2.4 には含まれません。「named.conf のオプション」に、BIND 9.2.4 でサポートされる named.conf のオプションの概要を示します。] |
dig(1M) |
dig(1M) |
次に示す非互換性はすべて、同等の BIND 9 バイナリでサポートされない BIND 8 の機能およびインタフェースです。BIND 9.x バイナリのオプション、コマンド行オプションまたは機能のすべてを示しているわけではありません。
コマンド |
オプションの変更 |
---|---|
in.named(1M) |
DNS ネームサーバー in.named の一部のコマンド行オプションはサポートされません。 BIND 9.x ネームサーバーで、-g group_name、-q、-r および -w directory のオプションがサポートされず、BIND 8.x の -b config_file が -c config_file で置き換えられます。詳細は、named のマニュアルページを参照してください。 |
dnssec-keygen(1M) |
キーの生成のために使用する BIND 8.x の dnskeygen と BIND 9.x の dnssec-keygen に、共通のオプションはありません。詳細は、dnssec-keygen のマニュアルページを参照してください。 |
rndc(1M) |
BIND 8.x の ndc と BIND 9.x の rndc は大きく異なります。共通のオプションは 1 つもなく、ndc とは異なり、rndc は実行のために /etc/rndc.conf に構成ファイルが必要です。詳細は、rndc、rndc.conf、rndc-confgen のマニュアルページを参照してください。 |
BIND 9.x の -nsupdate で、k オプションの構文が変更されました。-k keydir::keyname ではなく、 k keyfile です。それ以外のもう 1 つの変更は、サーバーへの入力送信の信号として空の行を使用していましたが、明示的に send サブコマンドを使用するようになりました。詳細は、nsupdate のマニュアルページを参照してください。 |
|
BIND の 9.x バージョンでサポートされないオプションは、 help、host server、set ignoretc、set noignoretc、set srch[list]=N1[/N2/.../N6]、set ro[ot]=host、root、finger [USER]、ls [opt] DOMAIN [> FILE] です。 |
|
named.conf(4) |
named.conf の詳細なマニュアルページは、BIND 9.2.4 に含まれていません。 サポートされないオプション、実装されないオプション、またはデフォルトが変更されたオプションがあります。オプションの変更のリスト、および BIND 9.2.4 でサポートされる named.conf のすべてのオプションの概要については、「named.conf のオプション」を参照してください。 |
BIND 8 と BIND 9 の named.conf のオプションの違いを次に一覧表示します。変更の簡単な説明も記載しています。「変更」の欄の「変更なし」は、BIND 9 バージョンの named でオプションの機能に変更がないことを表します。
この項では、BIND 8 と BIND 9 の文の相違点について説明します。
unix が ndc のデフォルトであり、引数のすべてがコンパイルされます。inet が rndc の唯一のオプションであり、この場合、何もコンパイルされません。
Syntax controls { [ inet ip_addr port ip_port allow { address_match_list; }; ] OK [ unix path_name perm number owner number group number; ] Not Implemented }; |
ロギング構文は大幅に変更されました。named.conf オプションのリストは、「named.conf のオプション」を参照してください。
BIND 8 の named.conf マニュアルページに示されているゾーン文の構文は、次を除いた大部分が BIND 9 でサポートされます。
[ pubkey number number number string; ] Obsolete [ check-names ( warn | fail | ignore ); ] Not Implemented |
BIND 9 で変更なく機能します。
Syntax acl name { address_match_list }; |
BIND 9 で変更なく機能します。
Syntax key key_id { algorithm algorithm_id; secret secret_string; }; |
変更なく機能しますが、この文を使用するコードは BIND 9.2.4 で使われなくなりました。
Syntax trusted-keys { [ domain_name flags protocol algorithm key; ] }; |
support-ixfr は廃止されましたが、次のオプションのすべては BIND 9 で変更なく機能します。transfer-format のデフォルトは変更されました。
Syntax server ip_addr { [ bogus yes_or_no; ] [ transfers number; ] [ transfer-format ( one-answer | many-answers ); ] [ keys { key_id [ key_id ... ] }; ] [ edns yes_or_no; ] }; |
BIND 9 で変更なく機能します。
Syntax include path_name; |
BIND 9.2.4 には named.conf の詳細なマニュアルページが含まれていません。BIND 9.2.4 でサポートされる named.conf のオプションの概要を次に示します。
options { blackhole { <address_match_element>; ... }; coresize <size>; datasize <size>; deallocate-on-exit <boolean>; // obsolete directory <quoted_string>; dump-file <quoted_string>; fake-iquery <boolean>; // obsolete files <size>; has-old-clients <boolean>; // obsolete heartbeat-interval <integer>; host-statistics <boolean>; // not implemented host-statistics-max <integer>; // not implemented interface-interval <integer>; listen-on [ port <integer> ] { <address_match_element>; ... }; listen-on-v6 [ port <integer> ] { <address_match_element>; ... }; match-mapped-addresses <boolean>; memstatistics-file <quoted_string>; // not implemented multiple-cnames <boolean>; // obsolete named-xfer <quoted_string>; // obsolete pid-file <quoted_string>; port <integer>; random-device <quoted_string>; recursive-clients <integer>; rrset-order { [ class <string> ] [ type <string> ] [ name <quoted_string> ] <string> <string>; ... }; // not implemented serial-queries <integer>; // obsolete serial-query-rate <integer>; stacksize <size>; statistics-file <quoted_string>; statistics-interval <integer>; // not yet implemented tcp-clients <integer>; tkey-dhkey <quoted_string> <integer>; tkey-gssapi-credential <quoted_string>; tkey-domain <quoted_string>; transfers-per-ns <integer>; transfers-in <integer>; transfers-out <integer>; treat-cr-as-space <boolean>; // obsolete use-id-pool <boolean>; // obsolete use-ixfr <boolean>; version <quoted_string>; allow-recursion { <address_match_element>; ... }; allow-v6-synthesis { <address_match_element>; ... }; sortlist { <address_match_element>; ... }; topology { <address_match_element>; ... }; // not implemented auth-nxdomain <boolean>; // default changed minimal-responses <boolean>; recursion <boolean>; provide-ixfr <boolean>; request-ixfr <boolean>; fetch-glue <boolean>; // obsolete rfc2308-type1 <boolean>; // not yet implemented additional-from-auth <boolean>; additional-from-cache <boolean>; query-source <querysource4>; query-source-v6 <querysource6>; cleaning-interval <integer>; min-roots <integer>; // not implemented lame-ttl <integer>; max-ncache-ttl <integer>; max-cache-ttl <integer>; transfer-format ( many-answers | one-answer ); max-cache-size <size_no_default>; check-names <string> <string>; // not implemented cache-file <quoted_string>; allow-query { <address_match_element>; ... }; allow-transfer { <address_match_element>; ... }; allow-update-forwarding { <address_match_element>; ... }; allow-notify { <address_match_element>; ... }; notify <notifytype>; notify-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; notify-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; also-notify [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; dialup <dialuptype>; forward ( first | only ); forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; maintain-ixfr-base <boolean>; // obsolete max-ixfr-log-size <size>; // obsolete transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; max-transfer-time-in <integer>; max-transfer-time-out <integer>; max-transfer-idle-in <integer>; max-transfer-idle-out <integer>; max-retry-time <integer>; min-retry-time <integer>; max-refresh-time <integer>; min-refresh-time <integer>; sig-validity-interval <integer>; zone-statistics <boolean>; }; controls { inet ( <ipv4_address> | <ipv6_address> | * ) [ port ( <integer> | * ) ] allow { <address_match_element>; ... } [ keys { <string>; ... } ]; unix <unsupported>; // not implemented }; acl <string> { <address_match_element>; ... }; logging { channel <string> { file <logfile>; syslog <optional_facility>; null; stderr; severity <logseverity>; print-time <boolean>; print-severity <boolean>; print-category <boolean>; }; category <string> { <string>; ... }; }; view <string> <optional_class> { match-clients { <address_match_element>; ... }; match-destinations { <address_match_element>; ... }; match-recursive-only <boolean>; key <string> { algorithm <string>; secret <string>; }; zone <string> <optional_class> { type ( master | slave | stub | hint | forward ); allow-update { <address_match_element>; ... }; file <quoted_string>; ixfr-base <quoted_string>; // obsolete ixfr-tmp-file <quoted_string>; // obsolete masters [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ] [ key <string> ]; ... }; pubkey <integer> <integer> <integer> <quoted_string>; // obsolete update-policy { ( grant | deny ) <string> ( name | subdomain | wildcard | self ) <string> <rrtypelist>; ... }; database <string>; check-names <string>; // not implemented allow-query { <address_match_element>; ... }; allow-transfer { <address_match_element>; ... }; allow-update-forwarding { <address_match_element>; ... }; allow-notify { <address_match_element>; ... }; notify <notifytype>; notify-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; notify-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; also-notify [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; dialup <dialuptype>; forward ( first | only ); forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; maintain-ixfr-base <boolean>; // obsolete max-ixfr-log-size <size>; // obsolete transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; max-transfer-time-in <integer>; max-transfer-time-out <integer>; max-transfer-idle-in <integer>; max-transfer-idle-out <integer>; max-retry-time <integer>; min-retry-time <integer>; max-refresh-time <integer>; min-refresh-time <integer>; sig-validity-interval <integer>; zone-statistics <boolean>; }; server { bogus <boolean>; provide-ixfr <boolean>; request-ixfr <boolean>; support-ixfr <boolean>; // obsolete transfers <integer>; transfer-format ( many-answers | one-answer ); keys <server_key>; edns <boolean>; }; trusted-keys { <string> <integer> <integer> <integer> <quoted_string>; ... }; allow-recursion { <address_match_element>; ... }; allow-v6-synthesis { <address_match_element>; ... }; sortlist { <address_match_element>; ... }; topology { <address_match_element>; ... }; // not implemented auth-nxdomain <boolean>; // default changed minimal-responses <boolean>; recursion <boolean>; provide-ixfr <boolean>; request-ixfr <boolean>; fetch-glue <boolean>; // obsolete rfc2308-type1 <boolean>; // not yet implemented additional-from-auth <boolean>; additional-from-cache <boolean>; query-source <querysource4>; query-source-v6 <querysource6>; cleaning-interval <integer>; min-roots <integer>; // not implemented lame-ttl <integer>; max-ncache-ttl <integer>; max-cache-ttl <integer>; transfer-format ( many-answers | one-answer ); max-cache-size <size_no_default>; check-names <string> <string>; // not implemented cache-file <quoted_string>; allow-query { <address_match_element>; ... }; allow-transfer { <address_match_element>; ... }; allow-update-forwarding { <address_match_element>; ... }; allow-notify { <address_match_element>; ... }; notify <notifytype>; notify-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; notify-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; also-notify [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; dialup <dialuptype>; forward ( first | only ); forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; maintain-ixfr-base <boolean>; // obsolete max-ixfr-log-size <size>; // obsolete transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; max-transfer-time-in <integer>; max-transfer-time-out <integer>; max-transfer-idle-in <integer>; max-transfer-idle-out <integer>; max-retry-time <integer>; min-retry-time <integer>; max-refresh-time <integer>; min-refresh-time <integer>; sig-validity-interval <integer>; zone-statistics <boolean>; }; lwres { listen-on [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; view <string> <optional_class>; search { <string>; ... }; ndots <integer>; }; key <string> { algorithm <string>; secret <string>; }; zone <string> <optional_class> { type ( master | slave | stub | hint | forward ); allow-update { <address_match_element>; ... }; file <quoted_string>; ixfr-base <quoted_string>; // obsolete ixfr-tmp-file <quoted_string>; // obsolete masters [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ] [ key <string> ]; ... }; pubkey <integer> <integer> <integer> <quoted_string>; // obsolete update-policy { ( grant | deny ) <string> ( name | subdomain | wildcard | self ) <string> <rrtypelist>; ... }; database <string>; check-names <string>; // not implemented allow-query { <address_match_element>; ... }; allow-transfer { <address_match_element>; ... }; allow-update-forwarding { <address_match_element>; ... }; allow-notify { <address_match_element>; ... }; notify <notifytype>; notify-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; notify-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; also-notify [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; dialup <dialuptype>; forward ( first | only ); forwarders [ port <integer> ] { ( <ipv4_address> | <ipv6_address> ) [ port <integer> ]; ... }; maintain-ixfr-base <boolean>; // obsolete max-ixfr-log-size <size>; // obsolete transfer-source ( <ipv4_address> | * ) [ port ( <integer> | * ) ]; transfer-source-v6 ( <ipv6_address> | * ) [ port ( <integer> | * ) ]; max-transfer-time-in <integer>; max-transfer-time-out <integer>; max-transfer-idle-in <integer>; max-transfer-idle-out <integer>; max-retry-time <integer>; min-retry-time <integer>; max-refresh-time <integer>; min-refresh-time <integer>; sig-validity-interval <integer>; zone-statistics <boolean>; }; server { bogus <boolean>; provide-ixfr <boolean>; request-ixfr <boolean>; support-ixfr <boolean>; // obsolete transfers <integer>; transfer-format ( many-answers | one-answer ); keys <server_key>; edns <boolean>; }; trusted-keys { <string> <integer> <integer> <integer> <quoted_string>; ... }; |