仙石浩明の日記

2006年12月19日

La Fonera (FON ソーシャル ルータ)

La Fonera (FON ソーシャル ルータ) を2台購入した (正確に言うと1台は店頭で購入、もう1台は無料キャンペーンで入手)。

入手方法 店頭で購入 無料キャンペーン
Model FON2100E FON2100E
S/N 8638001XXX 8646022XXX
MACアドレス 00:18:84:10:XX:XX 00:18:84:16:XX:XX
ROMバージョン 0.7.0 r3 0.7.0 r4

店頭で購入した物のほうが古いのは、まあ当たり前か。 新しい方のシリアル番号の下のほうの桁が 2万を超えているので、 現在は万単位で製造しているのだろう。 シリアル番号の上の方の桁、 および ROMバージョンが異なるのは、 製造ロットが違うから? もちろん両ルータともネットにつないでおくことにより、 現時点での最新バージョンである 0.7.1 r1 に自動アップデートした。

自動アップデートは、 cron から呼び出される /bin/thinclient プログラムによって行なわれる (/bin/thinclient は起動時にも呼び出される)。

root@OpenWrt:~# /bin/thinclient cron
upgrade.fon          100% |*****************************| 61473       00:00 ETA
This is a FON hotfix v2 archive
Verified OK
Upgrade name: upgrade_0711
Upgrading...

/bin/thinclient は、まず download.fon.com:1937 へ ssh 接続する。 ポート番号が変則的なのは、 間にファイアウォールがはさまっていないか確認するためか? なお、ssh は /etc/dropbear/key にある秘密鍵を用いて DSA 認証を行なう。 この秘密鍵は両ルータとも同じ内容だった。 /bin/thinclient は、次に この ssh セッションにおいて、 次の文字列を送信する。

mode='cron' wlmac='00:18:84:16:XX:XX' mac='00:18:84:16:XX:XX' fonrev='4' firmware='0.7.0'

ここで、「mode=」は /bin/thinclient の実行方法を示している。 cron から呼び出されたときは「mode='cron'」、 起動時に呼び出されたときは「mode='start'」。 「wlmac=」および「mac=」はそれぞれ、 無線(FON_AP)側の MAC アドレスと、 有線(WAN)側の MAC アドレス。 後者の MAC アドレスに 1 加えた値が前者のアドレスになっているようだ (ちなみにプライベート アクセス ポイント(MyPlace)側の MAC アドレスは、 さらに 1 を加えた値)。 「firmware=」および「fonrev=」はバージョンおよびリビジョン番号を示す。 つまり、個体識別ID を FON に送信しているものと考えられる。

すると、download.fon.com:1937 から、 以下のような sh スクリプトが返ってくる。

cd /tmp
wget http://download.fon.com/firmware/update/0.7.0/4/upgrade.fon
/bin/fonverify /etc/public_fon_rsa_key.der /tmp/upgrade.fon

rm -f /tmp/.thinclient.sh

exit

/bin/thinclient は、 この送られてきた sh スクリプトを /tmp/.thinclient.sh に保存した上で実行する。 つまり、 この例の場合だと、「upgrade.fon」をダウンロードして 「/bin/fonverify」に与える。 おそらく upgrade.fon がアップデートのための差分データで、 「/bin/fonverify」が、このデータを認証した上で展開しているのだろう。

アップデートの必要がないときは、 以下のような何もしない sh スクリプトが返ってくる。


rm -f /tmp/.thinclient.sh

exit

0.7.0 r4 と 0.7.1 r1 の差分をとってみた。
新規に追加されたファイル:

/etc/config/ntpservers
/etc/config/openports
/etc/config/webif
/etc/init.d/N45ntpclient

ntpclient を使って時刻あわせするようになったようだ。 アップデート前するは起動時に「2000年1月1日 9:00 JST」にセットされていた。 これでは起動時からの経過時間しかわからないので、 ntpclient を使うように変更したのだろう。

変更されたファイル:

--- /rom/etc/banner	2006-09-13 02:41:30.000000000 +0900
+++ /jffs/etc/banner	2006-11-22 04:07:20.000000000 +0900
@@ -4,7 +4,7 @@
 |   |    |_______||__| |__|
 |___|
 
- Fonera Firmware (Version 0.7.0 rev 4) -------------
+ Fonera Firmware (Version 0.7.1 rev 1) -------------
   * 
   * Based on OpenWrt - http://openwrt.org
   * Powered by FON - http://www.fon.com

--- /rom/etc/fon_revision	2006-09-12 06:43:42.000000000 +0900
+++ /jffs/etc/fon_revision	2006-11-16 05:08:40.000000000 +0900
@@ -1 +1 @@
-4
+1

--- /rom/etc/fon_version	2006-09-12 04:32:01.000000000 +0900
+++ /jffs/etc/fon_version	2006-11-16 05:08:40.000000000 +0900
@@ -1 +1 @@
-0.7.0
+0.7.1

--- /rom/etc/functions.sh	2006-09-12 04:32:01.000000000 +0900
+++ /jffs/etc/functions.sh	2006-11-15 02:44:26.000000000 +0900
@@ -112,3 +112,18 @@
 	esac
 }
 
