hostapd 設定 覚書

# 必要な機材
ath5k または ath9k ドライバに対応し、
かつアクセスポイント機能を持った無線 LAN デバイス。

# パッケージインストール
```
apt-get install hostapd iw isc-dhcp-server haveged
```

# ネットワークの構成
[/etc/network/interfaces](http://qiita.com/JhonnyBravo/items/135aa654d7a4b5c64c34) を編集する。

```
# lo インターフェイスを起動する。
auto lo
# 論理インターフェイス lo を
# IPv4 loopback インターフェイスとして定義する。
iface lo inet loopback

# wlan0 インターフェイスを起動する。
auto wlan0
# 論理インターフェイス wlan0 へ IPv4 固定アドレスを定義する。
iface wlan0 inet static
  address 192.168.0.1
  netmask 255.255.0.0
  gateway 192.168.0.1
  dns-name-servers 8.8.8.8
  wireless-mode master
```

``/etc/NetworkManager/NetworkManager.conf`` を編集する。

```
[keyfile]
unmanaged-devices=mac:無線LAN の MAC アドレス
```

[/etc/default/ufw](http://qiita.com/JhonnyBravo/items/6ad183637a9d2a09b1f7) を編集する。

```
# IPv6 サポートを有効にする。
IPV6=yes

# 外部から入ってくる通信を破棄する。
DEFAULT_INPUT_POLICY="DROP"

# 外部へ出て行く通信の通過を許可する。
DEFAULT_OUTPUT_POLICY="ACCEPT"

# パケット転送を許可する。
DEFAULT_FORWARD_POLICY="ACCEPT"

DEFAULT_APPLICATION_POLICY="SKIP"

# ufw 自身が作成したチェーンのみを操作対象とする。
MANAGE_BUILTINS=no

# iptables のバックエンドとして /etc/ufw/sysctl.conf を使用する。
IPT_SYSCTL=/etc/ufw/sysctl.conf

# 拡張トラッキングモジュールの読込み設定
IPT_MODULES="nf_conntrack_ftp nf_nat_ftp nf_conntrack_netbios_ns"
```

[/etc/ufw/sysctl.conf](http://qiita.com/JhonnyBravo/items/f66eef4ccf6de1360454) を編集する。

```
# パケット転送を有効にする。
net/ipv4/ip_forward=1

# 送信元アドレスの検証を全インターフェイスで有効にし、
# なりすまし攻撃を防止する。
net/ipv4/conf/default/rp_filter=1
net/ipv4/conf/all/rp_filter=1

# IP ソースルートパケットを受信しない。
net/ipv4/conf/default/accept_source_route=0
net/ipv4/conf/all/accept_source_route=0
net/ipv6/conf/default/accept_source_route=0
net/ipv6/conf/all/accept_source_route=0

# ICMP リダイレクトを無効化し、
# MITM 攻撃を防止する。
net/ipv4/conf/default/accept_redirects=0
net/ipv4/conf/all/accept_redirects=0
net/ipv6/conf/default/accept_redirects=0
net/ipv6/conf/all/accept_redirects=0

# 偽の ICMP エラーを無視する。
net/ipv4/icmp_echo_ignore_broadcasts=1
net/ipv4/icmp_ignore_bogus_error_responses=1
net/ipv4/icmp_echo_ignore_all=0

# 有り得ないパケットを記録しない。
net/ipv4/conf/default/log_martians=0
net/ipv4/conf/all/log_martians=0

# TCP / IP SYN クッキーを無効にする。
net/ipv4/tcp_syncookies=0

net/ipv4/tcp_sack=1
```

[/etc/ufw/before.rules](http://qiita.com/JhonnyBravo/items/3416bb092e7e74d06577) を編集する。

```
# filter テーブルの設定。
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]

# loopback インターフェイスにおける送受信を許可する。
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

# 既存のパケットの受信・送信・転送を許可する。
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 不正なパケットを破棄する。
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP

# 受信における icmp コードを受入れる。
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# 転送における icmp コードを受入れる。
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type source-quench -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT

# dhcp クライアントの動作を許可する。
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT

-A ufw-before-input -j ufw-not-local
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN

# 上記以外の non-local パケットは破棄する。
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP

# MULTICAST UPnP のサービス探査を許可する。
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT

COMMIT

# nat テーブルの設定。
*nat

# 送信時のアドレス変換を許可する。
:POSTROUTING ACCEPT [0:0]

# パケット転送先のインターフェイスを eth0 とする。
# アドレスを変換する。
-A POSTROUTING -o eth0 -j MASQUERADE

COMMIT
```

[/etc/dhcp/dhcpd.conf](http://qiita.com/JhonnyBravo/items/e5324715efa9a9264c9d) を編集する。

```
# リース確認の際に DNS の更新を試行しない。
ddns-update-style none;

# ネットワーク全体の共通設定。
option domain-name "example.org";
option domain-name-servers 192.168.1.1;

default-lease-time 600;
max-lease-time 7200;

# dhcp ログメッセージを異なるログファイルへ送信する。
log-facility local7;

# サブネットの設定。
subnet 192.168.0.0 netmask 255.255.0.0{
  # 192.168.0.10 から 192.168.0.20 の間で IP アドレスを発行する。
  range 192.168.0.10 192.168.0.20;
  option domain-name-servers 8.8.8.8;
  option routers 192.168.0.1;
  default-lease-time 600;
  max-lease-time 7200;
}
```

[/etc/default/isc-dhcp-server](http://qiita.com/JhonnyBravo/items/210ec3c02e362da03dcd) を編集する。

```
# isc-dhcp-server の設定ファイルとして
# /etc/dhcp/dhcpd.conf を使用する。
DHCPD_CONF=/etc/dhcp/dhcpd.conf

# /var/run/dhcpd.pid を
# isc-dhcp-server の PID ファイルとして使用する。
DHCPD_PID=/var/run/dhcpd.pid

# wlan0 インターフェイスを dhcp サーバとして使用し、
# dhcp リクエストを待ち受ける。
INTERFACES="wlan0"
```

# hostapd の設定
[/etc/default/hostapd](http://qiita.com/JhonnyBravo/items/f6bd366cb1b3a8acabe5) を編集する。

```
# /etc/hostapd/hostapd.conf を hostapd の設定ファイルとして使用する。
# hostapd はシステム起動時に起動する。
DAEMON_CONF="/etc/hostapd/hostapd.conf"

# -dd オプションを適用して hostapd を起動する。
# /var/log/syslog へ詳細なログメッセージを出力する。
DAEMON_OPTS="-dd"
```

[/etc/hostapd/hostapd.conf](http://qiita.com/JhonnyBravo/items/5df2d9b2fcb142b6a67c) を編集する。
雛形は ``/usr/share/doc/hostapd/examples/hostapd.conf.gz`` に収められている。

```
# wlan0 インターフェイスをアクセスポイントとして使用する。
interface=wlan0

# nl80211 ドライバを使用する。
driver=nl80211

# syslog へ全モジュールのログを記録する。
logger_syslog=-1
# 記録するレベルは informational message までとする。
logger_syslog_level=2

# バックグラウンド動作していない場合に限り、
# 全モジュールのログを stdout へ出力する。
logger_stdout=-1
# 出力するレベルは informational message までとする。
logger_stdout_level=2

# /var/run/hostapd へ UNIX ドメインソケットを作成する。
ctrl_interface=/var/run/hostapd
# gid 0(root) へ制御インターフェイスへの接続を許可する。
ctrl_interface_group=0

# ssid 名。
ssid=任意の ssid 名

# 日本で使用可能な電波出力とチャンネルを使用する。
country_code=JP

# IEEE 802.11d を有効にする。
# country_code を通知し、規制に基づいて
# 電波出力とチャンネルを設定する。
ieee80211d=1

# IEEE 802.11g の帯域を使用する。
hw_mode=g

# チャンネル設定
channel=1

beacon_int=100
dtim_period=2

# 最大 3 台までの端末接続を許可する。
max_num_sta=3

rts_threshold=2347
fragm_threshold=2346

# 接続端末の MAC アドレスに基づく認証を無効にする。
macaddr_acl=0

# 認証アルゴリズムとして Shared Key Authentication を使用する。
auth_algs=1

# 完全な ssid を知らない場合でも接続を許可する。
ignore_broadcast_ssid=0

# wmm パラメータの設定。
wmm_enabled=1
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
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
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
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

# 送信失敗が頻発するか、何らかの原因で接続が失われると
# 端末の接続解除を実行する。
disassoc_low_ack=1

# HT PHY をサポートしない端末でも接続を許可する。
require_ht=0

eapol_key_index_workaround=0

eap_server=0

# アクセスポイント自身の IP アドレスを 127.0.0.1 とする。
own_ip_addr=127.0.0.1

# WPA2 を使用する。
wpa=2

# 接続認証に使用するパスワード。
wpa_passphrase=任意のパスワード

# 鍵管理アルゴリズムとして WPA-PSK を使用する。
wpa_key_mgmt=WPA-PSK

# RSN / WPA2 の共有鍵暗号化方式として CCMP を使用する。
rsn_pairwise=CCMP
```

# コマンド
## sudo lsmod | grep ath
無線 LAN デバイスが ath5k, ath9k に対応しているかどうかを確認する。

## iw list
無線 LAN デバイスがサポートしている機能を表示する。

## hostapd -d /etc/hostapd/hostapd.conf
設定ファイルをテストする。構成エラーがある場合にはエラーが表示され、
hostapd の実行を中断する。
エラーが無い場合は hostapd が起動され、コンソールへデバッグメッセージが表示される。

## service hostapd start
hostapd を起動する。

## service hostapd restart
hostapd を再起動する。

## service isc-dhcp-server restart
isc-dhcp-server を再起動する。

## ufw disable && ufw enable
ufw を再起動する。