Wireless Access Point

https://help.ubuntu.com/community/WifiDocs/WirelessAccessPoint の和訳。

# Introduction
コンピュータネットワークおいて、Wieless Access Point(WAP) とは、 
無線ネットワークを形成する無線通信装置へ接続するデバイスを表す。 
WAP は有線 / 無線ネットワークへ接続することができ、 
デバイス間でデータの受渡しをすることができる。 WAP の用途はいくつかのシナリオがある。

* ホームネットワークの構築。

* 複数の WAP 同士を接続し、クライアント間で途切れることなく 
  自由に通信を行うことを許可する、より大きなネットワークを形成する。

* Ad-hoc ネットワークにおいて無線クライアントデバイスを管理する。

# 無線から無線へ接続するルータの構築
## 概要
家庭またはホームオフィスを対象とする構築例。下記のシナリオを適用する。

* LAN ケーブルの敷設は避けたい。

* ISP がモデムに割当てるIP アドレスを一つに制限しており、 
  IP アドレスの操作は困難であるか、ISP は無線ルータのみを提供している。

* 追加の機器購入は避けたい。

## 前提条件

* パソコンをルータ化する。

* Kubuntu Desktop 14.04.1 x64

* wlan0 がアクセスポイント機能をサポートしている。 
  サポートの有無は下記のコマンドで確認する。
  この例では Qualcomm Atheros AR9287 Wireless Network Adapter 
  (PCI-Express) 168c:002e (rev 01) を使用する。

```
# AP と表示があれば OK 。
iw list

* AP
```

* wlan1 が管理モードをサポートしている。 
  サポートの有無は下記のコマンドを実行して確認する。
  この例では Belkin N300 Wireless USB Adapter F9L1002v1 050d:845a を使用する。

```
# Managed と表示があれば OK 。
iw list

* Managed
```

* 無線クライアントデバイス

* ISP は無線ルータのみを提供する。

## Install Kubuntu
インストール時、初期ユーザは自動的にログインするように設定する。

## Setup hostapd, port forwarding, haveged, and dnsmasq
hostapd をインストールし、システム起動時に wlan0 を使用して自動的に起動し、 
WPA2-Personal 802.11n, 2.4GHz (150 Mbps) を使用して通信を行うように設定する。

```
sudo apt-get -y install hostapd
sudo nano /etc/default/hostapd
```

```sh:/etc/default/hostapd
# システム起動時に /etc/hostapd/hostapd.conf を読込み、 
# hostapd をデーモンとして起動する。
DAEMON_CONF="/etc/hostapd/hostapd.conf"
```

```
sudo nano /etc/hostapd/hostapd.conf
```

```sh:/etc/hostapd/hostapd.conf
# Shared Key Authentication を使用する。
auth_algs=1
beacon_int=50
channel=3
# 日本で使用可能な電波出力とチャンネルを使用する。
country_code=JP
# 送信失敗が頻発するか何らかの原因で接続が失われると端末の接続解除が実行される。
disassoc_low_ack=1
# nl80211 ドライバを使用する。
driver=nl80211
# IEEE 802.11g の帯域を使用する。
hw_mode=g
ht_capab=[HT40+][HT40-][SHORT-GI-40][RX-STBC1]
# IEEE 802.11d を有効にする。
ieee80211d=1
# IEEE 802.11n(HT) を有効にする。
ieee80211n=1
# wlan0 をアクセスポイントとして使用する。
interface=wlan0
# HT PHY をサポートしていない場合でも接続を許可する。
require_ht=0
# RSN / WPA2 の共有鍵暗号化方式として CCMP を使用する。
rsn_pairwise=CCMP
# YOURSSID を SSID として使用する。
ssid=YOURSSID
wmm_enabled=1
# IEEE 802.11i / RSN(WPA2) を有効にする。
wpa=2
# WPA-PSK 鍵管理アルゴリズムの使用を許可する。
wpa_key_mgmt=WPA-PSK
# WPA-PSK のパスワード
wpa_passphrase=YOURPASSPHASE
```

country code, ssid, wpa_passphrase は適宜置換える。

Windows 8.1 client (Qualcomm Atheros AR956x Wireless Network Adapter)は 
`` require_ht=1`` を設定すると接続できない。 
イベントビューアは「ルータまたはアクセスポイントからの応答がありません」と 記録する。
しかし同じクライアント端末を Ubuntu で起動するか、 Mac OS X Yosemite を使用するか、 
iPhone、android smartphone の場合は 正常に動作する。

