いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.195 / 読者数:1741名

こんばんは、うすだです。

2月から勤めている会社では、その日の終わりに日報を書いて、 メールで提出することになっています。

日報には、その日行ったことだけでなく、前日の目標を達成したかどうかとか、 その理由とか、感じたこととか、書く項目がいろいろあります。

また、極力ポジティブな表現をする必要があります。
たとえば、「周囲の人の足をあまり引っ張らなくなってきた」という表現は NG です。 湾曲しますが「前日よりも効率よく作業できた」などと表現すべき…らしいです。

そんなことをいろいろ考えていると、日報を書くだけで結構な時間を消費してしまいます。

で、いまは見習い期間で残業できないため、 残業開始の18時までにタイムカードを押して退社しなければなりません。

ですので、間際に日報を書いていると間に合わないのです。
とはいえ、早めに終わらせて日報にとりかかる、 なんてことが丁稚奉公に許されるわけはありません。

というわけで、毎日、18時前にタイムカードが押せるかどうか、 ドキドキしながら仕事をしています。
40歳にもなって、こんな体験ができるとは思ってもいませんでした。
貴重な体験だと思いますので、 残業が許されるようになるまでこの気持ちをじっくり味わいたいと思います。

極力ポジティブに表現したところで、今回もはりきってまいりますよ!

今回のお題 - IPv6 でいろいろ通信してみる

新年一発目〜前回と、IPv6 に関するネタをご紹介しました。

Vol.193 - IPv6 をいまさら始めてみる
http://www.usupi.org/sysad/193.html
Vol.194 - IPv6 でアドレスを自動的に設定する
http://www.usupi.org/sysad/194.html

IPv6 アドレスを手動や自動で設定し、通信できるようになりましたが、 その上の層で、IPv6 をどう扱うかというところまでは、まだ話が進んでおりません。

というわけで、今回もしつこく、IPv6 を取り上げたいと思います。
今回のお題は以下の通りです。

DNS(BIND) における IPv6 の扱い

まずは、DNS です。
DNS といえば、よくも悪しくも BIND がデファクトスタンダードだと思います。 ですので、以降では BIND を使用した DNS の環境が揃っているという前提で、 IPv6 対応をご紹介します。

いつもなら、BIND が入っていなければ以下の手順でパッケージを入れてください、 ということになるのですが、残念ながら、 その後の設定までをご説明することはできません。ごめんなさい。すみません。

  ubuntu# apt-get install bind9  (Debian系の場合)
  fedora# yum install bind       (RedHat系の場合)

 

さて、DNS でホスト名からIPアドレスを得るには、 たとえば以下のように host コマンドなど実行して、 Aレコードを問い合わせればよいです。
(ちなみに、「-t A」は省略できます。)

  $ host -t A www.local.usupi.org
  www.local.usupi.org has address 192.168.1.1

さて、IPv6 アドレスの場合はどうなるかといいますと、 AAAA レコードというものに IPv6 アドレスを記述します。
具体的には、以下のように、ゾーンファイルに追加するだけです。
(場合によっては、SOA レコードのシリアル番号も更新しましょう。)

  www   IN    A       192.168.1.1
        IN    AAAA    fd41:28b7:be11::201:2ff:fe03:405   <= コレ

そして、named を restart もしくは reload して、 オプションの指定をつけずに host コマンドを実行しますと、 IPv4アドレスとIPv6アドレスの両方を教えてくれるようになります。

  $ host www.local.usupi.org
  www.local.usupi.org has address 192.168.1.1
  www.local.usupi.org has IPv6 address fd41:28b7:be11:0:201:2ff:fe03:405

もちろん、「-t AAAA」をつけると、IPv6アドレスだけ教えてくれます。

  $ host -t AAAA www.local.usupi.org
  www.local.usupi.org has IPv6 address fd41:28b7:be11:0:201:2ff:fe03:405

 

逆に、IPアドレスからホスト名を得る場合はどうでしょうか。
IPv4アドレスからホスト名を得るには、PTRレコードを問い合わせます。

  $ host -t PTR 192.168.1.1
  1.1.168.192.in-addr.arpa domain name pointer www.local.usupi.org.

ゾーンファイルには、以下のように記述されていると思います。

  1     IN    PTR     www.local.usupi.org.

