コマンド一発でLinuxマシンを即席無線LANルーターにできる「create_ap」がすごい便利だった

## create_apとは

一言で言っちゃえば、Windowsで言うところの「Virtual Wifi」みたいな機能を提供してくれるシェルスクリプトです。

無線LANチップが乗っているLinuxマシンがあれば即席のアクセスポイントを作ってくれて、無線LANルーターにしてくれる便利スクリプトです。hostapdによるAPの作成から、DHCPサーバーの作成、NATの設定まで諸々コマンド一発でやってくれるすごいやつでした。

いわゆるホテルWifiみたいな使い方もできますし、ベースがLinuxなので、同じマシンにSambaやGit、owncloudサーバーなんかを建ててしまえば、ただのルーターにはできないいろんな使い方ができて妄想が膨らみます。（クラウド使えばいいじゃんとか言ってはいけない）

## 環境

- PC: Vaio F /VPCF24AJ (2012年ぐらいに買ったSandy Bridge世代のノートパソコン)
- 無線LANカード：　Qualcomm Atheros AR9287 Wireless Network Adapter
- OS: Ubuntu 16.04

## 準備

create_apの動作にはhostapdが必要なので事前にインストールしておきます。

```.sh
$ sudo apt-get install hostapd
```

## インストール

GitHubから一式取ってきます。

```.sh
$ git clone https://github.com/oblique/create_ap
$ cd create_ap
$ sudo make install
```

## 使い方

ぶっちゃけ [GitHubのREADME](https://github.com/oblique/create_ap) を見れば終わってしまうぐらい簡単なのですが、よく使うコマンドだけ紹介しておきます。

```
# create_ap [options] <wifi-interface> [<interface-with-internet>] [<access-point-name> [<passphrase>]]
```

#### 仮想APを作り、有線LANでインターネット接続する（いわゆる無線LANルーター的使い方）

とりあえずネットワークインターフェイス名を調べます

```.sh
$ ifconfig

enp5s0    Link encap:イーサネット  ハードウェアアドレス 30:f9:ed:ea:4b:17  
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:7259 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:3757 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:2418516 (2.4 MB)  TXバイト:500563 (500.5 KB)

lo        Link encap:ローカルループバック  
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:1458 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:1458 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1
          RXバイト:144158 (144.1 KB)  TXバイト:144158 (144.1 KB)

wlp2s0    Link encap:イーサネット  ハードウェアアドレス 94:39:e5:9b:7a:2e  
          inetアドレス:192.168.11.47  ブロードキャスト:192.168.11.255  マスク:255.255.255.0
          inet6アドレス: fe80::af12:7318:fe07:4c1a/64 範囲:リンク
          inet6アドレス: fe80::50a0:5c0a:658b:e016/64 範囲:リンク
          inet6アドレス: fe80::3164:636d:b34b:49f3/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:33651 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:17900 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:17117833 (17.1 MB)  TXバイト:3715535 (3.7 MB)

```

なんか最近のLinuxはwlan0とかじゃないんですね。Ubuntuだけ？

wlp2s0に仮想APを、enp5s0をインターネットに接続するので以下を実行します。SSIDは「vaio-ap」、パスワードは「passphraze」にしました

```.sh
~/create_ap# ./create_ap wlp2s0 enp5s0 vaio-ap passphrase
```

これだけです。

ifconfigを確認すると、ap0という仮想APが作成されているのがわかります。ここに他のデバイスから接続すればenp5s0経由でインターネットに接続できます。便利

```.sh
$ ifconfig

ap0       Link encap:イーサネット  ハードウェアアドレス 94:39:e5:9b:7a:2f  
          inetアドレス:192.168.12.1  ブロードキャスト:192.168.12.255  マスク:255.255.255.0
          inet6アドレス: fe80::9639:e5ff:fe9b:7a2f/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:37 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:0 (0.0 B)  TXバイト:6485 (6.4 KB)

enp5s0    Link encap:イーサネット  ハードウェアアドレス 30:f9:ed:ea:4b:17  
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:7259 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:3757 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:2418516 (2.4 MB)  TXバイト:500563 (500.5 KB)

lo        Link encap:ローカルループバック  
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:1458 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:1458 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1
          RXバイト:144158 (144.1 KB)  TXバイト:144158 (144.1 KB)

wlp2s0    Link encap:イーサネット  ハードウェアアドレス 94:39:e5:9b:7a:2e  
          inetアドレス:192.168.11.47  ブロードキャスト:192.168.11.255  マスク:255.255.255.0
          inet6アドレス: fe80::af12:7318:fe07:4c1a/64 範囲:リンク
          inet6アドレス: fe80::50a0:5c0a:658b:e016/64 範囲:リンク
          inet6アドレス: fe80::3164:636d:b34b:49f3/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:44829 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:27443 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:25184111 (25.1 MB)  TXバイト:5883459 (5.8 MB)
```

終了する場合は、Ctrl+Cで中断すれば、作成されたAPも含めて綺麗サッパリ消えます。もしくはstopオプションも用意されています。

```.sh
~/create_ap# ./create_ap --stop <id> 
```

ちなみにインターネットに接続するインターフェイスと仮想APを作るインターフェイスは同じものを指定することもできます。

```.sh
~/create_ap# ./create_ap wlp2s0 wlp2s0 <SSID> <passphrase>
```

他にもいろいろオプションがあって「--isolate-clients」をつけると仮想AP内でのクライアント間の通信を遮断できたり、「-m bridge」オプションでNAT接続じゃなくてブリッジ接続することもできるみたいですね。

```.sh
~/create_ap# ./create_ap --isolate-clients　wlp2s0 enp5s0 <SSID> <passphrase>
```

```.sh
~/create_ap# ./create_ap -m bridge　wlp2s0 enp5s0 <SSID> <passphrase>
```

## おまけ

サーバーのエントロピーが足りないと、無線LANが遅くなるらしいです。その場合はhavegedを使うといいらしいです（よくわかってない）。[以下引用](https://wiki.archlinuxjp.org/index.php/Haveged)

>haveged が必要かどうかわからない（もしくは迷っている）なら、次のコマンドを実行してください:
>
> ```
> # cat /proc/sys/kernel/random/entropy_avail
> ```
>
>このコマンドはあなたのサーバがどれくらいエントロピーを確保しているかを出力します｡もし、出力された値が低かった (1000以下) のであれば、haveged をインストールするべきです｡暗号アプリケーションは十分なエントロピーが貯まるまで動きません｡結果として、あなたのサーバーをソフトウェアアクセスポイントとして使っている場合など、wlan の速度が低下するかもしれません｡
>
>インストール後、もう一度コマンドを実行して確認してみてください｡どれくらい haveged があなたのサーバのエントロピープールを加速させたかがお分かりいただけるでしょう｡

havegedはインストールするだけで有効化されるみたいです。

```.sh
$ sudo apt-get install haveged
```

## 参考URL

- [GitHub - oblique/create_ap
](https://github.com/oblique/create_ap)

- [ソフトウェアアクセスポイント - ArchLinux](https://wiki.archlinuxjp.org/index.php/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88#create_ap)