$Id$

%Hd: KAMEと戯れる

o 目次

o IPv6の設定
	FreeBSD4.0以降


o ping6 してみる。

	- ping6 してみる。
		% ping6 -c 1 ::1
		PING6(56=40+8+8 bytes) ::1 --> ::1
		16 bytes from ::1, icmp_seq=0 hlim=64 time=1.128 ms

		--- ::1 ping6 statistics ---
		1 packets transmitted, 1 packets received, 0% packet loss
		round-trip min/avg/max = 1.128/1.128/1.128 ms

		% tcpdump -xnti lo0
		tcpdump: listening on lo0
		::1 > ::1: icmp6: echo request
			 6000 0000 0010 3a40 0000 0000 0000 0000
			 0000 0000 0000 0001 0000 0000 0000 0000
			 0000 0000 0000 0001 8000 9641 a50b 0000
			 bda6 2f37 5688 0100
		::1 > ::1: icmp6: echo reply
			 6000 0000 0010 3a40 0000 0000 0000 0000
			 0000 0000 0000 0001 0000 0000 0000 0000
			 0000 0000 0000 0001 8100 9541 a50b 0000
			 bda6 2f37 5688 0100

		おおぉぉお!


o IPv4 トンネル張って、IPv6 ホスト同士でおしゃべりしてみる。

	ホスト A, B を用意する。IPv6/v4 アドレスをそれぞれ
		A: 3ffe:501:808:5::1/10.0.0.1
		B: 3ffe:501:808:5::2/10.0.0.2
	とすると、
	
	ホスト A 側
	% gifconfig gif0 inet 10.0.0.1 10.0.0.2
	% ifconfig gif0 inet6 3ffe:501:808:5::1 3ffe:501:808:5::2 prefixlen 64

	ホスト B 側
	% gifconfig gif0 inet 10.0.0.2 10.0.0.1
	% ifconfig gif0 inet6 3ffe:501:808:5::2 3ffe:501:808:5::1 prefixlen 64

	ホスト B 側で
	% ftp 3ffe:501:808:5::1
	Connected to 3ffe:501:808:5::1.
	220 A FTP server (Version 6.00) ready.
	Name (3ffe:501:808:5::1:hoge): 

	% tcpdump -nqti ep0
	tcpdump: listening on ep0
	203.178.141.215 > 203.178.141.195: 3ffe:501:808:5::2.1028 > 3ffe:501:808:5::1.21: tcp 0 (encap)
	203.178.141.195 > 203.178.141.215: 3ffe:501:808:5::1.21 > 3ffe:501:808:5::2.1028: tcp 0 (encap)
	203.178.141.215 > 203.178.141.195: 3ffe:501:808:5::2.1028 > 3ffe:501:808:5::1.21: tcp 0 (encap)
	203.178.141.195 > 203.178.141.215: 3ffe:501:808:5::1.21 > 3ffe:501:808:5::2.1028: tcp 55 (encap)
	203.178.141.215 > 203.178.141.195: 3ffe:501:808:5::2.1028 > 3ffe:501:808:5::1.21: tcp 0 (encap)

		おおぉぉお!


