Network Users' Group ``wheel'' / Dai ISHIJIMA's Page / RTシリーズルータ /
中小サイトのIPv6
| はじめに | ネットワーク構成 | IPv6アドレス割り当て | ルータの設定 | 設定のポリシー | ip6fw(ipfw)の設定 | 関連リンク |

初版: 2010-01-21
最終更新日: 2010-01-21


中小サイトのためのIPv6設定事例

〜 YAMAHA RTXシリーズとFreeBSD boxのIPv6設定 〜
あなたは ec2-3-137-170-76.us-east-2.compute.amazonaws.com (3.137.170.76) から
IPv4 でアクセスしています。

☆はじめに

このページでは中小規模サイトにおけるIPv6利用の実践事例として、 YAMAHA RTX1100とFreeBSD boxでの設定を紹介します。

このページを書いている時点(2010年初め)においても、 IPv4アドレスの枯渇問題がたびたび話題となっています。 とはいえ、当サイトのウェブサーバへのアクセスログや メールのログを見ても、ログ全体に占めるIPv6の割合は少なく (識者から聞いた話では、当サイトは多い方らしいですが)、 IPv6の利用が順調に進んでいるとは思えない状況にあります。

IPv6を使ってみるには、先人の事例をまねるのがよいと思います。 その一方で、事例紹介などは非常に少ないとの印象を受けました。 概念的に「こうしたらええんちゃうの」程度の話はあっても、 具体的に「こうしてみました」的なものは、 まだまだ充実していないのかもしれません。

IPv6の利用が広がらないから事例紹介が少ないのか、 逆に事例紹介が少ないから利用が広がらないのかよくわかりません。 このページが「IPv6を利用してみたい」という方々の参考になれば とてもうれしいです。


☆ネットワーク構成図

本ページで想定しているネットワークは以下のとおりです。 なお、当サイトがこのようなネットワーク構成である というわけではありません。
	  Internet
	      |
	      | FTTH or ADSL, PPPoE
	      |
	  +-------+ (LAN2[WAN])
	  |RTX1100|
	  +-------+ (LAN1[LAN])
	      |AAA.BBB.CCC.1/29
	      |
	  +------+        AAA.BBB.CCC.0/29 (DMZ)
          |SW HUB|---------------------------+------------
	  +------+                           |
	      |                              |AAA.BBB.CCC.2/29
              |                        +-------------+
         [em0]|AAA.BBB.CCC.3/29        |DNS, WWW, MTA|
	+-----------+                  +-------------+
        |FreeBSD box|↑natd/ipfw
	+-----------+  
	[bge0]|192.168.1.1/24
	      |
	   +------+    192.168.1.0/24
           |SW HUB|--------------------
	   +------+
              |
              |192.168.1.254/24
         +----------+
         |          |192.168.2.254/24
         |Layer-3 SW|----------------------192.168.2.0/24
         |          |
         +----------+
              |192.168.3.254/24
              |
        192.168.3.0/24
図だけではわかりにくいかもしれませんので、以下に補足事項を示します。


☆IPv6アドレスの割り当て

プロバイダのIPv6サービスを利用する場合、 「2001:XXXX:YYYY::/48」というアドレスを割り当ててもらえるようです。 つまり、2^80という広大なIPv6アドレス空間を利用することが できるようになります。 中小規模のサイトでこんなにあっても困るよなぁ、という気がしないでもないです。 まぁ、もらえるものは素直にもらっておきましょう。

次は、 割り当ててもらった広大なIPv6アドレス空間を どのように利用するかを考えます。 今回はあまり凝ったことはしないで、 上図のネットワークの各ネットワークを/64ごとに区切って使うことにします。 たとえば、

とします。

このようにしておくと、 /49単位で(IPv4でNATで区切っていたように) 大きく二つのネットワークに分離しておくことが容易になるでしょう。

各ノード(ホスト、サーバなど)に割り当てるIPv6アドレスは、 上にあげたプレフィックスを利用し、 下位16ビットの値を、IPv4アドレスの4オクテットと同じにします。 例:


☆ルータの設定例・IPv4およびIPv6アドレス

	ip route default gateway pp 1
	ip filter source-route on
	ip filter directed-broadcast on
	ipv6 route default gateway tunnel 1
	ipv6 route 2001:XXXX:YYYY:8000::/49 gateway 2001:XXXX:YYYY::3%1
	ipv6 prefix 1 2001:XXXX:YYYY::/49
	ip lan1 address AAA.BBB.CCC.1/29
	ip lan1 rip send off
	ipv6 lan1 address 2001:XXXX:YYYY::1/49
	ipv6 lan1 rtadv send 1


☆ルータの設定例・トンネル接続

プロバイダが用意しているIPv6サービスはいろいろありますが、 ここでは「トンネル接続」を利用しています。 トンネルの向こう側のIPアドレスを PPP.QQQ.RRR.SSS とします。
	tunnel select 1
	 tunnel encapsulation ipip
	 tunnel endpoint address AAA.BBB.CCC.1 PPP.QQQ.RRR.SSS
	 tunnel enable 1


☆ルータの設定・IPv6 over IPv4を使うためのIPv4フィルタ

	pp select 1
	 ip pp secure filter in 1000 … 4000 … 4999
	…
	ip filter 1000 reject AAA.BBB.CCC.0/29 * * * *
	…
	ip filter 4000 pass PPP.QQQ.RRR.SSS AAA.BBB.CCC.1 ipv6 * *
	…
	ip filter 4999 reject * * * * *


☆設定のポリシー

IPv6パケットフィルタの設定においては、 その利用場所において何が必要で何が不要かを整理しておくことが大切です。 このページでは という状況を想定したフィルタ設定を紹介しています。


☆ルータの設定・IPv6のパケットフィルタの例

	tunnel select 1
	 ipv6 tunnel secure filter in 1000 1100 1110 1200 1210 1220 1230
	 1500 1510 1520 1530 1540 1550 1560 1570 1580 1590
	 1600 1610 1620 1630 1700 1710 5000 5010 5100 5110 5200 5210
	 2000 2100 2200 2300 2310 2400 2500 2510 3000 3100 3200 4999
	 ipv6 tunnel secure filter out 1010 1100 1110 1200 1210 1220 1230
	 1500 1510 1520 1530 1540 1550 1560 1570 1580 1590
	 1600 1610 1620 1630 1700 1710 5000 5010 5100 5110 5200 5210 9999
	…
	ipv6 filter 1000 reject 2001:XXXX:YYYY::/48 * * * *
	ipv6 filter 1010 reject * 2001:XXXX:YYYY::/48 * * *
	ipv6 filter 1100 reject ::1 * * * *
	ipv6 filter 1110 reject * ::1 * * *
	ipv6 filter 1200 reject fc00::/7 * * * *
	ipv6 filter 1210 reject * fc00::/7 * * *
	ipv6 filter 1220 reject fec0::/10 * * * *
	ipv6 filter 1230 reject * fec0::/10 * * *
	ipv6 filter 1500 reject 2002:e000::/20 * * * *
	ipv6 filter 1510 reject * 2002:e000::/20 * * *
	ipv6 filter 1520 reject 2002:7f00::/24 * * * *
	ipv6 filter 1530 reject * 2002:7f00::/24 * * *
	ipv6 filter 1540 reject 2002::/24 * * * *
	ipv6 filter 1550 reject * 2002::/24 * * *
	ipv6 filter 1560 reject 2002:ff00::/24 * * * *
	ipv6 filter 1570 reject * 2002:ff00::/24 * * *
	ipv6 filter 1580 reject 2002:a00::/24 * * * *
	ipv6 filter 1590 reject * 2002:a00::/24 * * *
	ipv6 filter 1600 reject 2002:c0a8::/32 * * * *
	ipv6 filter 1610 reject * 2002:c0a8::/32 * * *
	ipv6 filter 1620 reject 2002:c0a8::/32 * * * *
	ipv6 filter 1630 reject * 2002:c0a8::/32 * * *
	ipv6 filter 1700 reject ff05::/16 * * * *
	ipv6 filter 1710 reject * ff05::/16 * * *
	ipv6 filter 2000 pass * 2001:XXXX:YYYY::/48 icmp6 * *
	ipv6 filter 2100 pass * 2001:XXXX:YYYY::/48 established * *
	ipv6 filter 2200 pass * 2001:XXXX:YYYY::/48 udp domain *
	ipv6 filter 2300 pass * 2001:XXXX:YYYY::/48 tcp ftpdata *
	ipv6 filter 2310 pass * 2001:XXXX:YYYY::/48 tcp,udp * 49150-65535
	ipv6 filter 2400 pass * 2001:XXXX:YYYY::/49 udp * 33400-33500
	ipv6 filter 2500 pass * 2001:XXXX:YYYY::/48 tcp,udp ntp *
	ipv6 filter 2510 pass * 2001:XXXX:YYYY::/48 tcp,udp * ntp
	ipv6 filter 3000 pass * 2001:XXXX:YYYY::/49 tcp * ftpdata-21,22,telnet
	ipv6 filter 3100 pass * 2001:XXXX:YYYY::/49 tcp * smtp,domain,ident
	ipv6 filter 3200 pass * 2001:XXXX:YYYY::/49 tcp * www
	ipv6 filter 4999 reject * * * * *
	ipv6 filter 5000 reject * * udp,tcp 135 *
	ipv6 filter 5010 reject * * udp,tcp * 135
	ipv6 filter 5100 reject * * udp,tcp netbios_ns-netbios_ssn *
	ipv6 filter 5110 reject * * udp,tcp * netbios_ns-netbios_ssn
	ipv6 filter 5200 reject * * udp,tcp 445 *
	ipv6 filter 5210 reject * * udp,tcp * 445
	ipv6 filter 8000 pass fe80::/10 ff02::9 udp 521 521
	ipv6 filter 9999 pass * * * * *


