2016年5月24日火曜日

[FreeBSD]DS-Lite with FreeBSD

FreeBSDを用いてDS-Liteをしてみました。目的は夜間のIPv6回線が遅くなる点の改善です。

追記:FreeBSDならば、佐藤さんのFreeBSDworkshopでの発表が詳しく良い設定です。

修正:2016/10/2 dslite-ctl.shを修正しました。sudo sysctl net.inet6.ip6.forwarding=1
のコメントインを削除しました(IIJ Blogと同じ設定にする)。そうしないと以下のエラーで
IPv6のdefault routeが消えていました。

nd6_dad_timer: cancel DAD on gif0 because of ND6_IFF_IFDISABLED.


1) 用いたプロバイダーIIJmio
2) IPv6接続は、IPoE(IIJmioのIPoEオプション)

用いた機器
1) Odroid-C1(ARMが動くボードですが、Raspberry PIやi386/AMD64のFreeBSDが動く機材でも同様な設定で動くと思います。
2) FreeBSD-current
3) NTT PR-500KI (光ルーター) IP: 192.168.100.1


Odroid-C1の/etc/rc.conf amle0がOdroid-C1のLAN portです。
##############################################
#
# enable IPv4
#
ifconfig_amle0_name="net0"
ifconfig_net0="192.168.100.2/24"
##############################################
#
# enable IPv6
# https://www.freebsd.org/doc/handbook/network-ipv6.html
#
ifconfig_net0_ipv6="inet6 accept_rtadv"
rtsold_enable="YES"
##############################################
#
# enable DHCP Server
#
dhcpd_enable="YES"

dhcpd.conf
default-lease-time 600;
max-lease-time 7200;

log-facility local7;

subnet 192.168.100.0 netmask 255.255.255.0 {
  range 192.168.100.101 192.168.100.150;
  option domain-name-servers 192.168.100.1;
  option domain-name "example.com";
  option routers 192.168.100.2;
  option broadcast-address 192.168.100.255;
  default-lease-time 600;
  max-lease-time 7200;
}

MacOS X用dslite.shへのパッチ(http://techlog.iij.ad.jp/contents/dslite-macosx)
変更ポイントは、

  • LANのport nameをnet0へ
  • 自宅の環境では、gw.transix.jpの名前解決ができなかったため、決め打ちで東日本用アドレスを設定

--- dslite-ctl.sh.org   2016-05-12 07:51:34.905693000 +0900
+++ dslite-ctl.sh.pulic 2016-05-24 22:44:18.206909000 +0900
@@ -15,6 +15,7 @@
   echo "Ethernet Interface: ${IF}"
   echo "MY_GUA: ${MY_GUA}"
   echo "AFTR_GUA: ${AFTR_GUA}"
+  sudo ifconfig gif0 create
   sudo ifconfig gif0 inet6 tunnel ${MY_GUA} ${AFTR_GUA}
   sudo ifconfig gif0 mtu 1500
   sudo ifconfig gif0 inet 192.0.0.2/30 192.0.0.1
@@ -43,15 +44,17 @@
 get_my_gua() {
   for i in ${EN_NUM}
   do
-    MY_GUA=`ifconfig en${i} inet6| grep 'inet6 2409:[0-9a-f:]*ff:fe[0-9a-f:]*' | sed 's/\%.*//' | cut -d ' ' -f 2`
+    MY_GUA=`ifconfig net${i} inet6| grep 'inet6 2409:[0-9a-f:]*ff:fe[0-9a-f:]*' | sed 's/\%.*//' | cut -d ' ' -f 2`
     if [ "${MY_GUA}" ]; then
-      IF="en${i}"
+      IF="net${i}"
       return
     fi
   done
 }
 COM=`basename $0`
-AFTR_GUA=`host ${AFTR_FQDN} | grep '2404:8e0' | sed -e '1!d' -e 's/.* address //'`
+#AFTR_GUA=`host ${AFTR_FQDN} | grep '2404:8e0' | sed -e '1!d' -e 's/.* address //'`
+AFTR_GUA="2404:8e00::feed:100"
+
 get_my_gua
 if [ ! "${MY_GUA}" -o ! "${AFTR_GUA}" ]; then
   echo "Error: My Global Unicast Address and/or AFTR IPv6 Address not found."