o KAME で IPsec してみる

	システムの初期状態
	% sysctl net.inet6.ipsec6
	net.inet6.ipsec6.def_policy: 1		<- ポリシが無い時の動作
	net.inet6.ipsec6.esp_trans_deflev: 1	<- ESP tranport mode が指定された時の default のレベル
	net.inet6.ipsec6.esp_net_deflev: 1	<- ESP tunnel mode が指定された時の default のレベル
	net.inet6.ipsec6.ah_trans_deflev: 1	<- AH tranport mode が指定された時の default のレベル
	net.inet6.ipsec6.ah_net_deflev: 1	<- AH tunnel mode が指定された時の default のレベル
	net.inet6.ipsec6.inbound_call_ike: 0
	net.inet6.ipsec6.ecn: 0

		レベルとは、SAあるなら使うとか、SA 無いとヤダとか。

	# setkey -D
	No SAD entries.

	- localhost で IPsec な ping をしてみる。
		※ICMP reply の policy 注意。

	# setkey -c
	add 127.0.0.1 127.0.0.1 icmp 9999 -p esp -E des-cbc "hogehage" ;
	dump ;
	127.0.0.1/32[0] 127.0.0.1/32[0] icmp 
		esp spi=9999(0x0000270f) replay=0 flags=0x00000000
		E: des-cbc  686f6765 68616765
		state=mature seq=0 pid=3087
		created: May  5 11:17:08 1999   current: May  5 11:17:11 1999
		diff: 3(s)      hard: 0(s)      soft: 0(s)
		last:                           hard: 0(s)      soft: 0(s)
		current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
		allocated: 0    hard: 0 soft: 0
		dir=bi-direction refcnt=0
	^D

	- ping してみる。
	# ping -c 3 127.0.0.1 /dev/null
	# tcpdump -nqti lo0
	127.0.0.1 > 127.0.0.1: icmp: echo request
	127.0.0.1 > 127.0.0.1: icmp: echo reply
		:

	socket または SPDB にポリシが無いので、この状態では IPsec されない。

	- ping にポリシを設定する。
	# ping -P 'ipsec esp/use' -c 3 127.0.0.1
	# tcpdump -nqti lo0
	127.0.0.1 > 127.0.0.1: ESP(spi=9999,seq=0x2)
	127.0.0.1 > 127.0.0.1: icmp: echo reply
		:

	ICMP echo replay のポリシが設定されていないので、帰りは IPsec されない。
	- SPD を設定する。
	# setkey -c
	spdadd 127.0.0.1 127.0.0.1 icmp -P ipsec esp/use ;
	spddump ;
	127.0.0.1/32[0] 127.0.0.1/32[0] icmp 
		ipsec
		esp/use
		seq=0 pid=614
		dir=bi-direction refcnt=0

	さて、
	# ping -P 'ipsec esp/require' -c 3 127.0.0.1
	# tcpdump -nqti lo0
	tcpdump: listening on lo0
	127.0.0.1 > 127.0.0.1: ESP(spi=9999,seq=0x1f)
	127.0.0.1 > 127.0.0.1: ESP(spi=9999,seq=0x20)
		:

	- telnet 127.0.0.1 echo
	# setkey -c
	add 127.0.0.1 127.0.0.1 tcp 9998 -p esp -E des-cbc "hogehage" ;
	spdadd 127.0.0.1 127.0.0.1 tcp -P ipsec esp/use ;
	^D
	% telnet 127.0.0.1 echo

	# tcpdump -nqti lo0
	tcpdump: listening on lo0
	127.0.0.1 > 127.0.0.1: ESP(spi=9998,seq=0x1) (DF)
	127.0.0.1 > 127.0.0.1: ESP(spi=9998,seq=0x2) (DF)
		:

	- ホスト A (10.0.0.1), B (10.0.0.2) で A->B へ telnet した時、
	IP[AH][ESP] してみる。

	ホストA側
	# setkey -c
	add 10.0.0.1 10.0.0.2[23] 7999 -p ah -A hmac-md5 "hogehogehogehoge" ;
	add 10.0.0.1 10.0.0.2[23] 7998 -p esp -E des-cbc "hogehoge" ;
	add 10.0.0.2[23] 10.0.0.1 6999 -p ah -A hmac-md5 "hogehogehogehoge" ;
	add 10.0.0.2[23] 10.0.0.1 6998 -p esp -E des-cbc "hogehoge" ;
	^D
	
	ホストB側
	# setkey -c
	add 10.0.0.1 10.0.0.2[23] 7999 -p ah -A hmac-md5 "hogehogehogehoge" ;
	add 10.0.0.1 10.0.0.2[23] 7998 -p esp -E des-cbc "hogehoge" ;
	add 10.0.0.2[23] 10.0.0.1 6999 -p ah -A hmac-md5 "hogehogehogehoge" ;
	add 10.0.0.2[23] 10.0.0.1 6998 -p esp -E des-cbc "hogehoge" ;
	spdadd 10.0.0.1 10.0.0.2[23] tcp -P ipsec esp/use ah/use ;
	^D

	ホスト A 側で
	% telnet -P 'ipsec esp/require ah/require' 10.0.0.2

	または
	# setkey -c
	spdadd 10.0.0.1 10.0.0.2[23] tcp -P ipsec esp/use ah/use ;
	^D

	すると OK.


o IPv6 ルータで遊ぶ。
	rc.net6 を眺める。

	とりあえず RIPng.
	router で route6d を動かす。
		-A とかで適当にアグリゲートする。

	RA を流すインターフェイスに対して rtadvd を動かす。

	クライアントは一発 rtsol を動かす。
	以上。


