いろいろ研究中です。
備忘録的なものなのであまりあてにしないでください。
Last-Modified: 2003/05/22 08:27
Table of Contents
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
- IPv6パケットのフォワーディングを許可する
- ルータ公告を受け取らない
- ed13のIPv6アドレスのプレフィクスをzzzz:zzzz:zzzz::にする
- ed13のIPv6 anycastアドレスをzzzz:zzzz:zzzz::にする
- トンネルデバイスとしてgif0を使用し,xxx.xxx.xxx.xxxとyyy.yyy.yyy.yyyの間でトンネルを成立させる
- IPv6のデフォルトゲートウェイをgif0にする
- ルータ公告デーモンを起動し,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パッケージ)
インストールは以下の手順で行う。
- アーカイブを展開。
- IPv6を有効にしてconfigureスクリプトの実行。
yourhost% ./configure --enable-netlink --enable-ipv6
usagi linux22カーネルの場合,--enable-ipv6オプションをつけないとIPv6が有効にならないことがある。 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
- ルータ公告を受け取らない
- パケットのリダイレクトを許可する
- パケットの転送を許可する
トンネルの確立
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
パッチの適用
- 以下のアーカイブを用意する。
- apacheのアーカイブを展開し,KAMEプロジェクトのパッチを適用する。
- USAGI用パッチを適用する。
- 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スタック導入
- Windows2000のインストール
- SP1の適用
- IPv6スタックのインストール
- 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用ソケットドライバ。
未評価のため詳細は不明。
