いろいろ研究中です。
備忘録的なものなのであまりあてにしないでください。

Last-Modified: 2003/05/22 08:27

ObsoleteIPv6NetworkingFreeBSDLinuxWindowsApache

FreeBSDでのIPv6の設定

4.0-RELEASE以降ならKAME Projectの成果がマージされているので,基本的に設定だけでいいはず。

/etc/rc.confに設定を書き込んだ場合,IPv6関連の設定は,/etc/rc.networkの実行後,/etc/rc.network6でおこなわれる。

ホストになる場合の設定

コマンドラインから設定する場合

yourhost# sysctl -w net.inet6.ip6.accept_rtadv=1
net.inet6.ip6.accept_rtadv: 0 -> 1
yourhost# rtsol ed1

/etc/rc.confに書く場合

ipv6_enable="YES"
IPv6対応のルータが同一セグメントにありルータ公告が有効になっている場合には,上記設定で自動的に必要な情報をルータから取得する。

IPv6 over IPv4トンネルルータになる場合の設定

IPv6 over IPv4トンネルでIPv6接続を確立し,自サイトはフラットな構成(ルータと同一セグメントに全ての機器がある)の場合,NICは1枚でよい。

カーネルの準備

トンネリング用ディバイスとしてgifインターフェースが必要。(GENERICではgif0〜gif3が有効)

pseudo-device   gif     16      # IPv6 and IPv4 tunneling

数は適当に。

パケットフィルタリングを行いたいなら,bpf仮想ディバイスを無効にして

#
# for ipf
#
options IPFILTER
options IPFILTER_LOG
options IPFILTER_DEFAULT_BLOCK

#
# for ip6fw
#
options IPV6FIREWALL

を追加。(ipfとip6fwはどちらか一方で良いだろう。)
klm(カーネルローダブルモジュール)にするならこれらのoptionはいらんかも。
ただし,klmだとフィルタのenable/disableを動的に切替えられない。(このあたり詳細を調査中)

なお4.2-RELEASEまでのipfw/ip6fwはestablishedなパケットの評価ルーチンに穴があるので必ずupdateすること。

設定

ルータにするマシンのネットワークIFをed13,ed13のIPv4アドレスをxxx.xxx.xxx.xxx,トンネル先のアドレスをyyy.yyy.yyy.yyy,自サイトに割り当てられたIPv6アドレス空間をzzzz:zzzz:zzzz::/48とする。また静的ルーチングを行うものとする。

コマンドラインから設定する場合
yourhost# sysctl -w net.inet6.ip6.forwarding=1
net.inet6.ip6.forwarding: 0 -> 1
yourhost# sysctl -w net.inet6.ip6.accept_rtadv=0
net.inet6.ip6.accept_rtadv: 0 -> 0
yourhost# prefix ed13 zzzz:zzzz:zzzz::
yourhost# ifconfig ed13 inet6 zzzz:zzzz:zzzz:: anycast
yourhost# gifconfig gif0 xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy
yourhost# route add -inet6 default -interface gif0
yourhost# rtadvd ed13
  1. IPv6パケットのフォワーディングを許可する
  2. ルータ公告を受け取らない
  3. ed13のIPv6アドレスのプレフィクスをzzzz:zzzz:zzzz::にする
  4. ed13のIPv6 anycastアドレスをzzzz:zzzz:zzzz::にする
  5. トンネルデバイスとしてgif0を使用し,xxx.xxx.xxx.xxxとyyy.yyy.yyy.yyyの間でトンネルを成立させる
  6. IPv6のデフォルトゲートウェイをgif0にする
  7. ルータ公告デーモンを起動し,ed13からルータ公告を流す
/etc/rc.confに書く場合
ipv6_enable="YES"
ipv6_gateway_enable="YES"
ipv6_static_routes="default"
ipv6_router_enable="NO"
ipv6_route_default="default -interface gif0"
ipv6_network_interfaces="ed13"
ipv6_prefix_ed13="zzzz:zzzz:zzzz::"
rtadvd_interfaces="ed13"
#
gif_interfaces="gif0"
gifconfig_gif0="xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy"

PC-9821Na12+Melco LPC2-TにFreeBSD(98)-4.3Rという組合せで試した場合,PCカードの設定が済む前に/etc/rc.network6が実行されてしまい,/etc/rc.confに書いたgifインターフェースの設定などが反映されない。(ただし設定ミスの可能性大)
このため,「コマンドラインから設定する場合」の内容を/etc/rc.localに書いている。

