ルギア君の戯言

雑多な記事。

Momonga Linux で無線 AP

とりあえず、この構成で説明しましょう。
f:id:lugia:20091020152413p:image
dns.arpa-castle は無線 LAN 側のホスト名。
arpa-castle.fletsphone は有線 LAN 側のホスト名。

必要な物

無線 LAN デバイス

http://linuxwireless.org/en/users/Drivers の内、"AP" の欄が yes になっている物
日本で手に入る物は Broadcom か Ralink が多いかな。
Broadcom なら SSB/PCI/PCI-E/PCMCIA どれでも。
Ralink なら PCI か USB。

やる気・根気・忍耐力

まあ、言うまでもない。

Momonga Linux 6 (または Fedora Core 11) がインストールされたパソコン

これがアクセスポイントになるんだから当然。

hostapd 0.6.9 以上

Momonga Linux 6 STABLE の場合はソースビルドでお願いします。
RPM 化は未定です(僕以外のだれかが入れるかも知れないが)
Fedora Core の場合は RPM があるようです。

Dnsmasq

dhcpd + bind でも良いが設定が面倒なので簡単なほうで。

iptables

これは標準でインストールされているはず。

CLI の基本的な知識

コマンドラインで作業します。

ifcfg-* の知識 (マニュアル化されていないため)

わからなければ Red Hat のページにあります。

emacs、nano、vi などのテキストエディタ

マウスに手を伸ばさずに済むのでこれらを使った方が良いと思います。
サーバーで X 環境が使えない場合はなおさら。

注意

この説明ではドメイン名は省略します。たとえば setup なら setup.fletsphone、dns なら dns.arpa-castle を差します。

NetworkManager をオフにして network をオンにする。

一時的なら

# service NetworkManager stop
# service network start

恒久的なら

# /usr/sbin/ntsysv

または

$ system-config-services

で。

hostapd をビルドする

hostapd をここから取ってきて解凍し、make するだけです。インストールは hostapd と hostapd_cli を /usr/sbin にコピーするだけで済みます。

hostapd の設定

一緒に入っていた hostapd.conf を見ながら変更してください。

# ↓使用するインターフェースの名前
interface=wlan1

# ↓ブリッジを使う時はコメントを外します。上の構成の場合は不要です。
#bridge=br0

# ↓linuxwireless.org のリストにあるデバイスを使用する時はこれを使います。
driver=nl80211

# ↓kill -s SIGUSR1 $(hostapd の PID) をするとこのファイルに接続中のステーションの情報が書き込まれます。
dump_file=/tmp/hostapd.dump

# ↓hostapd_cli で使うソケットの場所を指定します。
ctrl_interface=/var/run/hostapd

# ↓hostapd_cli でコントロールできるユーザーをグループIDで指定します。
ctrl_interface_group=0

# ↓ステーションのSSIDを指定します。
ssid=test

# ↓国を指定します。日本の場合は JP。
country_code=JP

# ↓1にすると国情報、速度制限情報を配信します。
ieee80211d=1

# ↓ハードウェアで対応している規格を a b g の中から指定します。a -> IEEE 802.11a
hw_mode=g

# ↓チャネル番号
channel=2

# ↓ビーコンを送る間隔 (1024ミリ秒単位)
beacon_int=256

# ↓トラフィック情報をここで指定した個数のビーコンが送られた時に送ります。
dtim_period=2

# ↓接続可能な最大ステーション数
max_num_sta=255

# ↓RTS/CTSスレッショルド
rts_threshold=2347

# ↓フラグメンテーションスレッショルド
fragm_threshold=2346

# ↓転送速度の指定
#supported_rates=10 20 55 110 60 90 120 180 240 360 480 540

# ↓MACアドレス許可設定
# 0 = 拒否リストに無い物は許可
# 1 = 許可リストに無い物は拒否
# 2 = 外部の RADIUS サーバーを使用
macaddr_acl=0

# 上が許可リスト、下が拒否リスト
# MAC アドレスを1行に1つずつ書く。
# 空でも touch しておく。
accept_mac_file=/etc/hostapd.accept
deny_mac_file=/etc/hostapd.deny

# 0 = オープンシステム認証
# 1 = キー共有認証 (WEP が必要)
auth_algs=0

