FONルータをいじってみる

他のFONのアクセスポイントについてはそもそも電波がつかめていないので、あまり使えない印象ですが、FONルータに関して言えば、11nの無線LANアクセスポイントとしては安定して動作しています。


ただ、かなりマニュアル通りにいかない・・・というかトラブルに見舞われてます。


1.導入時
マニュアル通りであれば、ルータの設置時、最初に起動したときの設定Wizard上でネットワークに登録する画面が出てくる・・・はずなのですが、実際には登録画面が出ずにfonのサイトにリダイレクトされてしまいました。MyFonのページでもAlien表示のまま。公式サイトの情報もあまり役に立たず、結局はWebで検索した方法で登録ができたようです。
無線LANでFON_FREE_INTERNETに接続し、
https://www.fon.com/en/userzone/registerAPにアクセスする。

既存のネットワークと整合を取りつつ無線LANも導入したいし、公開側(FON_FREE_INTERNET)からのアクセスも開けたいのでセキュリティも考慮しておきたい...ということでネットワークの構造はかなり悩みました。
結局Firewall2台でサンドイッチ構造にしました。


2.FON_FREE_INTERNETがつながらない
どちらかと言えば、こちらが問題だと思うのですが。プライベート側のWLAN(SSID:MyPlace)に関しては問題無く動作しているのですが、パブリック側のWLAN(SSID:FON_FREE_INTERNET)がつながったり、切れたりを繰り返します。sshでログインすると、まんまOpenWrtなんでどういう状態になっているかは確認できています。


sshでログインすると・・・
    BusyBox v1.11.1 (2010-02-17 13:46:25 CET) built-in shell (ash)
    Enter 'help' for a list of built-in commands.

                                   __
                      ,_         .'  '._______
                     ; `\      / -=o=.-""""""`
                     ;   \    /     /
          __...----...;_  `;.:`"=._/
         '-.         `-.``;::'     |
            `-.         `;::'     ;
               `'-.....-/::.     /
                        |::.   .'
                       /\:: .-`
                  jgs /';\ /|
                     /'; ;`;|
                     `-'`-;_/

                   Gari the Hummingbird

    --------  Fonera 20n Firmware (v2.3.6.0) -----------
          * Based on OpenWrt - http://openwrt.org
          * Powered by FON - http://www.fon.com
    ----------------------------------------------------
    root@Fonera:~# uci help
    Usage: uci []  []

    Commands:
            batch
            export     []
            import     []
            changes    []
            commit     []
            add         
            add_list   .
.= show [[.
[.]]] get .
[.] set .
[.]= delete [.]] rename .
[.]= revert [.
[.]] Options: -c set the search path for config files (default: /etc/config) -d set the delimiter for list values in uci show -f use as input instead of stdin -m when importing, merge data into an existing package -n name unnamed sections on export (default) -N don't name unnamed sections -p add a search path for config change files -P add a search path for config change files and use as default -q quiet mode (don't print error messages) -s force strict mode (stop on parser errors, default) -S disable strict mode -X do not use extended syntax on 'show' root@Fonera:~# uci show registered registered.fonreg=fonreg registered.fonreg.registered=1 registered.fonreg.dev=0 root@Fonera:~#

どうもchilliのプロセスが1分45秒程度の間隔で再起動されているっぽいです。ログを見ると・・・

root@Fonera:/etc# cat /var/log/chilli_loop.log
chillispot Wed Aug 10 21:19:14 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:21:07 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:22:59 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:24:51 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:26:43 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:28:35 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:30:27 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:32:19 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:34:11 UTC 2010 NO RELOAD
chillispot Wed Aug 10 21:36:03 UTC 2010 NO RELOAD



プロセスを確認すると、何故か再起動中。

root@Fonera:/etc# ps -ef | grep chilli
27695 root      1988 S    sh -c /etc/init.d/chillispot restart
27696 root      2076 S    /bin/sh /etc/rc.common /etc/init.d/chillispot restart
27718 root      2580 S    /usr/sbin/chilli_radconfig -c /dev/null --radiusserve
root@Fonera:/etc#


正常時はchilliのプロセスプロセスだけです。

root@Fonera:/etc# ps -ef | grep chilli
27833 root      4276 S    /usr/sbin/chilli --dns1=192.168.182.1 --dns2=192.168.
root@Fonera:/etc#