IPv6の場合、まず、設定ファイルである「named.conf」に、 ゾーンの設定を追加する必要があります。たとえば以下のように追加します。

  // 既存のIPv4アドレスの逆引きのゾーンの設定
  zone "1.168.192.in-addr.arpa" {
      type master;
      file "db.usupi.rev";
  };

  // 追加するIPv6アドレスの逆引きのゾーンの設定
  zone "0.0.0.0.1.1.e.b.7.b.8.2.1.4.d.f.ip6.arpa" {
      type master;
      file "db.usupi.rev6";
  };

zone の後に指定するドメインは、以下のようにして求めます。

ネットワークアドレスが「fd41:28b7:be11::/64」だとしますと、まず、 これを4ビットずつにわけて「.」でつなぎます。
(ネットワーク部が64ビットなので、4ビット x 16個になります。)

  「f.d.4.1.2.8.b.7.b.e.1.1.0.0.0.0」

そして、これを逆順にして、 逆引きドメイン名である「ip6.arpa」を付加した名前を使用します。

  「0.0.0.0.1.1.e.b.7.b.8.2.1.4.d.f.ip6.arpa」

named.conf に上記を追加したら、ゾーンファイルにも同様に、 ホスト部「201:2ff:fe03:405」を4ビットずつにわけて逆順にしたアドレスを記述します。

  @  IN  SOA  local.usupi.org. root.local.usupi.org. (
      2011022017  ; シリアル番号
      ...中略...
  );
  5.0.4.0.3.0.e.f.f.f.2.0.1.0.2.0  IN  PTR  www.local.usupi.org.

後は、named を restart もしくは reload して、 先ほどと同様の手順でPTRレコードを問い合わせますと、ホスト名が得られます。

  $ host -t PTR fd41:28b7:be11::201:2ff:fe03:0405
  5.0.4.0.3.0.e.f.f.f.2.0.1.0.2.0.0.0.0.0.1.1.e.b.7.b.8.2.1.4.d.f.ip6.arpa \
  domain name pointer www.local.usupi.org.

 

これで IPv6 対応になったぞ! …と言いたいところですが、 問い合わせている DNS サーバがまだ IPv4 ですよね。

「named.conf」に「listen-on-v6」という設定がすでにあれば、 IPv6でも待ち受けてくれます。書式は以下の通りです。

  options {
      listen-on-v6 [port ポート番号] { アドレス; ... };
  };

「port ポート番号」で、待ち受けるポート番号を指定します。
これを省略すると、おなじみの「53」番が用いられます。
「アドレス」には待ち受けるアドレスを指定します。

たとえば、Ubuntu10.10 では、デフォルトで以下の設定が有効です。
ポート番号はデフォルトの53番、アドレスは「any」ですので、 あらゆるところからの要求を受け付けます。
(ちなみに、「/etc/bind/named.conf.options」に書いてあります。)

  options {
      ...中略...
      listen-on-v6 { any; };
  };

Fedora14 には、以下のように設定されています。
ポート番号は同じく53番で、 アドレスは「::1」とループバックアドレスが指定されていますので、 ローカルホストからの要求のみ受け付けます。
(こちらは「/etc/named.conf」に書いてあります。)

  options {
      listen-on-v6 port 53 { ::1; };
      ...中略...
  };

これらの設定でない設定にしたい場合は、適時書き換えてnamedを再起動しましょう。

各種サービスの IPv6 対応

さて、DNS をIPv6対応にしたことで、 長ったらしいIPv6アドレスではなくホスト名でアクセスできるようになりました。

次に、各種サービスがIPv6対応になっているか、確認したいと思います。
で、いまのうちに結論を申し上げますと、 以降で述べるものはみんなすでに IPv6 に対応済です。

 

まずは WWW ということで、Apache をさらっと取り上げます。
「Listen」や「VirtualHost」、「NameVirtualHost」ディレクティブなどでは、 IPv6アドレスを [] で囲って指定します。

  <VirtualHost [fd41:28b7:be11::80]:80>
      ServerName foo.local.usupi.org
      ServerAdmin usu@usupi.org
      DocumentRoot /foo/bar/htdocs
      ...中略...
  </VirtualHost>

「Allow」や「Deny」などのディレクティブでは、[] で囲まずにそのまま指定します。

  <Directory "/foo/bar/htdocs/">
      Order deny,allow
      Deny from all
      Allow from ::1/128 fd41:28b7:be11::/64
  </Directory>