起動時にポート転送が自動的に有効になるように設定する。

```
sudo nano /etc/sysctl.conf
```

```sh:/etc/sysctl.conf
# ポート転送を有効にする。
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
```

NAT 通信が自動的に wlan0 から wlan1 へ転送されるように設定する。

```
sudo nano /etc/rc.local
```

```sh:/etc/rc.local
# nat テーブルを参照する。
# 送信時のアドレス変換ルールを追加する。
# パケットを wlan1 から送出する。
# 送信元 IP とポート番号を書き換える。
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
# パケット転送ルールを追加する。
# conntrack モジュールを使用する。
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# パケット転送ルールを追加する。
# wlan0 からパケットを受信し、
# wlan1 からパケットを送信する。
iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT
exit 0
```

ルータと haveged を介する Linux クライアントの既定エントロピー量を増やす。 
Linux OS が 1000 を下回る低エントロピーで動作している場合、 
深刻な暗号化通信の遅延を引起す原因となる。(他の問題を引起す原因ともなる)

```
sudo apt-get -y install haveged
```

DHCP の IP アドレスと MAC アドレスの紐づけを行う為に 
dnsmasq をインストールし、設定する。

```
sudo apt-get -y install dnsmasq
sudo nano /etc/dnsmasq.conf
```

```sh:/etc/dnsmasq.conf
interface=wlan0
except-interface=wlan1
dhcp-range=10.0.0.2,10.0.0.14,12h
```

*Note:*
/etc/dnsmasq.conf へ下記を追加することにより、 
MAC アドレスを指定した IP アドレスへ結び付け、 DHCP へ予約することができる。

```sh:/etc/dnsmasq.conf
dhcp-host:XX:XX:XX:XX:XX,10.0.Y.Z
```

X は MAC アドレス、 Y と Z は紐付けたい IP アドレスの数値に置換える。

## ネットワーク設定
ネットワークの構築にはさまざまなオプションがある。 
一つは GUI 操作の NetworkManager で
インターフェイスとアクセスポイントの /etc/network/interfaces を管理する方法がある。 
この方法はユーザフレンドリーな操作を行うことができる利点を持つ。

もう一つのオプションは /etc/network/interfaces を介して
双方のインターフェイスを設定する方法がある。 
この方法はコンピュータリソースの負担を小さくすることができる。

### Method 1: NetworkManager and /etc/network/interfaces
wlan1 を NetworkManager (全ユーザがこのネットワークへ接続する へチェックを入れる) 
を介してルータへ接続する。 
IP アドレスを固定することで IP アドレスによる接続を簡単に行うことができる。 
コンピュータの管理を簡単にする為に SSH を通じた X11vnc トンネルの構築を推奨する。

wlan0 インターフェイスへ固定 IP アドレスを設定し、 
wireless master mode を設定し、 
ターミナルを介して自動的に起動するように設定する。

```
sudo nano /etc/network/interfaces
```

```sh:/etc/network/interfaces
# lo インターフェイス、 wlan0 インターフェイスを起動する。
auto lo wlan0
# 論理インターフェイス lo を IPv4 loopback インターフェイスとする。
iface lo inet loopback

# access point
# 論理インターフェイス wlan0 へ IPv4 固定アドレスを定義する。
iface wlan0 inet static
   address 10.0.0.1
   netmask 255.255.255.240
   gateway 10.0.0.1
   dns-nameservers 192.168.1.1
   wireless-mode Master
```

NetworkManager へ wlan0 インターフェイスを無視するように設定する。

```
sudo nano /etc/NetworkManager/NetworkManager.conf
```

```sh:/etc/NetworkManager/NetworkManager.conf
[keyfile]
unmanaged-devices=mac:XX:XX:XX:XX:XX:XX
```

X は wlan0 の MAC アドレスに置換える。

## Considerations
* USB の WiFi ドングルに対して、 
  2つの内部 PCIe WiFi アダプタを搭載したコンピュータを利用する。 
  内臓アダプタ同士の通信速度を最大化し、潜在的な USB オーバーヒート問題を避ける。

