2016年1月7日木曜日

CentOS7でIPv4の優先度をあげる方法

まあ、CentOS7固有の話ではなくLinux全般で同じ話なんですけど。

前置きです。

現時点でIPv6に対応するメリットって皆無、という方も多いでしょうし、使わない機能は殺すのが原則なのでIPv6そのものを無効にしておられる方も多いでしょう。
(無効にするなら
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
を/etc/sysctl.confに追記してsysctl -p。)

むしろ、使わないならリスク管理や計算機資源管理の観点からも積極的に殺すべきです。

ですが、自分のサービスはIPv6に対応する気がさらさらなくても、IPv6しか喋れない相手のサービスを利用するという場合、殺すわけにはいきません。

IPv6が有効になると、何も設定しなければ問答無用でIPv6が優先されます。

通常はそれで問題がない・・・わけがなくて、NGN網の人なんかはそれでご苦労なさってる様子。
それも今回の話と関係があるのですが、今後もNTTを利用することはまずないと思うので措いといて、本題です。

IPv6を常用するわけではない場合、単なる時間の無駄なのでIPv4を優先して利用する設定をしたいと思います。

IPv4を優先する設定ファイルがCentOSではデフォルトでは省かれているので、まずそれを用意します。

設定ファイルはgai.confなので
find /usr/share -print | grep gai.conf
で探すと、CentOS7の場合は
/usr/share/doc/glibc-common-2.17/gai.conf
にありました。
実はこのファイルはすべてコメントアウトされているので何も記述されていない空文と等しいので新規に作ったほうが早いのですが、今回は敢えてこれを雛形とします。

それを/etcにコピーして precedence で検索すると、
# precedence  <mask>   <value>
#    Add another rule to the RFC 3484 precedence table.  See section 2.1
#    and 10.3 in RFC 3484.  The default is:
#
#precedence  ::1/128       50
#precedence  ::/0          40
#precedence  2002::/16     30
#precedence ::/96          20
#precedence ::ffff:0:0/96  10
という定義が引っかかります。
そのすぐ下に
#    For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96  100
と書かれているとおり、IPv4射影アドレスの優先度をあげる=数値を大きくするだけです。
(勿論コメントも外してください)
::/96のほうは互換アドレスですがほっぽっといていいです。

これで新たに起動したプロセスからはこの設定が反映されます。
getaddrinfo()が呼ばれたときに毎回このファイルが更新されていれば反映させるというオプションもこの定義体の前半にあるのですが、
# reload  <yes|no>
#    If set to yes, each getaddrinfo(3) call will check whether this file
#    changed and if necessary reload.  This option should not really be
#    used.  There are possible runtime problems.  The default is no.
と書かれています。

一つ謎なのは、ip addrlabel で優先度が操作できないかと思ったのですが
$ ip addrlabel show
prefix ::1/128 label 0
prefix ::/96 label 3
prefix ::ffff:0.0.0.0/96 label 4
prefix 2001::/32 label 6
prefix 2001:10::/28 label 7
prefix 2002::/16 label 2
prefix fc00::/7 label 5
prefix ::/0 label 1
操作以前に優先度は表示もされない。
$ ip addrlabel help
Usage: ip addrlabel [ list | add | del | flush ] prefix PREFIX [ dev DEV ] [ label LABEL ]
ヘルプを見てもラベルそのものの操作しかできない。

Windowsだと
C:\Users\ayumi>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...
優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::1/128
        40      1  ::/0
        35      4  ::ffff:0:0/96
        30      2  2002::/16
         5      5  2001::/32
         1      3  ::/96
のようにどっちも見えて便利なんですけどねえ。
ま、addrlabelっていうくらいだから当然かな?
その割にはipコマンドには優先度をいじるようなコマンドが用意されていませんが・・・

他にも新しいコマンドでも追加されたのかなあ?

誰のお役に立つかはわかりません。
大抵の通信を伴うプロセスの場合はプロトコルをハナから指定できるし。
WEBアプリを使いたいけどIPv6アドレスがREMOTE_ADDRやREMOTE_HOSTにセットされるのが困るとき・・・くらい・・・?

そんな場合ってあるのかなあ。

1 件のコメント:

  1. 情報ありがとうございます
    非常に助かりました。

    返信削除