そして、IPv6 でアクセスすると、アクセスログには、 以下のようにIPv6なアドレスが記録されます。

  fd41:28b7:be11::201:2ff:fe03:405 - - [20/Feb/2011:16:10:13 +0900] \
  "GET / HTTP/1.1" 200 384 "-" ...

 

お次は、xinetd です。
サービスの設定の中で、「flags」に「IPv6」が指定されていれば、 IPv6でも待ち受けてくれます。

  service ftp
  {
      disable         = no
      flags           = IPv6    <= コレ
      ...中略...
  }

netstat コマンドで確認できます。
(もちろん、ftp コマンドでIPv6アドレスを指定すると、つながります。)

  $ netstat -an | grep ':21 '
  tcp6      0     0 :::21              :::*                LISTEN

 

SSH はどうでしょうか。
デフォルトでは、IPv4もIPv6もすべて受け付けてくれます。
設定ファイル「sshd_config」の「ListenAddress」 で待ち受けるアドレスを指定できます。
たとえば、以下のように指定しますと、IPv4 はすべて受け付けますが、 IPv6 は「fd41:28b7:be11::1」に対してのみ受け付けます。 ListenAddress 0.0.0.0 ListenAddress fd41:28b7:be11::1

すると、以下はつながりますが、

  $ ssh fd41:28b7:be11::1
  usu@fd41:28b7:be11::1's password: 

実体が同じでも違うアドレスでアクセスすると叱られます。

  $ ssh fd41:28b7:be11::2
  ssh: connect to host fd41:28b7:be11::2 port 22: Connection refused

また、sshdの起動時のオプションで、「-4」をつけて実行するとIPv4のみに、 「-6」をつけて実行するとIPv6のみ受け付けるようになります。

 

他にもいろいろなサービスがありますが、きりがないので、 このくらいで終わりにさせていただきたいと思います。

IPv6 でもアクセス制御

最後に、アクセス制御について触れたいと思います。

「/etc/hosts.allow」や「/etc/hosts.deny」を使って、 特定のサービスを特定の人にだけ許可する、 ということを行われている貴兄も多いのではないかと推測します。

たとえば、「hosts.allow」に以下を記述しておくと、 「192.168.1.*」のホストからのみ chargen サービスを利用できます。

  chargen: 192.168.1.0/24: ALLOW
  chargen: ALL: DENY

IPv6 の場合は、アドレスを [] で囲んで同様に指定します。

  chargen: 192.168.1.0/24: ALLOW
  chargen: [fd41:28b7:be11::]/64: ALLOW    <= コレ
  chargen: ALL: DENY

すると、許可した IPv6 アドレスからアクセスすると、利用できます。

  $ telnet fd41:28b7:be11::1 chargen
  Trying fd41:28b7:be11::1...
  Connected to fd41:28b7:be11::1.
  Escape character is '^]'.
  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ...

試しに、許可していないリンクローカルアドレスを指定しますと、 案の定接続を断たれます。

  $ telnet fe80::201:2ff:fe03:405%eth0 chargen
  Trying fe80::201:2ff:fe03:405%eth0...
  Connected to fe80::201:2ff:fe03:405%eth0.
  Escape character is '^]'.
  Connection closed by foreign host.

syslog には、弾いたよというログがちゃんと残されていました。

  xinetd[PID]: libwrap refused connection to chargen-stream \
  (libwrap=chargen) from fe80::201:2ff:fe03:405%eth0

 

また、パケットフィルタリングに関しては、 IPv6 では ip6tables というもので設定できますが、 紙面の都合?により割愛させていただきます。

おわりに

以上、IPv6 を普通に使うためのもろもろについて、ご紹介しました。

今回いくつか試した限りでは、大半のソフトが、 すでに IPv6 に対応しているようでした。
ですので、IPv6 の環境を整えておけば、 IPv6 への移行もそれほど難しくないのではないでしょうか、という気がいたします。

というわけで、来るべき時のために、 いまのうちから IPv6 に慣れておくとよいのではないでしょうか。

ちなみに、本当は、Feel6 や freenet6 などを使って、 外の IPv6 の世界とつなぐというネタにするつもりでした。
ですが、家庭用のルータごしにトンネルを通す方法がよくわからず、 時間切れとなってしまいました。

つなぐ方法がわかりましたら、そのうちご紹介させていただきます。
(ひょっとすると、いきなり次回になるかもしれませんが…。)

宿題の答え