* 既存のドライバ(ex. ath9k)から派生した開発途上の WiFi ドライバを搭載したデバイス 
  (ex. r8712u ドライバを使用する 
  Belkin N300 Wireless USB Adapter F9L1002v1 050d:845a)
  の使用は避ける。 
  r8712u 搭載デバイスの場合、 ``iwconfig wlan0 txpower 14`` を介する
  アダプタの送信出力低下方法はまだ開発されていない。 

* GUI を使用して管理する場合、 GUI の実行によるリソースの負担が発生する。

# 無線から有線へ接続するブリッジルーターの構築
## 概要
コマンドラインのみで Ubuntu サーバをブリッジ無線ルータとして設定する。

## 前提条件

* ギガビットイーサネットスイッチを使用する。

* インストール設定の為に Ubuntu Server ISO を保存した USB ドライブを使用する。

* 下記のハードウェアを内蔵したコンピュータをルータとして使用する。

1. 管理モードをサポートする無線 NIC(ath0) 。
2. NIC(eth0)

* 任意: ルータを遠隔操作で設定するクライアントコンピュータ。 
  クライアントが Windows である場合は下記を使用する。

1. SSH
2. putty - remote console
3. WinSCP - remote file transfer

## Install Ubuntu Server
Ubuntu Server Edition をインストールする。下記のインストールオプションを選択する。

```
[*] DNS server
[*] OpenSSH server
```

## Ubuntu を更新する

```
sudo apt-get update
sudo apt-get dist-upgrade
```

Ubuntu インストール後に DNS サーバと SSH サーバをインストールする場合は
下記のコマンドを使用する。

```
tasksel
```

## Setup SSH
Ubuntu 端末をルータへ接続する。 
putty で接続する為に Ubuntu の IP アドレスを確認する。

```
ip addr
```

Windows 端末へ putty をインストールする。 
Ubuntu の IP アドレスを putty へ入力し、接続する。 
コマンドをコピーペーストすることができるようになる。 
ファイルを転送したい場合は WinSCP を使用する。

## ネットワーク設定
eth0 は WAN インターフェイス (gateway) 。 
eth1 は LAN インターフェイス。 
ath0 は無線カード。 
br0 は ath0 と eth1 を接続するブリッジ。

```
sudo apt-get install bridge-utils
```

ネットワーク設定を編集する。

```
sudo nano /etc/network/interfaces
```

```sh:/etc/network/interfaces
# このファイルはシステム上で使用可能なネットワークインターフェイスと
# ネットワークインターフェイスをどのように起動するかを定義する。
# 詳細は interfaces(5) を参照。

# The loopback network interface
# lo インターフェイスを起動する。
auto lo
# 論理インターフェイス lo を IPv4 loopback インターフェイスとする。
iface lo inet loopback

# Gateway -
# eth0 インターフェイスを起動する。
auto eth0
# 論理インターフェイス eth0 へ dhcp を介して IPv4 アドレスを割当てる。
iface eth0 inet dhcp
   # eth0 インターフェイス起動前に /etc/iptables.rules から
   # ファイアウォール設定を読込む。
   pre-up iptables-restore < /etc/iptables.rules
   # eth0 インターフェイス停止後に /etc/iptables.rules へ
   # ファイアウォール設定を保存する。
   post-down iptables-save > /etc/iptables.rules

# Wireless Setup
# ath0 インターフェイスを起動する。
auto ath0
# 論理インターフェイス ath0 を手動で設定する。
iface ath0 inet manual
   wireless-mode master
   wireless-essid pivotpoint

# Bridge interface
# br0 インターフェイスを起動する。
auto br0
# 論理インターフェイス br0 へ IPv4 固定アドレスを定義する。
iface br0 inet static
   address 10.1.1.1
   network 10.1.1.0
   netmask 255.255.255.0
   broadcast 10.1.1.255
   bridge-ports eth1 ath0
```

## ファイアウォール設定
下記のコマンドを実行する。

```
# nat テーブルを参照する。
# 送信時のアドレス変換ルールを追加する。
# 送信元アドレスを 10.1.1.0/24 とする。
# eth0 からパケットを送出する。
# 送信元 IP とポート番号を書き換える。
sudo iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o eth0 -j MASQUERADE
# パケット転送ルールを追加する。
# 送信元アドレスを 10.1.1.0/24 とする。
# eth0 からパケットを送出する。
sudo iptables -A FORWARD -s 10.1.1.0/24 -o eth0 -j ACCEPT
# パケット転送ルールを追加する。
# 10.1.1.0/24 へ接続する。
# conntrack モジュールを使用する。
# eth0 からパケットを受信する。
sudo iptables -A FORWARD -d 10.1.1.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -i eth0 -j ACCEPT
```

