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 に送ってどうにかしてもらいます。このアドレスがルータのものか確認します。

参照と脚注

ZOOT NATIVE (DS-LITE)でネット接続

  1. さらに下にネットワークを作らないでも、ひかり電話ルータに直接接続するだけでIPv6で通信することが可能です。ただこれだとパケットの制限をこのルータに依存するのが嫌だな…と。
  2. NAPTでも外から自分のネットワーク内の端末に接続で可能です。その時は、IPv4の時と同じように特定ポートへの通信を特定の端末に転送させるように設定します。これで外部にサーバを公開する事が可能です。
  3. RAでDNSの情報を配布する場合は、RDNSSとDNSSLの設定をradvd.confに追加します。