# 0 = 通常通り
# 1 = 空の SSID ビーコンを送る (発見されなくなる)
# 2 = クリアされた SSID ビーコンを送る (空白の SSID として見付かる)
ignore_broadcast_ssid=1

# 使う WEP キー番号
# コメントアウトしておけば無効
wep_default_key=0
# WEP キー
wep_key0=0102030405
#wep_key1="vwxyz"
#wep_key2=0102030405060708090a0b0c0d
#wep_key3=".2.4.6.8.0.23"

# 自分のIPアドレス
own_ip_addr=192.168.10.1

まあ、こんなものかな。他を当たればもっといろいろ載ってるよ。たとえば WPA とか。

hostapd の手動起動

# hostapd -B /etc/hostapd.conf

フォアグラウンドで動作してほしい場合は -B を消す。無線機で SSID が見付かるか確認してほしい。


WEP キーを設定したのに iwconfig で

wlan1     IEEE 802.11bg  Mode:Master  Frequency:2.417 GHz  Tx-Power=20 dBm
          Retry min limit:7   RTS thr=2347 B   Fragment thr=2346 B
          Encryption Key:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

となる場合は iwconfig で手動設定する。

# iwconfig wlan1 key [16進]
# iwconfig wlan1 key s:[文字列]

dnsmasq

この設定が簡単なのは /etc/hosts と /etc/resolv.conf および独自の設定ファイル /etc/dnsmasq.conf を使うから。
え? 多い?


まずは /etc/hosts

127.0.0.1	localhost localhost.localdomain
::1         	localhost localhost.localdomain
192.168.1.1 	setup.fletsphone
192.168.1.11	arpa-castle.fletsphone
192.168.10.1	dns.arpa-castle
192.168.10.11	NintendoDS.arpa-castle
192.168.10.12	NintendoWii.arpa-castle
192.168.10.13	PSP.arpa-castle

こんな風に IP アドレスとホスト名を列挙するだけ。


次に /etc/resolv.conf

; generated by /sbin/dhclient-script
search fletsphone
nameserver 192.168.1.1

有線 LAN 側で dhcp を使っていると勝手に書き換わってしまいます。その時は、dnsmasq.conf で設定。


最後に /etc/dnsmasq.conf

# ↓無線側で Windows 機を使うならコメントを外す。
# (DNSリクエストが少し特殊らしい)
#filterwin2k

# resolv.conf の場所 (/etc/resolv.conf なら設定不要)
#resolv-file=

# /etc/resolv.conf を使わない場合、コメントを外す。
#no-resolv

# ↓追加の DNS サーバー
server=/setup.fletsphone/192.168.1.1

# ↓DHCP サービスを行わないインターフェース
no-dhcp-interface=eth0

# ↓配布するアドレスの範囲とリース時間(この場合は 12 時間)
dhcp-range=192.168.10.14,192.168.10.99,255.255.255.0,12h

# ↓固定割り当てを行う場合、MACアドレスとIPアドレスを列挙
dhcp-host=00:1a:73:49:1e:cf,192.168.10.1
dhcp-host=00:09:bf:ff:91:a1,192.168.10.11
dhcp-host=00:22:d7:4e:3d:f1,192.168.10.12
dhcp-host=00:23:4d:68:05:72,192.168.10.13

# ↓デフォルトゲートウェイとして 192.168.10.1 を配布。
# DNS は自動的に「自分」を配布する。
dhcp-option=3,192.168.10.1

他にもいっぱい有るのでファイルのコメントを参照。

起動

# service dnsmasq start

で。

確認

$ dig @localhost NintendoDS.arpa-castle

してみる。

; <<>> DiG 9.6.1-P1-Momonga-9.6.1-3m.mo6 <<>> @localhost NintendoDS.arpa-castle
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16271
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;NintendoDS.arpa-castle.                IN      A

;; ANSWER SECTION:
NintendoDS.arpa-castle. 0       IN      A       192.168.10.11

;; Query time: 21 msec
;; SERVER: ::1#53(::1)
;; WHEN: Thu Oct 22 12:53:42 2009
;; MSG SIZE  rcvd: 56

こんな結果になる。


または

$ ping dns.arpa-castle

