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本
- IPv4とIPv6、それにまつわる技術の基本的な知識
最初に思い付いた構成
降ってきたIPアドレスに対して、ラズパイで
という風にしようとしました。
この構成は無理です。バカかお前
IPv4のために仮想ブリッジを作ることと、IPv6でNAPTすることは両立できません。*2
最終的な構成
IPv4・v6ともにラズパイでNAPTすることにしました。現行のルーターはブリッジモードで動かします。
そもそも、IPv6でNAPTだなんて何かがおかしいし気が狂いそうですが、アドレスが1つしかないんだからやるしかない…。
実際にやってみた
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
interface eth0 static ip_address=10.0.0.1/24 static ip6_address=fd00::1/64
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