再起動で何をやっているかと言えば・・・
root@Fonera:~# cat /etc/init.d/chillispot 
#!/bin/sh /etc/rc.common
TMP_C=/tmp/chilli.conf
ETC_C=/etc/chilli.conf
PID_F=/var/run/chilli.pid
PID_LOOP_F=/var/run/chilli_loop.pid
LOG_LOOP_F=/var/log/chilli_loop.log
LOOP=true
WHITELIST=/etc/fon/whitelist.dnsmasq

DEVICE=$(cat /etc/fon_device)
VERSION=$(cat /etc/fon_version)
REVISION=$(cat /etc/fon_revision)

RADIUSSERVER1=radconfig01.fon.com
RADIUSSERVER2=radconfig02.fon.com
RADIUSSECRET=garrafon
RADIUSADMUSR=FON02-${DEVICE}-${VERSION}.${REVISION}
RADIUSADMPWD=chillispot


quit()
{
LOOP="false"
circular_log $LOG_LOOP_F "Signal caught. Exiting..."
}

circular_log() {
echo "chillispot $(date) $2" >> $1
tail -24 $1 > $1.tmp
mv $1.tmp $1
}

is_alive() {
if [ ! -f $PID_F ]; then
echo "dead"
return 0
fi

TEST_PID=$(cat $PID_F)

if [ ! -d /proc/$TEST_PID ]; then
rm $PID_F
echo "dead"
return 0
fi

CANDIDATE=$(cat /proc/$TEST_PID/status | grep Name: | awk '{ print $2 }')

if [ "$CANDIDATE" = "chilli" ]; then
echo "alive"
return 0
else
rm $PID_F
echo "dead"
return 0
fi
}

parse_whitelist() {
        if [ -s $TMP_C ]; then
                awk '/newdomain/ { print $2 }' $TMP_C |
                awk -F. '/[a-zA-Z0-9\-\_]/ { print }' |
                sed s/,/\\n/g > $WHITELIST
# Remove IPs that may have skipped the validation
cat $WHITELIST | grep -v [0-9]$ > $WHITELIST

                sed /^newdomain/d -i $TMP_C
        fi
}

radconfig() {
/usr/sbin/chilli_radconfig \
-c /dev/null \
--radiusserver1="$RADIUSSERVER1" \
--radiusserver2="$RADIUSSERVER2" \
--radiussecret="$RADIUSSECRET" \
--adminuser="$RADIUSADMUSR" \
--adminpasswd="$RADIUSADMPWD" \
--radiusnasid="$MAC" \
--dhcpif $wifi_ifname \
--wwwbin=/bin/true \
--ipup=/bin/true \
--ipdown=/bin/true \
> $TMP_C
parse_whitelist

[ -n "$(cat $TMP_C)" ] && {
MD5SUM_TMP=$(md5sum $TMP_C | awk '{ print $1 }')
MD5SUM_ETC=$(md5sum $ETC_C | awk '{ print $1 }')
if [ ! "$MD5SUM_TMP" = "$MD5SUM_ETC" ]; then
rm $ETC_C
mv $TMP_C $ETC_C
circular_log $LOG_LOOP_F "RELOAD"
return 0
else
circular_log $LOG_LOOP_F "NO RELOAD"
return 1
fi
return 1
}

circular_log $LOG_LOOP_F "NO RELOAD"
return 1
}

get_info() {
. /lib/fon/config.sh

if [ "${DEVICE}" == "fonera20n" ]; then
MAC=$(ifconfig eth0.1 | grep HWaddr | awk -F "HWaddr " '{ print $2 }' | awk '{gsub(":","-",$1); print substr($0,0,17) }')
else
MAC=$(ifconfig ${wifi_ifname_mac:-wifi0} | grep HWaddr | awk -F "HWaddr " '{ print $2 }' | awk '{gsub(":","-",$1); print substr($0,0,17) }')
fi
MAC=${MAC:-fon}
#MAC="00-18-84-d0-08-7d"
}

