ふとんのなか

中身はないかもしれない。

J:COM回線のIPv6を使ってみようとしたおはなし(失敗)

この記事は、Tokyo City University Advent Calendar 2019の7日目の記事です。
6日目はいちたくさん先輩の脱terapadの為のvim環境構築でした。ちなみに私は最近やっとvimを少し覚えました。

せっかくなのでブログを開設してみました。
ネットワーク系の研究室に所属している割には、最近ネットワークの話題を扱っていないので、書いてみようかなーと。
タイトルにありますが、失敗談です。

はじめに

IPv4の枯渇問題がしばしば話題に取り上げられるものの、いまいち普及しないIPv6
でも今後ネットワークを専門にしていくなら、やっとかなきゃダメでしょ!ということで、自宅のLANに(リンクローカルでないアドレスを)導入してみました。
なお、自宅の回線はJ:COM NET 320Mコース(地味に人権がない)で、申し込めば無料でIPv6が使えます。

ただし。

J:COMはご丁寧に、プレフィックス長が128のアドレスを1つだけ寄越してきました。
IPv4と同じく、1つのアドレスがおそらく動的に割り当てられているだけで、このままではどうすることもできません。*1
でもIPv6の世界を体験してみたいし、なんとかして使えるようにするしかない。とはいえ、使用中のルーターではどうにもならないので、Raspberry Piを使ってどうにかすることにしました。

必要なもの

  • Raspberry Pi (今回使うのは3 Model B) + Raspbian Buster
  • ラズパイにつなぐUSB 有線LANアダプタ
  • 追加のLANケーブル1本
  • IPv4IPv6、それにまつわる技術の基本的な知識

最初に思い付いた構成

降ってきたIPアドレスに対して、ラズパイで

  • IPv4については加工せずにそのままルーターに渡す
  • IPv6についてはNAPTをしたうえで、そのあとの作業はルーターに任せる

という風にしようとしました。

この構成は無理です。バカかお前

IPv4のために仮想ブリッジを作ることと、IPv6でNAPTすることは両立できません。*2

最終的な構成

IPv4・v6ともにラズパイでNAPTすることにしました。現行のルーターはブリッジモードで動かします。
そもそも、IPv6でNAPTだなんて何かがおかしいし気が狂いそうですが、アドレスが1つしかないんだからやるしかない…。

  • WAN側:DHCP自動構成
  • LAN側IPv4:10.0.0.0/24
  • LAN側IPv6:fd00::/64

実際にやってみた

sudoを打つのが面倒なので、以降rootで作業します。(作業ディレクトリはどこでもいいです)

$ su


必要なパッケージのインストール
# apt install radvd radvdump dnsmasq


インターフェースの設定
  • IPアドレス割り当ての設定
    Raspbianでは、/etc/network/interfaces だけではIPアドレスそのものの設定ができないようなので、割り当て方法のみ指定します。なお、無指定の場合はDHCPとなるようです。
    [/etc/network/interfaces に追記(コメントは省略)]
auto eth0
iface eth0 inet manual
iface eth0 inet6 manual


  • DHCPクライアントの設定
    ここでLAN側IPアドレスを指定します。
    [/etc/dhcpcd.conf に追記(コメントは省略)]
interface eth0
static ip_address=10.0.0.1/24
static ip6_address=fd00::1/64


  • フォワーディングの設定
    すべてのインターフェースに対してフォワーディングを許可すると無線LANもごっちゃになるので、個別に許可します。
    [/etc/sysctl.conf に追記]
net.ipv4.conf.eth0.forwarding=1
net.ipv4.conf.eth1.forwarding=1

net.ipv6.conf.eth0.forwarding=1
net.ipv6.conf.eth1.forwarding=1
dnsmasqの設定

名前的にDNSサーバーですが、DHCPサーバーとしても使えます。
/etc/dnsmasq.confに追記(コメントは省略)

interface=eth0
dhcp-range=10.0.0.2,10.0.0.100,255.255.255.0,24h
dhcp-option=option:dns-server,1.1.1.1


iptables・ip6tablesの設定

本来、ufwを使うべきなんでしょうが、どういうわけかうまく動かなかったので全部コマンド手打ちです。

  • まず、コマンドを発行します。
# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
# iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j ACCEPT
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -j DROP
# iptables -A FORWARD -i eth0 -j ACCEPT
# iptables -A FORWARD -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -j DROP
# ip6tables -t nat -A POSTROUTING -s fd00::/64 -o eth1 -j MASQUERADE
# ip6tables -A INPUT -i eth0 -s fd00::/64 -j ACCEPT
# ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# ip6tables -A INPUT -i lo -j ACCEPT
# ip6tables -A INPUT -j DROP
# ip6tables -A FORWARD -i eth0 -j ACCEPT
# ip6tables -A FORWARD -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# ip6tables -A FORWARD -j DROP