前回の宿題は、

  RA や DHCPv6 のやりとりを tcpdump などで眺めてみましょう。

でした。

NetworkManager で、 IPv6設定の方式に「自動(Automatic)」という言葉が含まれる選択肢は以下です。

  • 自動(Automatic)
  • 自動、DHCPのみ(Automatic, DHCP only)
  • 自動、アドレスのみ(Automatic, address only)

それぞれに対して、tcpdump でパケットを得て観察したいのですが、 長くなってしまいますので、最初の2つだけ確認してみようと思います。

NetworkManagerアプレットでその設定を選択する前に以下を実行し、 選択してアドレスが決まるまでの間、キャプチャしました。

  # tcpdump -w 出力ファイル名 ip6

まずは、「自動(Automatic)」からです。

  22:51:50.961340 IP6 fe80::20c:29ff:fe26:450d > ff02::16: HBH ICMP6, \
  multicast listener report v2, 1 group record(s), length 28
  22:51:50.961353 IP6 fe80::20c:29ff:fe26:450d > ff02::16: HBH ICMP6, \
  multicast listener report v2, 1 group record(s), length 28
  22:51:52.066305 IP6 :: > ff02::16: HBH ICMP6, multicast listener \
  report v2, 1 group record(s), length 28
  22:51:52.066314 IP6 :: > ff02::16: HBH ICMP6, multicast listener \
  report v2, 1 group record(s), length 28

  22:51:53.035671 IP6 :: > ff02::1:ff26:450d: ICMP6, neighbor \
  solicitation, who has fe80::20c:29ff:fe26:450d, length 24
  22:51:53.035691 IP6 :: > ff02::1:ff26:450d: ICMP6, neighbor \
  solicitation, who has fe80::20c:29ff:fe26:450d, length 24

  22:51:54.038853 IP6 fe80::20c:29ff:fe26:450d > ff02::2: ICMP6, \
  router solicitation, length 16
  22:51:54.038870 IP6 fe80::20c:29ff:fe26:450d > ff02::2: ICMP6, \
  router solicitation, length 16
  22:51:54.039516 IP6 fe80::21f:16ff:fe18:348e > ff02::1: ICMP6, \
  router advertisement, length 56

  22:51:54.306754 IP6 :: > ff02::1:ff26:450d: ICMP6, neighbor \
  solicitation, who has fd41:28b7:be11:0:20c:29ff:fe26:450d, length 24
   22:51:54.306776 IP6 :: > ff02::1:ff26:450d: ICMP6, neighbor \
  solicitation, who has fd41:28b7:be11:0:20c:29ff:fe26:450d, length 24
  ...

最初の「ICMP6, multicast listener report」は、 マルチキャストを受信するために必要なパケットです。

次の「ICMP6, neighbor solicitation」は、前回の宿題で書きましたが、 近隣要請(Neighbor Solicitation)というもので、 MACアドレスを問合せるためのICMPv6のパケットです。(ARPに相当)
自分のリンクローカルアドレス(fe80::20c:29ff:fe26:450d)を問合せるということは、 他に同じアドレスを使っている人がいないか確認をしているということです。 (DAD(Duplicate Address Detection)というそうです。)

そして次が、RA のやりとりです。
まず「router solicitation」でルータに問合せています。
2発送ったところで、ルータから「router advertisement」が返ってきています。 これによりアドレスを自動設定することができます。

ですが、万が一使っているひとがいるかもしれませんので、 先ほどと同様に重複をチェックするための「neighbor solicitation」を、 最後に送信しています。

というわけで、「自動(Automatic)」では、アドレスを RA で設定し、 他の情報を DHCPv6 で設定すると思っていたのですが、 そのようにはなっていないようでした。

 