do_start() {
get_info
ifconfig $wifi_ifname 0.0.0.0 down
WAN=`uci -P /var/state get fon.wan.mode`
DISABLE=`uci -P /var/state get fon.advanced.${WAN}`
[ "$DISABLE" == "1" ] && return 1 
SHARE=`uci get fon.advanced.sharewifi`
[ "$SHARE" == "0" ] && return 1 
if [ "${DEVICE}" == "fonera20n" ]; then
GPIO=`cat /proc/gpio_switch`
[ "$GPIO" == "1" ] && return
fi
radconfig

ifup hotspot

# insert a rule to drop handling of traffic that comes in from the wifi interface directly. this interferes with QoS
iptables -t mangle -D PREROUTING -i "$wifi_ifname" -j DROP 2>/dev/null >/dev/null
iptables -t mangle -I PREROUTING 1 -i "$wifi_ifname" -j DROP

# enable the wifi interface ssid
ifconfig $wifi_ifname down
config_get ssid public essid
if [ "${DEVICE}" == "fonera20n" ]; then
echo iwpriv "$wifi_ifname" set SSID="FON_$ssid"
else
iwconfig "$wifi_ifname" essid "FON_$ssid"
fi

ifconfig $wifi_ifname 0.0.0.0 up # deconfigure the wifi interface

/usr/sbin/chilli \
--dns1="192.168.182.1" \
--dns2="192.168.182.1" \
--radiusnasid="$MAC" \
--dhcpif $wifi_ifname \
--papalwaysok \
--pidfile=$PID_F \
--localusers=/etc/fon/localusers \
--wwwbin=/bin/true \
--ipup=/bin/true \
--ipdown=/bin/true \
--conup="fs -l hotspot_inccount" \
--condown="fs -l hotspot_decount"

[ $? == 0 ] && return 0
return 1
}

start() {
[ alive = "$(is_alive)" ] && return 0
do_start
# amazing automonitoring system.
[ $? == 0 ] && fs -l hotspot_wdt_start
}

restart() {
fs -l hotspot_wdt_stop
killall chilli > /dev/null 2>&1
rm -f /var/run/chilli.pid
do_start
[ $? == 0 ] && fs -l hotspot_wdt_start 
}

stop() {
get_info

fs -l hotspot_wdt_stop

[ alive = "$(is_alive)" ] || {
echo ERROR: chillispot is not running
[ -f $PID_LOOP_F ] && kill $(cat $PID_LOOP_F) > /dev/null 2>&1
rm -f $PID_LOOP_F > /dev/null 2>&1
exit 0
}

[ -f $PID_F ] && kill $(cat $PID_F) >/dev/null 2>&1
rm -f $PID_F
[ -f $PID_LOOP_F ] && kill $(cat $PID_LOOP_F) > /dev/null 2>&1
rm -f $PID_LOOP_F
# disable the wifi interface ssid
ifconfig "$wifi_ifname" down
circular_log $LOG_LOOP_F "STOP"
}

alive() {
ALIVE=$(is_alive)
echo "chillispot is $ALIVE"
if [ $ALIVE = "alive" ]; then
exit 1
fi

exit 0
}

reload() {
get_info
radconfig
killall -HUP chilli
}

たいしたことはやってませんね。本当にただのプロセス再起動です。



さて、上位のFirewallのアクセスログも確認していたのですが気になる箇所があって、chilli.confの中身を見てみると
root@Fonera:~# cat /etc/chilli.conf 
##############################################################################
#
# Fon ChilliSpot configuration file
# Powered by FON (www.fon.com)
#
##############################################################################
radiusserver1 radius01.fon.com
radiusserver2 radius02.fon.com
radiussecret garrafon
uamserver https://login.fon.com/cp/index.php
uamsecret garrafon
uamallowed www.fon.com,www.paypal.com,www.paypalobjects.com,www.skype.com
uamanydns

radius01.fon.comとradius02.fon.comにアクセスしそうな記述があるのですが、

root@Fonera:~# nslookup radius01.fon.com
Server:    210.130.1.1
Address 1: 210.130.1.1 ns11.iij4u.or.jp

Name:      radius01.fon.com
Address 1: 213.134.45.160
root@Fonera:~# nslookup radius02.fon.com
Server:    210.130.1.1
Address 1: 210.130.1.1 ns11.iij4u.or.jp

Name:      radius02.fon.com
Address 1: 213.134.45.161

Firewallのアクセスログを見ると、213.134.45.162と213.134.45.163のRadius(udp1812)に1分に1回程度で何か送っている。164バイト程度の時と、328バイト程度の時がある。
ということで、FONルータが何か送っているようなのですが、詳細は不明です。

もう一つ、他のサイトの情報から定期的に自分の生存をfonサイトに送る仕様(213.134.45.191のポート1937に定期的にアクセスする)・・・だという事なんですが、アクセスログに何ものっていない。


何となくというレベルの推測ですが、やはりルータの登録に失敗していて、FONルータの内部で初期設定のWizardで設定されるべき何かがされていないんじゃ無かろうかと。