参考サイト

LinuxへのUSAGIの導入

準備

Linux標準のIPv6スタックは実装が古かったりいい加減だったりするので,USAGI ProjectからパッチなりSNAPSHOTなりを取って来ること。(Kernel 2.4.4からはUSAGIの成果がマージされている。)
debやrpmなバイナリパッケージもあるが,こちらは更新が半年に一度程度なので,必要な機能が実装されているか検討すること。

とりあえずパッケージ管理システムのことなど気にせず,使用したいkernelのバージョンにあった最新のSNAP(パッチ適応済カーネルソース,netkit,netbaseなどのユーザーランドを含む)を取って来てbuildしてみる。

アーカイブの展開

~/tmp/以下で作業することにする。

yourhost$ cd ~/tmp/
yourhost$ bzip2 -cd usagi-2001XXXX.tar.bz2 | tar xvf -

カーネルのbuild

yourhost$ cd ~/tmp/usagi
yourhost$ make prepare
yourhost$ cd kernel
yourhost$ cd linux22
yourhost$ make mrproper
yourhost$ make menuconfig

2.4.x系列の場合はcd linux24

Kernel 2.2.x系列でIPv6を使用するための必要最小限のconfig

Code maturity level options  --->
 [*] Prompt for development and/or incomplete code/drivers  

Networking options  --->
 <*>   The IPv6 protocol (EXPERIMENTAL)

 [*]     IPv6: drop packets with fake ipv4-mapped address(es)  
   *CONFIG_IPV6_DROP_FAKE_V4MAPPED

 [*]     IPv6: ignore too small Valid Lifetime for Address Autoconfiguration
   *CONFIG_IPV6_ACONF_MIN_VALID_LFT

ドキュメントによるとIPv6プロトコルはモジュールにしない方が良いとのこと。

yourhost$ make dep;make bzImage; make modules
yourhost$ sudo make install
yourhost$ sudo make modules_install 

あとはてけとーに,liloとかgrubの設定。
make installの最中にブートフロッピーをつくるか? とか聞いて来て[N]と答えるとエラー終了するが,これは無視して可。

ユーザーランドのbuild

yourhost$ cd ~/tmp/usagi/usagi
yourhost$ ./configure
yourhost$ make
yourhost$ sudo make install

デフォルトでは/usr/local/v6以下にインストールされる。気に食わないときは./configure --prefix=/usr/localなど。

ヘッダファイルのインストール

yourhost$ cd /usr
yourhost$ sudo tar cvzf include.orig.tar.gz include
yourhost$ cd ~/tmp/usagi/usagi
yourhost$ sudo make install-includes

以上が終了したら新しいカーネルでリブート。

ホストになる場合の設定

特になにもなし。
SNAPSHOT 20010611ではKAMEのルータ公告を正常に拾い,必要な設定を自動的におこなえている。

ルータになる場合の設定

IPv4, IPv6混在環境化で使用するIPv4 NATルータ兼IPv6ルータを作ってみる。以下では,eth0を上流側(ルータ公告を取れるインターフェース),eth1を下流側(ルータ公告を取れないインターフェース)とし,上流側のネットワークプレフィクスをzzzz:zzzz:zzzz:0:/64, 下流側のネットワークプレフィクスをzzzz:zzzz:zzzz:1:/64と仮定する。

カーネルの準備

IP Masquerade,IPv6関連の他,後述のZebraを正常に利用するため

CONFIG_NETLINK=y
CONFIG_RTNETLINK=y
CONFIG_NETLINK_DEV=m|y
CONFIG_IP_MULTICAST=y

の設定が必要(zebra-0.92aではprocfsを使用してIPv6関連のルーティングテーブルを正常に取得することができない)。ただしZebraでIPv4のルーティングを行わない場合はCONFIG_IP_MULTICAST=yは不要。
また,ZebraをIPv6対応にするためにusagi付属のヘッダファイルを必ずインストールしておくこと。

ネットワークインターフェースの設定

新しいカーネルでリブートしたらeth0のIPv6アドレスはルータ公告を受け取って自動設定できているはず。
eth1については公告してくれるデーモンがいないので

yourhost# ifconfig eth1 add zzzz:zzzz:zzzz:1::1/64