o v6 ネットワークにつないでみる。
	悪い事は言いません。
	v6 ネットワークに行く前に ssh, im 位は ports から make しておきましょう。

	v6 ホストを boot するとインターフェイスに link local なアドレスが
	割り振られる。

	%  ifconfig sn0
	sn0: flags=8843 mtu 1500
		inet6 fe80:8::200:86ff:fe05:c2d8 prefixlen 64 
		ether 00:00:86:05:c2:d8 

		何故 8 ?index の割り当て順は?

	% netstat -nrf inet6
	Routing tables

	Internet6:
	Destination                   Gateway                   Flags      Netif Expire
	::1                           ::1                       UH           lo0
	fe80:1::/64                   fe80:1::200:86ff:fe05:c2d8 Uc          gif0
	fe80:1::200:86ff:fe05:c2d8    ::1                       UH           lo0
		(snip)
	fe80:8::/64                   link#8                    UC1          sn0
	ff01::/32                     ::1                       U            lo0
	ff02:1::/32                   fe80:1::200:86ff:fe05:c2d8 UC          gif0
		(snip)
	ff02:8::/32                   link#8                    UC1          sn0

	ホストを v6 ネットワークにつないで、router solicitation を垂れ流すと
	# sysctl -w net.inet6.ip6.forwarding=0
	# sysctl -w net.inet6.ip6.accept_rtadv=1	-> これ絶対忘れる…
	# rtsol sn0

	router advertisment を受けてアドレスと経路が追加される。
	# ifconfig sn0
	sn0: flags=8843 mtu 1500
	        inet6 fe80:8::200:86ff:fe05:c2d8 prefixlen 64 
	        inet 203.178.141.208 netmask 0xffffffe0 broadcast 203.178.141.223
	        inet6 3ffe:501:4819:2000:200:86ff:fe05:c2d8 prefixlen 64 
	        ether 00:00:86:05:c2:d8 

	% netstat -nrf inet6
	Routing tables

	Internet6:
	Destination                   Gateway                   Flags      Netif Expire
	default                       fe80:8::260:97ff:fec2:80bf UGc          sn0
	::1                           ::1                       UH           lo0
	3ffe:501:4819:2000::/64       link#8                    UC1          sn0
	fe80:1::/64                   fe80:1::200:86ff:fe05:c2d8 Uc          gif0
	fe80:1::200:86ff:fe05:c2d8    ::1                       UH           lo0
			(snip)
	fe80:8::/64                   link#8                    UC1          sn0
	fe80:8::260:97ff:fec2:80bf    0:60:97:c2:80:bf          UHL1W        sn0
	fe80:8::5254:ff:fedc:5217     52:54:0:dc:52:17          UHL1W        sn0
	ff01::/32                     ::1                       U            lo0
	ff02:1::/32                   fe80:1::200:86ff:fe05:c2d8 UC          gif0
			(snip)
	ff02:8::/32                   link#8                    UC1          sn0


o v6 ネットワークで v4 ホストと喋りたい。
	setenv GAI aaaa::
	faithd 
	faith aaaa:: on
		kernel に 1 つだけ
	resolver は v4
	security に問題あり

	例えば
	% ./imget --verbose --src=pop/APOP:hoge@hage.net


o V6 ready な HTTP サーバを作る。
	1. KAME パッチ付き apache を用意する。
		FreeBSD は kit/ports/apache13 から。
	2. httpd.conf の Listen ディレクティブに以下を追加。
		Listen :: 80


o KAME boot フロッピを作る。
	方法1
		kit/release の下の README.v6 の通りに作る。

	この通りやってもよいけどディスク喰うので、オリジナルのソースで必要な物だけを展開する。

	方法2
		1. /usr/src/kit, /usr/src/sys はKAME
		2.
		README.v6 の (5) をこれに置き換える。
		sbase	全部
		sbin	sh pwd
		scontrib	cpio
		setc	全部
		sgnu	?
		ssbin	ft newfs fsck mount_nfs
		sshare	?
		ssys	KAMEを使うので必要無い。
		subin	find gzip cpio
		susbin	bad144

	この方法だと make に必要な容量は n MB 。


以下は相当古い情報。 o とりあえず KAME を突っ込んでみる。 注意: PAO-19990405 は 2.2.8-STABLE に対する パッチなので、KAME にパッチを当てるともしかして障害があるかもしれない。 用意する物 FreeBSD 2.x, FreeBSD 3.x, BSD/OS 3.x or NetBSD x やんちゃでも許す人用 ftp://ftp.kame.net/pub/kame/snap そうでない人用 ftp://ftp.kame.net/pub/kame/stable" でも、snap の方がより stable だったりする。:-) ※kit/INSTALL を読めば、さくっと install できるはず。多分きっと。 出来なければ言って下さい。 以下、kame-19990503-fbsd228-snap.tgz のインストール例 最新版は KAME-snapから。 o KAME を使うためのツールを作る これも kit/INSTALL の通り。 kit と sys は同じディレクトリに無いとはまる。 rc.net6 を rc に追加するのを忘れずに。 # cp /usr/local/v6/etc/rc.net6.sample /usr/local/v6/etc/rc.net6 # echo '[ -f /usr/local/v6/etc/rc.net6 ] && sh /usr/local/v6/etc/rc.net6'\ >> /etc/rc.local あと path と MANPATH。