してみる。(resolv.conf に自分がはいっていることを確認して!)

ifcfg-* の設定

/etc/sysconfig/network-scripts に入っています。


有線側

# Networking Interface
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:17:A4:E1:39:C1
ONBOOT=yes
TYPE=Ethernet
IPV6INIT=no
USERCTL=no
NM_CONTROLLED=no
PEERDNS=yes

HWADDR はデバイスの MAC アドレス。
DHCP から IP をもらう。


無線側

# WLAN Interface
DEVICE=wlan1
BOOTPROTO=static
HWADDR=00:1A:73:49:1E:CF
TYPE=Wireless
NM_CONTROLLED=no
USERCTL=no
IPV6INIT=no
ONBOOT=yes
IPADDR=192.168.10.1
NETWORK=192.168.10.0
NETMASK=255.255.255.0
BROADCAST=192.168.10.255

上のように固定する。
NETWORK の計算は

IPADDR & NETMASK

で、BROADCAST の計算は

IPADDR | ~NETMASK

で。っていっても C 言語わからくちゃだめかw
こんな書き方はできないけどねw

ルーティング

Web Caster V120 で 192.168.10.x 宛のパケットは 192.168.1.11 へ送信するようにします。
arpa-castle 側は

[lugia@arpa-castle ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 wlan1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 wlan1
169.254.0.0     0.0.0.0         255.255.0.0     U     1004   0        0 eth0
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

みたいになってれば問題ないはずです。


ダメだったらマスカレーディングを使います。

$ system-config-firewall

のマスカレーディングのところで有線デバイスと無線デバイスにチェックを付けて「適用」をクリックします。

もちろん CLI もありますが、面倒だったので GUI を使わせてもらいましたw


/etc/sysconfig/iptables に

-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -i wlan1 -j ACCEPT
-A FORWARD -o eth0 -j ACCEPT
-A FORWARD -o wlan1 -j ACCEPT

こう書けば良いっぽい。


これでちゃんと接続できるでしょう(笑)
できなくても文句は言わないでほしい。なんて言ったってこの記事結構いい加減なので(笑)

起動時に有効になるようにする

hostapd を自前でビルドした時は起動スクリプトがないので、自分で書く。

#!/bin/bash
### BEGIN INIT INFO
# Provides: hostapd
# chkconfig: - 16 84
# config: /etc/hostapd.conf
# Short-Description: A Mastermode.
# Description: 
### END INIT INFO

# source function library
. /etc/init.d/functions

# Get network config
. /etc/sysconfig/network

RETVAL=0
PROG="hostapd"
cmd=hostapd
LOCK_FILE=/var/lock/subsys/hostapd
CONF_FILE=/etc/hostapd/hostapd.conf
iwconf=iwconfig

case "$1" in
  start)
	# Check that networking is up.
	[ "${NETWORKING}" = "no" ] && exit 1

	# The process must be configured first.
	[ -f $CONF_FILE ] || exit 6

	echo -n $"Starting $PROG: "
        daemon $cmd -B $HOSTAPD_OPTS $CONF_FILE
	RETVAL=$?
	[ $RETVAL -eq 0 ] && touch $LOCK_FILE
	interface=`cat $CONF_FILE | grep -P "^\\s*interface=" | sed 's,^interface=\(.*\)$,\1,'`
	wep_key=`cat $CONF_FILE | grep -P "^\\s*wep_key0=" | sed 's,^wep_key0=\(.*\)$,\1,'`
	$iwconf $interface key $wep_key
	echo
	;;
  stop)
	echo -n $"Shutting down $PROG: "
	killproc $cmd
	RETVAL=$?
	[ $RETVAL -eq 0 ] && rm -f $LOCK_FILE
	echo
	;;
  restart|reload)
        $0 stop
        $0 start
	RETVAL=$?
        ;;
  condrestart)
        if [ -f $LOCK_FILE ]; then
                $0 stop
		$0 start
        fi
	RETVAL=$?
        ;;
  status)
        status $cmd
	RETVAL=$?
        ;;
  *)
	echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
	exit 2
esac

exit $RETVAL

上のコメントブロックは system-config-services で使われます。これを /etc/init.d に突っ込んで有効にしてあげれば完成。


終わり。