などと設定する。このアドレスが気持悪いときはネットワークプレフィクスとリンクローカルアドレスの下位64bitからアドレスを合成する。
なおプレフィクス長の指定を忘れると正常にルーティングテーブルが構築できないので注意が必要。
両端のホストにping6が通ることを確認の後,IPv6のforwardingを有効にしてとりあえず終了。

yourhost# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

IPv4の設定はてけとーに。

Zebraのインストール

usagiにはIPv6用ルーティングデーモンが含まれないため,動的ルーティングにはZebraを使用する。(i386 glibc2.1用RPMパッケージ)

インストールは以下の手順で行う。

  1. アーカイブを展開。
  2. IPv6を有効にしてconfigureスクリプトの実行。
    yourhost% ./configure --enable-netlink --enable-ipv6
    
    usagi linux22カーネルの場合,--enable-ipv6オプションをつけないとIPv6が有効にならないことがある。
  3. yourhost% make;sudo make install
    

デフォルトでは/usr/local以下にインストールされる。気に食わないときは./configure --prefix=/usr --sysconfdir=/etc/zebra --enable-netlink --enable-ipv6など。
とりあえず使うだけならサンプルの設定ファイルをそのままcopyすれば可。

yourhost# cd /usr/local/etc
yourhost# cp zebra.conf.sample zebra.conf
yourhost# cp ripngd.conf.sample ripngd.conf
yourhost# /usr/local/sbin/zebra --daemon
yourhost# /usr/local/sbin/ripngd --daemon

アクセス制限をしたい場合にはzebra.conf,ripngd.confに

!
access-list localhost permit 127.0.0.1/32
!
ipv6 access-list localhost permit ::1/128
!
line vty
 access-class localhost
 exec-timeout 600 0
!

など。(上記の例ではローカルホストからの接続を許可するlocalhostというaclを作成。)

LinuxのIPv6対応ルーチンはパケットフォワーディングの際デフォルトルートを無視するので全グローバルスコープアドレスが所属する2000::/3をダミーの経路として入れておく。

yourhost% telnet localhost 2601
Trying 127.0.0.1
Connected to localhost.
Escape character is '^]'.

Hello, this is zebra (version 0.92a).
Copyright 1996-2001 Kunihiro Ishiguro.


User Access Verification

Password: 
zebra> en
Password: 
zebra# conf term
zebra(config)# ipv6 route add 2000::/3 デフォルトゲートウェイ
zebra(config)# wr mem
zebra(config)# end
zebra# dis
zebra> exit

radvdの設定

eth1側のネットワークにルータ公告を流すためradvdを利用する。
eth0側にルータ公告が流れないよう,設定ファイル/usr/local/etc/radvd.confに

interface eth1
{
   AdvSendAdvert on;
   prefix zzzz:zzzz:zzzz:1::0/64
   {
      AdvOnLink on;
      AdvAutonomous on;
   };
};

と記述し,radvdを起動する。

IPv6 over IPv4トンネルルータになる場合の設定

ISP側のトンネルルータアドレスをyyy.yyy.yyy.yyy,配付されるネットワークアドレスをzzzz:zzzz:zzzz::/48と仮定して設定を行う。
なおUSAGI, Zebraなどの準備はできているものとする。

IPv6パケット転送のポリシー設定

IPv6のパケット転送関係のポリシーを/proc/sys/net/ipv6/conf/all/以下に設定する。

yourhost# echo 0 > /proc/sys/net/ipv6/conf/all/accept_ra
yourhost# echo 1 > /proc/sys/net/ipv6/conf/all/accept_redirects
yourhost# echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
  1. ルータ公告を受け取らない
  2. パケットのリダイレクトを許可する
  3. パケットの転送を許可する

トンネルの確立

LinuxではIPv6-IPv4トンネリングデバイスとしてsitデバイスが用意されているのでこれを使用する。
相手側のトンネルの出口のIPv4アドレスがyyy.yyy.yyy.yyyの場合には

yourhost# ifconfig sit0 mtu 1280
yourhost# ifconfig sit0 tunnel ::yyy.yyy.yyy.yyy
yourhost# ifconfig sit1 mtu 1280
yourhost# ifconfig sit1 up

ここでは相手側が*BSD系OSと仮定。相手側がLinuxの場合にはMTUの調整は不要。

sitデバイスは特殊なデバイスであり,トンネル先の設定は常にsit0に対して行い,実際の通信にはトンネルの接続先に応じ作成されたsit[n]デバイスを用いるようになる。

