IPv6とIPv4のデュアルスタックで接続
ZOOT NATIVE (DS-Lite)でネット接続では、DS-Lite を使って IPv4 通信できることを確認しました。今回は、せっかく ZOOT NATIVE が IPv6 の IPoE なので、IPv4 だけでなく IPv6 でも通信できるようにします。
フレッツ光のひかり電話契約なしの場合は/64 のプレフィックスしかもらえなので、自分のルータの下に自分のネットワークを置くにはこの方法しかありません。
ひかり電話契約ありの場合は、DHCPv6-PD によりもっと普通に自分のネットワークを置けます。この DHCPv6-PD を使った方法は、DHCPv6-PD で IPv6 のサブネットワークを作成を参照して下さい。
Raspbian の設定は、ZOOT NATIVE (DS-Lite)でネット接続での状態になっている前提での説明です。
サイト構成
IPv6 は事実上無限の数の IP アドレスを持つので、IPv6 に接続したどんな機械でもユニークな IP アドレスを持つことができ Internet から接続できます。ということなのですが、ひかり電話契約がない場合は、フレッツ光のひかり電話ルータが RA で配布するプレフィックスは/64 となっています。そのためさらに下に別なネットワークを作る事ができません(注1)。
そこで今回は、IPv4 と同じようにルータで NAPT(マスカレード)してルータ以下のネットワークを隠して IPv6 の世界に接続します。このため Internet から自分のネットワーク内の端末へ簡単には接続できません(注2)。
自分のネットワーク内では、IPv4 のプライベートアドレスに相当するユニークローカルアドレス(ULA)を使用します。今回は fd00::/64 を自分のネットワークに使用することにしました。
Raspberry Pi のインターフェイスは、次のように使用します。
インターフェイス | ネットワーク | アドレス |
---|---|---|
eth0 | 自分のネットワーク/64 | fd00::1/64 |
eth1 | Internet(IPoE) | RA で自動設定 |
自分のネットワーク内の端末は、Raspberry Pi が送信する RA で自動的に IPv6 アドレスやデフォルトルータが設定されます。
ルータのアドレス指定
自分のネットワークへ入るルートを登録するため、eth0 に IPv6 のアドレスを割り当てます。
/etc/network/interfaces
# 追加する
iface eth0 inet6 static
address fd00::1
netmask 64
radvd をインストール
IPv4 の DHCP サーバと同じように、IPv6 ではルータ広告(RA)によって端末をネットワークに接続しただけで自動的にアドレスやデフォルトルートが設定されます。このためのサーバソフトが radvd です。
$ sudo apt-get install radvd
radvd
が配布する RA の設定は/etc/radvd.conf/radvd.conf
に書きます。
interface eth0 {
AdvSendAdvert on;
#MaxRtrAdvInterval 30;
#prefix ::/64 { でもOK?
prefix fd00::/64 {
AdvRouterAddr on;
};
};
必要であれば DNS の情報を RA で配布することも可能(注3)ですが、今回は IPv4 の DHCP に依存することにしました。
どんな内容の RA を送っているか(受信しているか)は、ルータ上で次のコマンドを実行することで確認できます。
$ sudo radvdump
ufw の設定
前回は IPv4 のみだったので DEFAULT_FORWARD_POLICY を ACCEPT として何でも転送を許可していましたが、今回は少し安全にするため通過できるパケットを制限します。制限するポリシーは次のとおりです。
- 自分のネットワークから外へは無制限に出ていける。
- 自分のネットワークへは、出て行ったパケットに関連するパケットのみが入れる。
そこで/etc/default/ufw
を次のように変更し、許可されたパケット以外は全て破棄するようにします。
DEFAULT_FORWARD_POLICY="DROP"
DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"
許可するパケットのルールは、ufw
の設定ファイルに追加します。
/etc/ufw/before.rules
# 以下を追加する。
# accept all from LAN and returned RELATED or ESTABLISHED packets
-A ufw6-before-forward -i eth0 -j ACCEPT
-A ufw6-before-forward -m state --state RELATED,ESTABLISHED -j ACCEPT
/etc/ufw/before6.rules
# 以下を追加する。
# accept from LAN
-A ufw6-before-input -i eth0 -j ACCEPT
# accept all from LAN and returned RELATED or ESTABLISHED packets
-A ufw6-before-forward -i eth0 -j ACCEPT
-A ufw6-before-forward -m state --state RELATED,ESTABLISHED -j ACCEPT
さらに IPv6 のパケットを NAPT(マスカレード)するための設定を/etc/ufw/before6.rules
に追加します。追加は、ファイルの最初または最後、要するに*filter と COMMIT に挟まれていない場所にします。
/etc/ufw/before6.rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth1
-A POSTROUTING -s fd00::/64 -o eth1 -j MASQUERADE
COMMIT
IPv6 の転送を許可
IPv4 だけでなく、IPv6 も転送するように設定します。
/etc/ufw/sysctl.conf
# 追加する
net/ipv6/conf/default/forwarding=1
net/ipv6/conf/all/forwarding=1
net/ipv6/conf/eth1/accept_ra=2
net/ipv6/conf/eth1/accept_ra_pinfo=1
net/ipv6/conf/eth1/autoconf=1
forwarding を有効にすると上流ルータからの RA を無視してしまいます。そこで外につながっている eth1 は accept_ra などを有効にして、RA を受信して自動的にアドレスを設定するようにしています。
IPv6 はインターフェイスの MAC アドレスからアドレスが決定されます。そのためこのまま外のサイトに接続すると IPv6 アドレスからどのメーカのネットワークカードまたはアダプタを使っているがバレてしまいます。これが嫌な時は、プライバシー機能を有効にして隠すことが可能です。
IPv6 での通信確認
IPv6 で通信するための設定は以上で終わりです。一度再起動して設定を反映させます。
IPv6 と IPv4 の両方で通信できているかは、次のサイトへ Web ブラウザでアクセすることで確認できます。
- IPv6 test - IPv6/4 connectivity and speed test
- IPv4 と IPv6 の両方で接続できるか調べられる。
- あなたの IPv6 をテストしましょう。
- IPv6 で通信できているかを確認できる。
- IIJmio IPv6 スピードテスト(β)
- IPv6 での通信速度を測定できる。
- The KAME project
- IPv6 で接続すると亀が動きます。
トラブルシューティング
接続できない時は、まず IPv6 アドレスが割り振られているか確認します。Windows では、ipconfig
コマンドを使用します。
$ ip -6 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2409::xxx:xxxx:xxx:xxx/64 scope global temporary dynamic
valid_lft 86165sec preferred_lft 14165sec
inet6 2409::xxx:xxxx:xxx:xxx/64 scope global mngtmpaddr noprefixroute dynamic
valid_lft 86165sec preferred_lft 14165sec
inet6 fe80::xxx:xxxx:xxx:xxx/64 scope link
valid_lft forever preferred_lft forever
IPv6 アドレスが割り当てられていることが確認できたら、デフォルトルートが登録されていることを確認します。
$ netstat -rn6
カーネルIPv6 経路テーブル
Destination Next Hop Flag Met Ref Use If
2409:xxx:xxxx:xxx::/64 :: Ue 256 2 7 enp0s25
fe80::/64 :: U 256 0 0 enp0s25
::/0 fe80::xxx:xxx:xxx:xxx UG 100 1 1 enp0s25
# 省略
ここで::/0
で始まる行がデフォルルートで、送り先がわからない時はパケットを Next Hop の fe80::xxx:xxx:xxx:xxx に送ってどうにかしてもらいます。このアドレスがルータのものか確認します。
参照と脚注
- さらに下にネットワークを作らないでも、ひかり電話ルータに直接接続するだけでIPv6で通信することが可能です。ただこれだとパケットの制限をこのルータに依存するのが嫌だな…と。
- NAPTでも外から自分のネットワーク内の端末に接続で可能です。その時は、IPv4の時と同じように特定ポートへの通信を特定の端末に転送させるように設定します。これで外部にサーバを公開する事が可能です。
- RAでDNSの情報を配布する場合は、RDNSSとDNSSLの設定を
radvd.conf
に追加します。