pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


OpenWRT+Raspberry PiでIPv6 IPoE + DS-Lite (transix接続)のルータを作る

OpenWRTを使えばIPv6 IPoE接続 + DS-Liteのルータを作成するのは容易ですが、GUIからチマチマ設定するのはめんどくさいので、スクリプト一発で設定できるように作成したスクリプトをログとして残します。スクリプトは RasPi 向けに作成しています。

OpenWRTを焼いたSDカードでRaspberry Piを起動後、このスクリプトを実行すれば自動で必要なパッケージのインストールを行い、自動で IPoE + DS-Lite 接続の設定が適用されるはずです。

事前準備としては、フレッツ光でIPoE を有効にしておくことと、IPoE DS-Lite 対応のプロバイダと契約しておくこと。光コラボは使ったことないのでよくわからない。

準備ができていたら、つぎのように実行すれば IPoE IPv6 + DS-Lite によるルータが出来上がります。OpenWRTのサイトは IPv6 reachable のため、IPv6 IPoE がフレッツ光で利用可能な状態になっていれば、OpenWRTデバイスフレッツ光ONUにぶら下げるだけでパッケージのインストールが行えます。

  1. OpenWRT のファームウェアをSDカードに焼く(19.07.4 で動作確認しています)
  2. このスクリプトを initconfig.sh などの名前でSDカードにコピーする
  3. Raspberry Piを起動する
  4. スクリプトを実行すると、NICを DHCPv4 および DHCPv6 クライアントに変更し、外部への疎通がとおるまで待ち状態になります
  5. NICフレッツ光ONUをLANケーブルでつなぎ、IPoEでIPv6アドレスが割り当てられると、必要なパッケージのインストールや設定の適用が自動的に進みます
  6. スクリプトの実行が完了したらOpenWRTを再起動すれば、IPoE IPv6 + DS-Lite が使えるようになっているはず

なお、スクリプト自体は Raspbery Pi2 に Buffalo の 2.4GHz USB dongle を装着する想定で作成しています。Raspberry Pi3 以降で使う場合は PKG_USB_WIFI のインストールが不要なので opkg の実行箇所をコメントアウトするなどしてください。

また、Raspberry Pi 以外の場合は eth0 を WAN 向けに設定している箇所を変更すると、スクリプトがそのまま使えるかもしれません、が、未検証です。とはいえ、uci コマンドによる設定内容は参考になるはずです。

#!/bin/sh -x

# config(必要に応じて変更します)
LAN_ADDR=192.168.4.1
LAN_MASK=255.255.255.0
WIFI_SSID=[SSID]
WIFI_PASS=[passphrase]
DSLITE_AFTR=gw.transix.jp
PKG_USB_WIFI='kmod-mac80211 kmod-rt2800-lib kmod-rt2800-usb usbutils'

MACADDR=$( /sbin/ifconfig eth0 | head -1 | awk '{print $5}' | sed 's/://g' )
uci set system.@system[0].hostname=OpenWrt-${MACADDR}

# IPv6 を有効にするかどうか。true 以外の場合は IPv4 による、単なるトラベルルータとしてセットアップします。
ENABLE_IPV6=true

# Rapsberry PiのLANポートをDHCPクライアントにするための設定を書き込む
uci del network.lan.ipaddr
uci del network.lan.netmask
uci del network.lan.ip6assign
uci set network.lan.proto='dhcp'

if [ ${ENABLE_IPV6} == true ]; then
    # Rapsberry PiのLANポートをIPoE DHCPv6クライアントにするための設定を書き込む
    uci set network.wan6=interface
    uci set network.wan6.ifname='eth0'
    uci set network.wan6.proto='dhcpv6'
    uci set network.wan6.reqaddress='try'
    uci set network.wan6.reqprefix='auto'

    uci set dhcp.wan6=dhcp
    uci set dhcp.wan6.interface='wan6'
    uci set dhcp.wan6.dhcpv6='relay'
    uci set dhcp.wan6.ra='relay'
    uci set dhcp.wan6.ndp='relay'
    uci set dhcp.wan6.master='1'

    uci set firewall.@zone[1].network='wan wan6'
fi

uci commit
/etc/init.d/network restart

# 外部向けの疎通が確保できたらパッケージのインストールを行う
while :
do
  ping -c 1 www.google.com > /dev/null 2>&1
  result_v4=$?

  ping6 -c 1 www.google.com > /dev/null 2>&1
  result_v6=$?
  if [ ${result_v4} == 0 ] || [ ${result_v6} == 0 ]; then
    opkg update
    opkg install ds-lite luci-proto-ipv6 luci-i18n-base-ja
    opkg install ${PKG_USB_WIFI}
    break
  else
    sleep 1
  fi
done

# WiFiルータにするための設定を書き込む
uci set system.@system[0].zonename='Asia/Tokyo'

uci set dropbear.@dropbear[0].Interface=lan

uci set network.lan.proto='static'
uci set network.lan.ipaddr=$LAN_ADDR
uci set network.lan.netmask=$LAN_MASK
uci set network.lan.ifname='wlan0'

uci set network.wan=interface
uci set network.wan.proto='dhcp'
uci set network.wan.ifname='eth0'

uci set wireless.radio0.disabled='1'
uci set wireless.radio0.country='JP'
uci set wireless.radio0.txpower='10'
uci set wireless.default_radio0.encryption='psk2'
uci set wireless.default_radio0.network='lan'
uci set wireless.default_radio0.ssid=$WIFI_SSID
uci set wireless.default_radio0.key=$WIFI_PASS
uci set wireless.default_radio0.wpa_disable_eapol_key_retries='1'
uci delete wireless.radio0.disabled='1'

if [ ${ENABLE_IPV6} == true ]; then
    # IPv6 DHCP を LAN 側に relay する設定
    uci set dhcp.lan.ra='relay'
    uci set dhcp.lan.dhcpv6='relay'
    uci set dhcp.lan.ndp='relay'

    # IPoE DS-Lite を有効にするための設定を書き込む```
    uci set network.transix=interface
    uci set network.transix.proto='dslite'
    uci set network.transix.encaplimit='ignore'
    uci set network.transix.peeraddr=${DSLITE_AFTR}
    uci set firewall.@zone[1].network='wan wan6 transix'
fi

uci commit
/etc/init.d/network restart

#reboot

設定内容については下記記事を参考にしていますので、このスクリプトでうまくいかない場合はそちらに目を通すとよいのではと思います。

hirokon0521.hatenablog.com

hirokon0521.hatenablog.com