kernel-2.4.x系列のusagi kernelを使う場合には,usagiユーザーランドに含まれるiptunnelを用いて

yourhost# /usr/local/v6/sbin/iptuunel add sit1 mode ipip\
> remote yyy.yyy.yyy.yyy local xxx.xxx.xxx.xxx
yourhost# ifconfig sit1 up
yourhost# ifconfig sit1 mtu 1280

のように行う。(2003/5/22追記)

トンネル確立の確認は

yourhost# /usr/local/v6/bin/ping6 -I sit1 ff02::/1

で返事が二つずつ帰って来ればOK。

ethデバイスの設定

ルータ公告は取れないので各ethデバイスへのIPv6アドレス割り付けは手動で行う。アドレスは適当に。

yourhost# ifconfig eth0 add zzzz:zzzz:zzzz:zzzz::1/64
yourhost# /usr/local/v6/bin/ping6 zzzz:zzzz:zzzz:zzzz::1

で返事が帰って来ればOK。

静的経路の設定

Zebraなどのルーティングデーモンを動かさないときはrouteコマンドで静的経路を指定しておく。

yourhost# route -A inet6 add zzzz:zzzz:zzzz:zzzz::/48 dev eth1
yourhost# route -A inet6 add 2000::/3 dev sit1

デフォルトルートは2000::/3で指定すること。

あとはてけとーにradvdの設定など。

参考サイト

USAGIでIPv6用apacheとIPv4用apacheを同一ポートに共存させる

2001年7月17日以降のUSAGIカーネルではCONFIG_IPV6_DOUBLE_BINDがデフォルトで有効になっている。
また,2002年10月4日以降のUSAGI-linux24ではソケットオプションIPV6_V6ONLYをsysctlでセットできるため,apacheにパッチをあてる必要もない。

USAGI環境下でKAMEパッチを用いてIPv6化したapacheを使用すると,IPv6で指定したポートをIPv4でも使おうとしてしまい,そのままではIPv4で別のapacheが動いている場合等ではエラーとなって起動できない。
IPv6のみでListenする場合にはソケットオプションにIPV6_V6ONLYをセットするためのパッチが必要となる。

なお,ひとつのapacheでIPv4, IPv6の両方を同一ポートでListenする場合には,KAMEパッチのあたったapacheを用意し,httpd.confに

Listen :: 80
#Listen 0.0.0.0 80

と記述するだけで良い。(IPv4のListenはコメントアウトすること。)

kernelの準備

CONFIG_IPV6_DOUBLE_BINDを有効にしたカーネルを作成する。

  [*]     IPv6: allow binding ipv6/ipv4 sockets on the same port
    *CONFIG_IPV6_DOUBLE_BIND

パッチの適用

  1. 以下のアーカイブを用意する。
  2. apacheのアーカイブを展開し,KAMEプロジェクトのパッチを適用する。
  3. USAGI用パッチを適用する。
  4. sh configure.v6のあとmake;make install

httpd.confの編集

IPv6でのみListenするようにする。

Listen :: 80
#Listen 0.0.0.0 80

IPv4,IPv6ともにListenしたい場合は

Listen :: 80
Listen 0.0.0.0 80

でよいはずだが,動作確認をしていない。
冒頭の方法で素直にKAMEパッチのみで動作させた方が良いかも知れない。

動作確認

適当なIPv6対応Webブラウザ,もしくはtelnet ::1 80 で動作確認。

Windows2000でのIPv6スタック導入

  1. Windows2000のインストール
  2. SP1の適用
  3. IPv6スタックのインストール
  4. SP2の適用

先にSP2をあててしまった場合にはsetup /xでアーカイブを展開し,出て来たhotfix.infの

NtServicePackVersion=256

という行を

NtServicePackVersion=512

に修正してからhotfix.exeを実行するとよい。

Win2KのリゾルバはIPv6スタックをいれてもIPv6を喋ってくれないので,名前解決のためにIPv4が必須。

設定項目が何も見当たらない。ルータ公告を取れないときはどうしたら良いのか調査中。

Windows95/98/MeでIPv6をつかう

日立 Toolnet6 (FreeSoft)
アプリケーションレベルで動くプロトコル変換ソフトウェア。
未評価のため詳細は不明。
Trumpet Winsock v5.0 ($30/ユーザー, 2.0, 2.1, 3.0からのアップグレードは$15/ユーザー)
Win95/98/NT用ソケットドライバ。
未評価のため詳細は不明。