無線LAN アンテナ付のLapTop マシンで無線LAN アクセスポイントを構築する

# 概要 
無線LAN アンテナが内蔵しているLap Top にLinux(Fedora 25) をインストールし、無線LAN AP 化してみます。
自宅サーバとしてLap Top にLinux を入れて既に運用している人はそれを再利用することで、無線LAN 機能付きルータを買わなくても手持ちのスマホやRaspberry Pi をWifi 接続させることができるようになります。

# 構成 
今回構築する無線LAN AP の構成としては次のようになります。
無線LAN を利用する端末は192.168.10.0/24 のネットワークに属し、外のネットワークにアクセスするときは無線LAN AP のIP アドレス192.168.1.254 でNAT するようにします。
今回使用する無線LAN AP のハードはLaptop PC を使用し、内蔵されているアンテナを利用して無線LAN 側のネットワークの電波を飛ばすようにします。


```text:構成
    WAN
     |
   +-+------+
   | GW     |
   +-+------+
     |
     | 有線LAN
     |        192.168.1.254/24
   +-+------+ (192.168.10.0/24 からのパケットを192.168.1.254 のIPでNAT)
 +-|enp0s25 |-----------+
 | +--------+           |
 | 無線LAN AP           |
 | Fedora25 (Linux)     |
 | +--------+           |
 +-|wlp4s0  |+----------+
   +-+------+ 192.168.10.1/24
     .
     . 無線
     .
 +-------------------------+
 | スマホ・Laptop 等の端末 |
 +-------------------------+
  (dhcp で動的に192.168.10.0/25 内のIP アドレスを割り当て)
```


# 無線LAN デバイスの確認 
今回使用したFedora Server Edition では、ドライバがインストールされていないため、インストール直後の状態では無線LAN アダプタを認識していませんでした。
認識させるのに必要なドライバを特定するために、まず自分が使っているマシンの無線LAN アダプタの型番を確認します。


```console:無線LANアダプタの確認
# lspci | grep -i wireless
04:00.0 Network controller: Intel Corporation Wireless 7265 (rev 3b)

# lspci -vv -s 04:00.0
......
 latency: 71680ns
        Capabilities: [154 v1] L1 PM Substates
                L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1+ L1_PM_Substates+
                          PortCommonModeRestoreTime=30us PortTPowerOnTime=60us
                L1SubCtl1: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1+
                           T_CommonMode=0us LTR1.2_Threshold=163840ns
                L1SubCtl2: T_PwrOn=60us
        Kernel driver in use: iwlwifi
        Kernel modules: iwlwifi

```


上記の出力結果よりドライバは`iwlwifi` を使用することがわかります。

# 無線LAN ドライバのインストール 
まずは該当のWifi ドライバがリポジトリ上にあるか検索して確認します。


```console:無線LANドライバの検索
# dnf search wireless
......
iwl7260-firmware.noarch : Firmware for Intel(R) Wireless WiFi Link 7260 Series Adapters
......

# dnf info iwl7260-firmware.noarch                                                                                                                                                                                                                                  .1
Last metadata expiration check: 3:20:22 ago on Sun Mar 19 08:06:56 2017.
Installed Packages
Name        : iwl7260-firmware
Arch        : noarch
Epoch       : 1
Version     : 25.30.13.0
Release     : 69.fc25
Size        : 31 M
Repo        : @System
From repo   : updates
Summary     : Firmware for Intel(R) Wireless WiFi Link 7260 Series Adapters
URL         : http://www.kernel.org/
License     : Redistributable, no modification permitted
Description : This package contains the firmware required by the Intel wireless drivers
            : for Linux.  Usage of the firmware is subject to the terms and conditions
            : contained inside the provided LICENSE file. Please read it carefully.

```


確認すると、先程特定したドライバと名前は完全一致しませんが、こちらのドライバで問題なさそうです(よくわからなかったら、一通りドライバを入れてみるのもあり)。
ドライバの確認が取れたらそれをインストールします。


```console:wirelessツールのインストール
# dnf install iwl7260-firmware
```


完了したらOS を再起動させます。


```console
# shutdown -r now
```


マシンが再起動したら、Wifi アダプタが認識されているか試しに起動して確認してみましょう。
今回検証した環境では、デフォルトで無線LAN デバイス類が起動しないように無効化されていたので、`rfkill` コマンドでそれを解除してから起動するようにしています。


```console
# ip a
......
3: wlp4s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 60:57:18:43:fc:3d brd ff:ff:ff:ff:ff:ff
......

# rfkill unblock wlan
# ip link set wlp4s0 up
# ip addr add 192.168.10.1/24 dev wlp4s0
# ifconfig
......
wlp4s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.10.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 36:e8:49:bf:a1:f2  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
......
```


# 無線LAN AP 環境の構築 
デバイス周りの準備ができたところで、次に`hostapd` と`dhcpd` の設定を行っていきます。


```console:hostapdとdhcpdのインストール
# dnf install hostapd dhcp
```


hostapd の設定を行っていきます。
設定ファイルの内容は今回は次のように設定しました。