/*要約
・WANポートから入ってきた許可パケットはアドレス変換してLANに流す
・LAN内からルーターに対しての接続は許可
・WANから出て行ったパケットに関連するパケットは許可
・DNSのために、ループバックは許可
・そのほかはすべて破棄
*/


次に、入力した内容を保存するためのものをここで導入します。(※最初に導入しないこと)

# apt install iptables-persistent


radvdの設定

radvdはRA(Router Advertisement, ルーター広告)を配信するためのデーモンです。
今回はDHCPv6ではなく、RAを使います。(そもそもDHCPv6はAndroidが対応しないので…)
DHCPv6を使わないので、RDNSS(RFC 8106)でDNS情報を配布します。
[/etc/radvd.conf を作成]

interface eth0 {
  AdvSendAdvert         on;    //RAを定期的に送る
  AdvOtherConfigFlag    off;   //IPv6アドレス以外をDHCPv6から取得しない
  MinRtrAdvInterval     10;    //RAの最小送信間隔
  MaxRtrAdvInterval     30;    //RAの最大送信間隔
  AdvManagedFlag        off;   //IPv6アドレスをDHCPv6から取得しない
  AdvDefaultPreference  high;  //優先順位を高に設定(いらないかも)

  prefix fd00::/64 {
    AdvOnLink     on;    //このプレフィックスを使うマシンが、ルーターに到達可能だと仮定
    AdvAutonomous on;    //プレフィックスを自動アドレス設定に使える
    AdvRouterAddr on;    //これもいらないかも(英語読めない)
  };

  //DNS情報 今回は適当にCloudFlareの
  RDNSS 2606:4700:4700::1111 2606:4700:4700::1001 {
  };
};


サービスの登録・起動

ラズパイ起動時に、dnsmasqとradvdが自動起動するようにします。

# systemctl enable dnsmasq
# systemctl enable radvd
# systemctl start dnsmasq
# systemctl start radvd


運用しようとした

都合よくメインPCにNICが2つあるので、使ってない方とハブの間にラズパイを挟んでテスト。
アドレスの払い出し、Webページの閲覧なども問題なさそうなので、いざケーブルモデムの前に。



見たことない謎のIPv4降ってきた…
てかIPv6は降ってこない…
あ、なぜかdnsmasqが死んだ…




本番環境に投入したら途端にトラブりまくったので大失敗です。
SSHも何故か受け付けなくなったので、今回はしゅーーーーーーりょーーーーーー
本番環境でやらかしちゃった人のアレかな?

おわりに

ifconfigをip aに代えたり、新しめの環境でやろう!とした割に、DHCPv4としてdnsmasqを使っていたり(Kea DHCPとかは?)、パケットフィルタリングにnftablesを使ってなかったりしています。
というのも、ブリッジを使った環境の検証などの色々すったもんだの挙句がこれなので、あれこれ試している時間がなかったのです。
資料が豊富にあるパッケージを使ったのに結局最後は爆死したけど…

極論を言っちゃうと、今のところJ:COM回線でIPv6を使うメリットは皆無です。
別に通信は速くなりません。(フレッツみたいにPPPoEの終端が原因で遅いわけじゃないので)
何よりも、NAPTしないと使えないIPv6とは。これが全てです。普通に不便
とはいえ、今回の大失敗は悔しかったので、いずれリベンジしようと思います。

さて、TCU Advent Carendar 2019の7日目でこんな酷い記事を出してしまいましたが、この手の企画に参加したのは初めてです。次またあったらもうちょっとマシな話を書きたいね…。

明日はまだ誰も登録されていないけど、だれがやるのかな?

参考

【DS-Lite】net.ipv4.ip_forwardを立てちゃうと困る場合はこうだ!【NGN IPoE】 - Qiita
IPv6とIPv4のデュアルスタックで接続 | やってみよう準備室
radvd.conf(5) - Linux man page

*1:パソコンが1台しかない環境を想定しているのか?事実上無限にあるIPv6を本当に1つしか寄越さないとは…J:COMは何を考えてるんだろう…

*2:仮想ブリッジにNICを追加した時点で、そのNICはインターフェースとしての機能を失います。IPアドレスも設定できなくなります。なんかCentOSだと無理やりできるみたいだけど…