TenForward

あまり詳しくない分野のメモを書きます。技術的なネタは http://d.hatena.ne.jp/defiant/ に書くことが多いです。

Raspberry Pi を無線 LAN アクセスポイントに

自宅には Buffalo の無線 LAN ルーターがあって,それをアクセスポイント (以降 AP) として使っているのですが,とある理由でもう 1 つ別の AP を置こうということになり,丁度余っていた Raspberry Pi を AP に仕立てる事にしました.

同じ内容を扱うブログエントリは検索すると多数出てきますので,これは単なる個人用メモ代わりに近いです.検索で出てくる多くの内容は無線 LAN 側にアドレスを割り当てて iptables で NAT するパターンが多いですが,自宅だと既に NAT がかかっている事が多く,さらに NAT する意味がウチで使う限りはあまり感じられないので,単なるブリッジとして設定してみました.

USB 無線 LAN 子機

選択した無線 LAN 子機は Buffalo の WLI-UC-GNM2T というものでした.これだと AP として使うソフトの hostapd が対応している模様なので (WLI-UC-GNM2 というパッケージだけ違うモデルもあります.WLI-UC-GNM は似てるけど使ってるチップが違う模様)

Raspberry Pi 側の準備

  1. 普通に Raspbian をインストールします
  2. 追加でパッケージをインストールします
    $ sudo apt-get install bridge-utils hostapd
  3. /etc/network/interfaces の設定
    auto lo
    iface lo inet loopback
    iface eth0 inet manual
    allow-hotplug wlan0 iface wlan0 inet manual
    auto br0 iface br0 inet dhcp bridge_ports eth0
    • ブリッジ br0 を作成し,DHCP でアドレスを取得します.eth0, wlan0 を manual にして,eth0 を br0 にアタッチします.wlan0 は後ほど hostapd で br0 にアタッチする設定をします

hostapd の設定

パッケージに含まれない設定ファイルを /etc/hostapd/hostapd.conf に作成します.あまり意味分かってません.サンプルファイルを元に設定しました.

  • bridge=br0 で br0 にアタッチしています
  • wmm_* という設定は検索して出てくる設定例にはないことが多いですが,ないと問題が起きるという事が書いてある所もあったのでサンプルのものそのままで設定しました
    • WPA2 の所はこんな感じで良いのかなあと.
# interface
interface=wlan0
bridge=br0

# driver
driver=nl80211

# logger
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

# files
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd

ctrl_interface_group=0


##### IEEE 802.11 related configuration #######################################

ssid=黄巾のLAN
country_code=JP
ieee80211d=1
hw_mode=g
channel=1
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346

macaddr_acl=0
#accept_mac_file=/etc/hostapd.accept
#deny_mac_file=/etc/hostapd.deny

auth_algs=3
ignore_broadcast_ssid=0

wmm_enabled=1
# Low priority / AC_BK = background
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
# Normal priority / AC_BE = best effort
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
# High priority / AC_VI = video
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
# Highest priority / AC_VO = voice
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0

wpa=2
wpa_passphrase=hogehoge
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP

サービスを起動させると

root@raspberrypi:/etc/cron.d# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.b0c74546d440   no      eth0
                            wlan0

こんな感じで br0 にアタッチされてます.Android 4.1, iOS 7, Mac OS 10.9 で接続できました.