ログ設定を追加する。

```
# パケット受信ルールを追加する。
# conntrack モジュールを使用する。
# tcp プロトコルを使用する。
# 送信元ポートを 80 とする。
# ログを取得する。
sudo iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN:"
```

上記のログは /var/log/messages, /var/log/syslog, /var/log/kern.log へ記録される。
/etc/iptables.rules へ保存する。

```
sudo sh -c "iptables-save > /etc/iptables.rules"
```

*Note:*
NAT パケットのみの基本的な設定。より安全なファイアウォールを模索すること。

パケット転送を有効にする。

```
sudo nano /etc/sysctl.conf
```

下記の行を追加する。

```sh:/etc/sysctl.conf
# ポート転送を有効にする。
net.ipv4.ip_forward = 1
```

## 診断ツール
パケット転送を許可する。設定は再起動時に保存されないが、カーネルがフラグを設定する。

```
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
```

現在のカーネル設定を確認する。

```
cat /proc/sys/net/ipv4/ip_forward
```

*Note:*
/proc ディレクトリはハードドライブではなく、実行中のカーネルに存在する。

## DHCP サーバの設定
10台のマシンまで接続可能な DHCP サーバをターミナルを介して作成する。

```
sudo apt-get install dhcp3-server
```

サーバを設定する。

```
sudo nano /etc/dhcp3/dhcpd.conf
```

```sh:/etc/dhcp3/dhcpd.conf
# Subnet for DHCP Clients
subnet 10.1.1.0 netmask 255.255.255.0 {
   option domain-name-servers 10.1.1.1;
   max-lease-time 7200;
   default-lease-time 600;
   range 10.1.1.50 10.1.1.60;
   option subnet-mask 255.255.255.0;
   option broadcast-address 10.1.1.255;
   option routers 10.1.1.1;
}
```

*Note:*
DNS サーバ(bind9)がインストールされていない場合、 
``option domain-name-servers 10.1.1.1`` を 
ISP が提供する DNS サーバの IP アドレスへ変更する。 
Google DNS(8.8.8.8 または 8.8.4.4)のような 公開 DNS サーバを使用しても良い。

dhcpd が待受けるインターフェイスを指定する為に /etc/default/dhcp を編集する。 
既定では eth0 を待受ける。ローカル NIC(br0)を待受けるように編集する。

```
sudo nano /etc/default/dhcp3-server
```

```sh:/etc/default/dhcp3-server
# br0 インターフェイスを使用して DHCP 要求を待受ける。
INTERFACES="br0"
```

再起動する。

## Optional: Monitoring with darkstat
http サーバの統計。

```
sudo apt-get install darkstat
```

設定ファイルを編集する。

```
sudo nano /etc/darkstat/init.cfg
```

```sh:/etc/darkstat/init.cfg
# 以下のオプションを設定する場合は yes を指定する。
START_DARKSTAT=yes

# 必ずマニュアルページを読むこと。

# 必ずこのオプションを設定すること。
# 設定されていない場合、 darkstat は意図しないインターフェイスで待受けることがある。
INTERFACE="-i eth1"

PORT="-p 8888"
#BINDIP="-b 127.0.0.1"
#LOCAL="-l 10.1.1.0/24"
#FIP="-f 127.0.0.1"
#DNS="-n"
#SPY="--spy eth1"
```

ブラウザから閲覧する。

```
http://10.1.1.1:8888
```

## Optional: Monitoring with saidar
saidar はサーバの使用状況を表示する。

```
sudo apt-get install saidar
saidar
```

## Optional: Disabling IPv6
ハードウェアによるが、 IPv6 を無効化することで速度を改善することができる。 
詳細は https://help.ubuntu.com/community/WebBrowsingSlowIPv6IPv4 を参照。

## Backup

```
sudo su -
cd /
tar cvpjf backup.tar.bz2 
   --exclude=/proc 
   --exclude=/media 
   --exclude=/mnt 
   --exclude=/dev 
   --exclude=/lost+found 
   --exclude=/backup.tar.bz2 
   --exclude=/tmp 
   --exclude=/sys /
```

サーバの tar ボールを作成する。