☆ルータでのフィルタのちょっとした解説


☆FreeBSD boxの設定・/etc/rc.confの例

※FreeBSD 7.x以降は ipfw/ip6fw が統合され、書式が変わっています。
	# internal network
	iif="bge0"
	iip="192.168.1.1"
	inet="192.168.1.0"
	imask="255.255.255.0"
	ibits="24"
	ifconfig_bge0="inet ${iip} netmask ${imask}"
	intnet="192.168.0.0/16"

	# external network
	oif="em0"
	oip="AAA.BBB.CCC.3"
	onet="AAA.BBB.CCC.0"
	omask="255.255.255.248"
	obits="29"
	ifconfig_em0="inet ${oip} netmask ${omask}"
	dmznet="AAA.BBB.CCC.0/29"

	# routings
	defaultrouter="AAA.BBB.CCC.1"
	static_routes="in"
	route_in="-net ${intnet} 192.168.1.254"

	# firewall
	firewall_enable="YES"
	firewall_type="MYSIMPLE"
	firewall_quiet="YES"
	firewall_logging="YES"

	gateway_enable="YES"

	# IPv6
	ipv6_enable="YES"
	ipv6_prefix="2001:XXXX:YYYY"
	ipv6_prefixlen="48"

	ipv6_oprefix="${ipv6_prefix}:0000"
	ipv6_oprefixlen="49"
	ipv6_iprefix="${ipv6_prefix}:8000"
	ipv6_iprefixlen="49"

	ipv6_myoprefix="${ipv6_prefix}:0000"
	ipv6_myoprefixlen="64"
	ipv6_myoaddress="${ipv6_myoprefix}::3"

	ipv6_myiprefix="${ipv6_prefix}:a000"
	ipv6_myiprefixlen="64"
	ipv6_myiaddress="${ipv6_myiprefix}::1"

	ipv6_network_interfaces="bge0 em0"
	ipv6_ifconfig_em0="${ipv6_myoaddress} prefixlen ${ipv6_myoprefixlen}"
	ipv6_ifconfig_bge0="${ipv6_myiaddress} prefixlen ${ipv6_myiprefixlen}"

	# routings
	ipv6_defaultrouter="${ipv6_oprefix}::1"
	ipv6_static_routes="in"
	ipv6_route_in="${ipv6_iprefix}::/${ipv6_iprefixlen} ${ipv6_myiprefix}::254"

	# firewall
	ipv6_firewall_enable="YES"
	ipv6_firewall_type="MYSIMPLE"
	ipv6_firewall_quiet="YES"
	ipv6_firewall_logging="YES"

	ipv6_gateway_enable="YES"


☆FreeBSD boxの設定・/etc/rc.firewall6の例

