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に追加します。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です