+#
+# This functions forwards a port. The next args are required:
+# $1 = WAN interface
+# $2 = Origin Port
+# $3 = Destination IP
+# $4 = Destination Port
+# $5 = protocol used
+#
+# Example: open_port $WAN 8080 192.168.1.2 80 tcp
+#
+open_port() {
+        iptables -t nat -A prerouting_rule -i $1 -p $5 --dport $2 -j DNAT --to-destination $3:$4
+        pdots=`echo $4 | sed 's/-/:/g'`
+        iptables        -A forwarding_rule -i $1 -p $5 --dport $pdots -d $3 -j ACCEPT
+}

--- /rom/etc/hotfix	2006-09-12 04:32:01.000000000 +0900
+++ /jffs/etc/hotfix	2000-01-01 09:35:00.000000000 +0900
@@ -0,0 +1 @@
+upgrade_0711

--- /rom/etc/init.d/S45firewall	2006-09-12 04:56:53.000000000 +0900
+++ /jffs/etc/init.d/S45firewall	2006-11-17 22:12:29.000000000 +0900
@@ -105,3 +105,7 @@
 }
 # check if the connection is already up and add WAN_HOOK rules automatically
 env -i ACTION=ifup INTERFACE=wan /bin/sh /etc/hotplug.d/iface/20-firewall
+#
+# Forwarded ports
+#
+/etc/config/openports $WAN

--- /rom/etc/sysctl.conf	2006-09-12 04:32:01.000000000 +0900
+++ /jffs/etc/sysctl.conf	2006-11-08 03:04:39.000000000 +0900
@@ -6,3 +6,4 @@
 net.ipv4.tcp_keepalive_time=120
 net.ipv4.tcp_timestamps=0
 net.ipv4.tcp_vegas_cong_avoid=1
+net.ipv4.ip_local_port_range=4096 8192

このあたりはわずかな修正だが...

--- /rom/etc/init.d/rcS	2006-09-12 22:16:13.000000000 +0900
+++ /jffs/etc/init.d/rcS	2006-11-15 02:44:26.000000000 +0900
@@ -21,13 +21,24 @@
 	done
 	
 	while :; do
+		lock -w /var/run/restart-services
+		
+		# just in case
+		lock -u /var/run/network-connection 
+		killall lock
+		
+		# grab the locks again
 		lock /var/run/restart-services
+		lock /var/run/network-connection
+
 		killall N50chillispot
 		killall chilli
 		killall dnsmasq
 		ifup lan_noinet
 		ifup wan
 		/etc/init.d/S45firewall
+		
+		lock -w /var/run/network-connection
 		for i in /etc/init.d/N*; do
 		  $i start 2>&1
 		done

これは、起動時に問題が起きることがあることへの対策か?

そして、0.7.1 へのアップデートで一番の目玉が、 /usr/lib/webif 以下の変更、 すなわち設定 Web インターフェースの多言語対応なのだろう。 /usr/lib/webif/lang ディレクトリが追加され、 /usr/lib/webif/lang/jp/fon.txt などのファイルに、 ローカライズのための文字列置換表が追加された。 /etc/config/webif に現在選択している言語が設定される。

日本語で設定できるようになったのはいいことだと思うが、 0.7.1 r1 にアップデートしてから、 FON Maps で濃いグリーンで表示されなくなったような気がする... アップデート前は FON_AP 登録位置に濃いグリーンの円が表示されていたのだが、 アップデート直後から薄いグリーン(直近で非アクティブ)の円で 表示されるようになってしまった。 前述したようにバージョン番号は thinclient で FON へ送信されるが、 0.7.1 r1 だと電波を出しているとは認識してもらえなくなってしまったのか? (thinclient の実行頻度を高めてみても、淡い緑のまま...)

もう一点、気づいた不具合として、 設定 Web インタフェースにて WAN 以外の設定を行なわずに何らかの設定を行なうと、 WAN が使えなくなってしまう、という問題がある。 すなわち、/etc/config/fon において

config network wan
	option mode	''

などとなってしまう。 これだと WAN (つまり有線インタフェース) に IP アドレスが設定されない。 つまり有線もパブリック アクセス ポイント「FON_AP」も使えなくなってしまう。 エイリアス「eth0:1」には常に 169.254.255.1 が設定されるので、 大事には至らないのだが...

eth0:1    Link encap:Ethernet  HWaddr 00:18:84:16:XX:XX
          inet addr:169.254.255.1  Bcast:169.254.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          Interrupt:4 Base address:0x1000

このような状態になってしまったときは、 この 169.254.255.1 へアクセスするか、 プライベート アクセス ポイント「MyPlace」へアクセスして、 設定 Web インタフェースにて WAN の設定を行なえばよい。 例えば「DHCP」を設定すると、 /etc/config/fon の該当箇所が

config network wan
	option mode	'dhcp'
	option ipaddr	''

となるので、「/sbin/ifup wan」を実行するか、 あるいは再起動すれば DHCP で取得した IP アドレスが WAN に設定される。

Filed under: La Fonera — hiroaki_sengoku @ 14:15

2 Comments »

  1. FONめも

    FONめも http://wiki.livedoor.jp/okyota/d/F

    Comment by fon登録 設定 徹底解説 無線LAN共有プロジェクト — 2007年2月7日 @ 01:11

  2. 貴重な情報をありがとうございます.ところで,ここでおっしゃっている0.7.1r4って0.7.0r4のまちがいではないでしょうか.

    Comment by tf0054 — 2007年5月13日 @ 02:54

RSS feed for comments on this post.

Leave a comment