```text:/etc/hostapd/hostapd.conf
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel

# Some usable default settings...
macaddr_acl=0
#deny_mac_file=/etc/mac.deny
#macaddr_acl=1
#accept_mac_file=/etc/hostapd/mac.accept
auth_algs=1
ignore_broadcast_ssid=0

wpa=2
wpa_passphrase=MyWiFiPassword
wpa_key_mgmt=WPA-PSK

# Most modern wireless drivers in the kernel need driver=nl80211
driver=nl80211

# Customize these for your local configuration...
interface=wlp4s0
#bridge=br0

hw_mode=g
channel=1
ssid=air

wpa_pairwise=CCMP

logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
```

設定内容を一部抜粋して説明します。

* macaddr_acl=0
MAC アドレスによる接続拒否設定を行います。
`0` に設定すると`deny_mac_file` に指定したファイルに記載されたMAC アドレスのデバイスのみ接続を拒否し、それ以外のデバイスは接続を許可するようになります。
`1` に設定すると`accept_mac_file` に指定したファイルに記載されたMAC アドレスのデバイスのみ接続を許可し、それ以外のデバイスは接続を拒否するようになります。
`deny_mac_file`, `accept_mac_file` ファイルの書式はどちらもMAC アドレスを改行区切りで記述します。

* auth_algs=1
`1` に設定すると、WPA2 認証を行います

* wpa=2
WPA2 のみ許可します

* wpa_passphrase=MyWiFiPassword
認証パスワードを指定します

* interface=wlp4s0
無線AP として使用する無線LAN インタフェースを指定します

* hw_mode=g
無線LAN の規格としてあらゆるデバイスで無難に使用できるg を採用します

* ssid=air
SSID を設定します

* wpa_pairwise=CCMP
暗号化方式としてCCMP(AES 暗号)を使用します

# dhcpd の設定 
無線AP に接続してくるデバイスに、動的にIP アドレスを割り振るDHCP の設定を行います。


```text:/etc/dhcp/dhcpd.conf
subnet 192.168.10.0 netmask 255.255.255.0 {
    option routers                  192.168.10.1;
    option subnet-mask              255.255.255.0;
    option domain-name              "myhome.local";
    option domain-name-servers      8.8.8.8;
    range dynamic-bootp             192.168.10.11 192.168.10.200;
    default-lease-time              86400;
    max-lease-time                  259200;
}
```

# ip forward の設定 
無線AP に接続したデバイスがインターネット側にパケットが転送され、レスポンスを受け取れるように、NAT とIP forward の設定を行います。

```console:ipforward
# sysctl -w net.ipv4.ip_forward=1
# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/net.ipv4.ip_forward.conf
```

現在物理インタフェース`enp0s25`に設定されているFirewall zone を確認します。

```text:現在のzoneの取得
# firewall-cmd --get-active-zone
FedoraServer
  interfaces: enp0s25
```

現在設定されているゾーンは`FedoraServer` であることを確認できました。
今回はそのゾーンに対して物理ネットワークインタフェース`enp0s25` とワイヤレスネットワークインタフェース`wlp4s0` 間のマスカレード設定をしていきます。

```console:マスカレード設定の追加
# firewall-cmd --zone=FedoraServer --add-masquerade --permanent
# firewall-cmd --reload
# firewall-cmd --direct --permanent --add-rule ipv4 nat POSTROUTING 0 -o wlp4s0 -j MASQUERADE
# firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i wlp4s0 -o wlp4s0 -j ACCEPT
# firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i br0 -o wlp4s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
```

補足として、上記のfirewalld のルールを削除する場合、次のようにコマンドを実行します。

```text:マスカレード設定削除例
# firewall-cmd --direct --permanent --remove-rule ipv4 nat POSTROUTING 0 -o wlp4s0 -j MASQUERADE
# firewall-cmd --direct --permanent --remove-rule ipv4 filter FORWARD 0 -i wlp4s0 -o wlp4s0 -j ACCEPT
# firewall-cmd --direct --permanent --remove-rule ipv4 filter FORWARD 0 -i wlp4s0 -o wlp4s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
```

設定が完了したら、hostapd とdhcpd を起動します。

```console:hostapdとdhcpdの起動
# systemctl start hostapd
# systemctl start dhcpd
```

エラー無く起動させたらスマホ等のWifi 接続可能な機器で接続テストをしてみましょう。
インターネットなど問題なく接続出来れば成功です。

# 参考 
- ubuntu 14.04 を無線LANアクセスポイントにする
    - https://blog.be-dama.com/2014/07/23/ubuntu-14-04-%E3%82%92%E7%84%A1%E7%B7%9Alan%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AB%E3%81%99%E3%82%8B/

- Debian / Ubuntu Linux: Setup Wireless Access Point (WAP) with Hostapd
    - https://www.cyberciti.biz/faq/debian-ubuntu-linux-setting-wireless-access-point/

- How to display interface in tcpdump output flow?
    - http://serverfault.com/questions/224698/how-to-display-interface-in-tcpdump-output-flow

- Hostapd で2.4GHz帯と5GHz帯を同時に利用する。　[Hostapd で無線LAN AP構築]
    - http://bibo-log.blog.so-net.ne.jp/2012-06-07-1

- Hostapd(gentoo linux)
    - https://wiki.gentoo.org/wiki/Hostapd

- 無線LAN・Wi-Fiの規格と速度
    - https://note.cman.jp/network/lan_wifi_speed.cgi

- IPマスカレードの設定
    - https://www.server-world.info/query?os=CentOS_7&p=firewalld&f=2