それでは次に、「自動、DHCPのみ(Automatic, DHCP only)」です。

  22:05:51.062063 IP6 fe80::20c:29ff:fe26:450d.546 > ff02::1:2.547: \
  dhcp6 solicit
  22:05:51.062082 IP6 fe80::20c:29ff:fe26:450d.546 > ff02::1:2.547: \
  dhcp6 solicit

  22:05:51.064957 IP6 fe80::21f:16ff:fe18:348e > ff02::1:ff26:450d: \
  ICMP6, neighbor solicitation, who has fe80::20c:29ff:fe26:450d, \
  length 32
  22:05:51.065321 IP6 fe80::20c:29ff:fe26:450d > fe80::21f:16ff:fe18:348e: \
  ICMP6, neighbor advertisement, tgt is fe80::20c:29ff:fe26:450d, length 32
  22:05:51.065345 IP6 fe80::21f:16ff:fe18:348e.44773 > \
  fe80::20c:29ff:fe26:450d.546: dhcp6 advertise

  22:05:52.086721 IP6 fe80::20c:29ff:fe26:450d.546 > ff02::1:2.547: \
  dhcp6 request
  22:05:52.086743 IP6 fe80::20c:29ff:fe26:450d.546 > ff02::1:2.547: \
  dhcp6 request
  22:05:52.087050 IP6 fe80::21f:16ff:fe18:348e.44773 > \
  fe80::20c:29ff:fe26:450d.546: dhcp6 reply

  22:05:52.327525 IP6 fe80::20c:29ff:fe26:450d > ff02::16: HBH ICMP6, \
  multicast listener report v2, 1 group record(s), length 28
  ...
  22:05:52.329481 IP6 fe80::20c:29ff:fe26:450d > ff02::16: HBH ICMP6, \
  multicast listener report v2, 2 group record(s), length 48

  22:05:53.326328 IP6 :: > ff02::1:ff00:1: ICMP6, neighbor solicitation, \
  who has fd41:28b7:be11:0:fffe::1, length 24
  22:05:53.326347 IP6 :: > ff02::1:ff00:1: ICMP6, neighbor solicitation, \
  who has fd41:28b7:be11:0:fffe::1, length 24
  ...

まずはじめに、ルータの所在を確認するための「dhcp6 solicit」を送信しています。

次に、ルータ(fe80::21f:16ff:fe18:348e)は、 MACアドレスを知るための「ICMP6, neighbor solicitation」を送信します。
「ICMP6, neighbor advertisement」でMACアドレスを教えてもらいましたので、 「dhcp6 advertise」で利用可能であることを示します。

これを受けて、「dhcp6 request」でアドレスなどを要求すると、 「dhcp6 reply」で要求された各種パラメータを送っています。
(すみません、中身については割愛します。)

そして、「ICMP6, multicast listener report」 でマルチキャストを受信するためのパケットを送信します。

最後に、「neighbor solicitation」で重複チェックを行っています。

 

…詳しく見ていくとキリがありませんので、このくらいで終わりにしたいと思います。

今回の宿題

今回の宿題は、

  IPv4アドレスもIPv6アドレスもあるホスト名でアクセスすると、どちら
  が優先されるか確認してみましょう。

です。

DNS で、AレコードもAAAAレコードもあるホスト名を使用すると、 IPv4とIPv6のどちらでアクセスするか、ということです。

クライアントによって異なる、ということも考えられますので、 いくつかのクライアントで確認せねばと思っております。

あとがき

冒頭で、18時の壁について書きましたが、ある日、 仕事が間に合わなくて18時を過ぎてしまい、 残業代のつかない居残りみたいな申請を事後に出す羽目になってしまいました。 (…というか残業できるんじゃん。)

いままでは、お客様と直接やりとりしていたり、実作業者が自分だけ、 というケースが圧倒的に多かったため、お客様の納期に間に合えば、 どんなペースで仕事をしていても許されました。

ですが、いまは、1つの仕事のスパンが短いため、自分の作業が予定通りに進まないと、 その後に作業する方々(いまは見習いなので、私の尻拭いをする方々) に多大なご迷惑をかけてしまいます。

計画を立てて仕事し、 予定が狂ったら即座に連絡してスケジュール調整をしていただくという、 フツーのサラリーマンであれば当たり前のことを、 40歳にもなって学んでいるという次第です。

他にも、いろいろやることがあって時間が足りない!…という状況にあるのですが、 そんな私に耳の痛いページがありましたので、ご紹介します。

あなたが「グズ」な5つの理由 - ライフハックブログKo's Style
http://kosstyle.blog16.fc2.com/blog-entry-1369.html

PRESIDENT誌の要約的なページです。
グズな人(時間管理のできない人)の特徴が、5つほど述べられています。

最後の「肥満である」以外は、けっこう当てはまっているように感じますので、 買ってきて読んで対策を考えねばと思っております。
(もう次の号が出てしまっていますが…。)

 

…というわけで、特にオチはありません。
次回はもう少し落ち着いて書かせていただこうと思います。

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、3月6日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 久しぶりに日々の栗画以外を追加しました。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本