[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:56569] Re: squeezeで、ポート80及びポート443において、ipv4とipv6との両方のtcpをListenする方法について



楠根です。

今朝はいいかげんな昔の記憶に頼って適当なことを書いていましたが、
デマを流しっぱなしにしてはよくないので改めて確認しました。
結果として、確認不足で古い情報を元に一部誤ったことを書いてしまっていました。
ごめんなさい。

(2012/09/28 2:06), Satoru Otsubo wrote:
>> Linuxの一般的なIPv6実装では、IPv6 socket は IPv4 も扱うことができます。
>> IPv6 socket で特に制限をかけず all-zero(=[::])で listen している場合、
>> その状態のまま IPv4 接続を受け付けることが可能です。
>>
>> なおこの場合、IPv4 socket はアドレス重複となり同時に待つことはできないので、
>> netstat -an で IPv6 と IPv4 の listen が同時に表示されることはないはずですが、

前回のメールでは以上のように書きました。

標準状態では、IPv6でサーバプロセスが待機しているポートへIPv4接続があった場合、
接続元のIPv4アドレスが kernel 内で IPv4-mapped address と呼ばれるIPv6アドレスに
変換され、IPv6処理部でIPv4接続も擬似的なIPv6接続として処理されます。

ただし、標準状態の動作としてはこの通りですが、
ある時期から IPV6_V6ONLY という socket option が標準で使用できるようになり、
これを使用したサーバプログラムは IPv6 と IPv4 を別に扱うことが可能になります。

<<man 7 ipv6 より一部引用>>
====================================================================
IPV6_V6ONLY (since Linux 2.4.21 and 2.6)
    If  this  flag  is set to true (nonzero), then the socket is re-
    stricted to sending and receiving IPv6 packets  only.   In  this
    case,  an IPv4 and an IPv6 application can bind to a single port
    at the same time.

    If this flag is set to false (zero), then the socket can be used
    to  send  and  receive packets to and from an IPv6 address or an
    IPv4-mapped IPv6 address.

    The argument is a pointer to a boolean value in an integer.

    The default value for this flag is defined by  the  contents  of
    the  file  /proc/sys/net/ipv6/bindv6only.  The default value for
    that file is 0 (false).
====================================================================

さきほどの私のメールの引用部の後には以下のようなことも書きました。

>> 最初のメールで提示されたログでは両方表示されているので違和感があります。

前述の socket option を使用することでそれぞれ別々に listen できるので、

> なお今回また netstat -an を行うと、
> tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
> tcp6       0      0 :::22                   :::*                    LISTEN
> という風に、ポート22は IPv6 と IPv4 の listen が同時に表示されています。
> ポート22の解釈はまた別になるのでしょうか?

このような動作も可能になります。
openssh の source を確認し、実際に使用していることも確認しました。
# openssh-5.5p1 では misc.c の sock_set_v6only() に該当部分があります。


元々の話題にあった apache の場合、
この機能を使うかどうかは build 時の設定で選ぶことができるようですので、
恐らくどこかの更新で build 時の設定が違う package に変わったのでしょう。

サーバコマンドに -V をつけると build 設定が表示されますが、
  -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
のように表示されていれば IPv6 処理中で IPv4 もあわせて処理します。


特定のプログラムに依存しない確認方法としては、
プログラムの起動時に strace コマンドを使用するとシステムコール処理が見えるので、
  setsockopt(4, SOL_IPV6, IPV6_V6ONLY, [1], 4) = 0
等のような表示が含まれているかどうかを調べることでもわかります。
# 必要に応じて -o オプションや -f オプション等も使用するとよいと思います。

netstat の内容等でどちらで動作しているか確認できればよいのですが、
最近の状況をあまりキャッチアップしていなかったので、
その点についてはあまり情報を持っていません。ごめんなさい。
--
Takeshi Kusune <kusune@xxxxxxxxxxxxxx>