基本は元からある rc.firewall6 です。一部抜粋を以下に示します。
    [Mm][Yy][Ss][Ii][Mm][Pp][Ll][Ee])
	############
	# $ipv6_firewall_type = "SIMPLE" から若干修正しました
	############

	#
	# MYSIMPLE
	#

	################################################################
	# シェル変数は rc.conf での設定を引き継ぎます
	################################################################

	# ------------------------------------------------------------ #
	# 外側のインターフェイスに関する情報
	# ------------------------------------------------------------ #
	# 外全体
	onet="${ipv6_oprefix}::"
	oprefixlen="${ipv6_oprefixlen}"
	outnet="${onet}/${ipv6_oprefixlen}"
	# 公開セグメント
	oip="${ipv6_myoaddress}"
	dmznet="${ipv6_myoprefix}::/${ipv6_myoprefixlen}"

	# ------------------------------------------------------------ #
	# 内側のインターフェイスに関する情報
	# ------------------------------------------------------------ #
	inet="${ipv6_iprefix}::"
	iprefixlen="${ipv6_iprefixlen}"
	intnet="${inet}/${ipv6_iprefixlen}"
	iip="${ipv6_myiaddress}"

	################################################################
	# ループバックその他 local の設定
	################################################################
	setup_local

	################################################################
	# スプーフィング (spoofing) を止める
	################################################################

	# ------------------------------------------------------------ #
	# スプーフィング (stop spoofing, 以下 /etc/rcfirewall デフォルト設定)
	# ------------------------------------------------------------ #
	${fw6cmd} add deny log all from ${intnet} to any in via ${oif}
	${fw6cmd} add deny log all from ${outnet} to any in via ${iif}

	# ------------------------------------------------------------ #
	# ローカルユニキャスト (local unicast) が外に出ないように
	# ------------------------------------------------------------ #
	${fw6cmd} add deny log all from fc00::/7 to any via ${oif}
	${fw6cmd} add deny log all from any to fc00::/7 via ${oif}

	# ------------------------------------------------------------ #
	# サイトローカル (site-local) が出て行かないように
	# DMZもサイトローカル内というポリシーならルータで切ってもいい
	# ------------------------------------------------------------ #
	${fw6cmd} add deny log all from fec0::/10 to any via ${oif}
	${fw6cmd} add deny log all from any to fec0::/10 via ${oif}

	# ------------------------------------------------------------ #
	# v4射影アドレスも出さない (/etc/rcfirewall デフォルト設定)
	# ------------------------------------------------------------ #
	${fw6cmd} add deny log all from ::ffff:0.0.0.0/96 to any via ${oif}
	${fw6cmd} add deny log all from any to ::ffff:0.0.0.0/96 via ${oif}

	# ------------------------------------------------------------ #
	# これもいらない…はず (/etc/rcfirewall デフォルト設定)
	# ------------------------------------------------------------ #
	${fw6cmd} add deny log all from ::224.0.0.0/100 to any via ${oif}
	${fw6cmd} add deny log all from any to ::224.0.0.0/100 via ${oif}
	${fw6cmd} add deny log all from ::127.0.0.0/104 to any via ${oif}
	${fw6cmd} add deny log all from any to ::127.0.0.0/104 via ${oif}
	${fw6cmd} add deny log all from ::0.0.0.0/104 to any via ${oif}
	${fw6cmd} add deny log all from any to ::0.0.0.0/104 via ${oif}
	${fw6cmd} add deny log all from ::255.0.0.0/104 to any via ${oif}
	${fw6cmd} add deny log all from any to ::255.0.0.0/104 via ${oif}

	${fw6cmd} add deny log all from ::0.0.0.0/96 to any via ${oif}
	${fw6cmd} add deny log all from any to ::0.0.0.0/96 via ${oif}

	# ------------------------------------------------------------ #
	# このへんもいらない…はず (/etc/rcfirewall デフォルト設定)
	# ------------------------------------------------------------ #
	${fw6cmd} add deny log all from 2002:e000::/20 to any via ${oif}
	${fw6cmd} add deny log all from any to 2002:e000::/20 via ${oif}
	${fw6cmd} add deny log all from 2002:7f00::/24 to any via ${oif}
	${fw6cmd} add deny log all from any to 2002:7f00::/24 via ${oif}
	${fw6cmd} add deny log all from 2002:0000::/24 to any via ${oif}
	${fw6cmd} add deny log all from any to 2002:0000::/24 via ${oif}
	${fw6cmd} add deny log all from 2002:ff00::/24 to any via ${oif}
	${fw6cmd} add deny log all from any to 2002:ff00::/24 via ${oif}

	${fw6cmd} add deny log all from 2002:0a00::/24 to any via ${oif}
	${fw6cmd} add deny log all from any to 2002:0a00::/24 via ${oif}
	${fw6cmd} add deny log all from 2002:ac10::/28 to any via ${oif}
	${fw6cmd} add deny log all from any to 2002:ac10::/28 via ${oif}
	${fw6cmd} add deny log all from 2002:c0a8::/32 to any via ${oif}
	${fw6cmd} add deny log all from any to 2002:c0a8::/32 via ${oif}

	${fw6cmd} add deny log all from ff05::/16 to any via ${oif}
	${fw6cmd} add deny log all from any to ff05::/16 via ${oif}

	# ------------------------------------------------------------ #
	# NetBIOS, MSDS,... これは切っておいたほうがいいよね
	# ------------------------------------------------------------ #
	${fw6cmd} add deny log tcp from any to any 137-139
	${fw6cmd} add deny log tcp from any to any 135,445
	${fw6cmd} add deny log udp from any to any 137-139
	${fw6cmd} add deny log udp from any to any 135,445
	${fw6cmd} add deny log tcp from any 137-139 to any
	${fw6cmd} add deny log tcp from any 135,445 to any
	${fw6cmd} add deny log udp from any 137-139 to any
	${fw6cmd} add deny log udp from any 135,445 to any

	################################################################
	# allow specific packets by default
	# (already allowd , etc.)
	# TCPパケットで通すもの (/etc/rcfirewall デフォルト設定)
	################################################################

	# ------------------------------------------------------------ #
	# Allow TCP through if setup succeeded
	# ------------------------------------------------------------ #
	${fw6cmd} add pass tcp from any to any established

	# ------------------------------------------------------------ #
	# Allow IP fragments to pass through
	# ------------------------------------------------------------ #
	${fw6cmd} add pass all from any to any frag

	################################################################
	# ALLOW/RESET/DENY rules for TCP packets
	# 通すか落とすかは運営ポリシーによって変わる
	################################################################

	# RESET incoming AUTH/113 (identは使ってない)
	${fw6cmd} add reset log tcp from any to any 113 setup

	# DENY incoming SMTP (This machine is not an MTA)
	${fw6cmd} add deny log tcp from any to ${oip} 25 setup

	# This machine is not a DNS server
	# Allow access to our DNS (UDP関係は下にまとめる)
	####${fw6cmd} add pass tcp from any to ${oip} 53 setup
	####${fw6cmd} add pass udp from any to ${oip} 53
	####${fw6cmd} add pass udp from ${oip} 53 to any

	# This machine is not a Web server
	# Allow access to our WWW (防火壁ではWWWを動かしていない)
	####${fw6cmd} add pass tcp from any to ${oip} 80 setup

	################################################################
	# DISABLE *ALL* other incoming TCP connections with LOG (default)
	# 外部からの上記以外のパケットは通さない
	################################################################

	# Reject&Log all setup of incoming connections from the outside
	${fw6cmd} add deny log tcp from any to any in via ${oif} setup

	################################################################
	# Allow other (outgoing) TCP connections
	# 外に出て行くTCPパケット
	################################################################

	# ------------------------------------------------------------ #
	# イントラネット側からDMZにアクセス (必要であれば)
	# ------------------------------------------------------------ #
	#${fw6cmd} add pass log tcp from ${intnet} to ${dmznet} setup

	# ------------------------------------------------------------ #
	# allow with LOGGING
	# イントラネット側から外部のウェブサイトにアクセス
	# ------------------------------------------------------------ #
	${fw6cmd} add pass log tcp from ${intnet} to \
		not ${intnet} 80,443,8080 setup

	# ------------------------------------------------------------ #
	# allow WITHOUT logging
	# ------------------------------------------------------------ #
	# none

	################################################################
	# DENY internal to the world, TCP connections
	# とりあえずそれ以外は今は使わない
	################################################################
	${fw6cmd} add deny log tcp from ${intnet} to \
		not ${intnet} via ${iif} setup
	#
	${fw6cmd} add deny log tcp from ${intnet} to not ${intnet} setup

	################################################################
	# ALLOW/DENY other (outgoing) TCP connections
	################################################################
	# Allow setup of any other TCP connection,  from/to this machine
	# 防火壁から出て行くパケットを通す
	${fw6cmd} add pass log tcp from ${iip} to ${intnet} setup
	${fw6cmd} add pass log tcp from ${oip} to ${dmznet} setup
	#
	${fw6cmd} add pass log tcp from ${oip} to ${outnet} setup
	${fw6cmd} add pass log tcp from ${oip} to not ${intnet} setup
	${fw6cmd} add deny log tcp from any to any setup

	################################################################
	# ALLOW UDP connections
	# 以下 UDP 関連
	################################################################

	# Internet and Internal network
	${fw6cmd} add deny log udp from ${intnet} to not ${intnet} via ${iif}
	${fw6cmd} add deny log udp from not ${intnet} to ${intnet} via ${oif}
	# Internal network from/to this machine
	${fw6cmd} add pass log udp from ${intnet} to ${iip} via ${iif}
	${fw6cmd} add pass log udp from ${iip} to ${intnet} via ${iif}

	# Allow DNS queries out in the world
	${fw6cmd} add pass udp from any 53 to ${oip}
	${fw6cmd} add pass udp from ${oip} to any 53

	# この防火壁ではDNSは動かさない
	${fw6cmd} add deny log udp from any to ${oip} 53
	${fw6cmd} add deny log udp from ${oip} 53 to any

	# traceroute6
	${fw6cmd} add allow log udp from any to any 33434-33523

	# Allow RIPng
	#${fw6cmd} add pass udp from fe80::/10 521 to ff02::9 521
	#${fw6cmd} add pass udp from fe80::/10 521 to fe80::/10 521

	################################################################
	# DENY UDP connections
	################################################################
	${fw6cmd} add deny log udp from any to any

	################################################################
	# ICMP's
	################################################################
	# Allow ICMPv6 destination unreach
	${fw6cmd} add pass ipv6-icmp from any to any icmptypes 1

	# Allow NS/NA/toobig (don't filter it out)
	# これは落としてはいけないっぽい (/etc/rc.firewall6デフォルト)
	${fw6cmd} add pass ipv6-icmp from any to any icmptypes 2,135,136

	# ping6/traceroute6
	${fw6cmd} add pass ipv6-icmp from ${iip} \
		to ${intnet} icmptypes 128 via ${iif}
	${fw6cmd} add pass ipv6-icmp from ${intnet} \
		to ${iip} icmptypes 3,129 via ${iif}

	${fw6cmd} add pass ipv6-icmp from ${oip} \
		to not ${intnet} icmptypes 128 via ${oif}
	${fw6cmd} add pass ipv6-icmp from not ${intnet} \
		to ${oip} icmptypes 3,129 via ${oif}

	# ping6
        ${fw6cmd} add pass ipv6-icmp from ${intnet} \
		to ${iip} icmptypes 128 via ${iif}
        ${fw6cmd} add pass ipv6-icmp from ${iip} \
		to ${intnet} icmptypes 129 via ${iif}

        ${fw6cmd} add pass ipv6-icmp from not ${intnet} \
		to ${oip} icmptypes 128 via ${oif}
        ${fw6cmd} add pass ipv6-icmp from ${oip} \
		to not ${intnet} icmptypes 129 via ${oif}

	# デフォルトで上記以外は落とすはずだけど念のため
	${fw6cmd} add 65000 deny log ipv6 from any to any

	# Everything else is denied by default, unless the
	# IPV6FIREWALL_DEFAULT_TO_ACCEPT option is set in your kernel
	# config file.
	;;


☆参考文献

  1. KDDI Powered Internet サービス各種設定
  2. OCN IPv6 トンネル接続サービス 技術情報
  3. FreeBSDの/etc/rc.firewall6


関連リンク


ご質問などありましたらお気軽に