Ubuntuを複数VLAN/SSID吹けるAPにしてみる

この記事はSFC-RG Advent Calendar 2017の12日目です。
自宅に研究室の回線を引いて家で進捗を埋めるようにする準備。

---

# 概要
## 目的
VLAN(802.1qタグ付きパケット)が吹けるAPって高い :money_with_wings: 
PoEスイッチが無い場合ACアダプターも一緒に買わないといかん:-1:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94774/aeddd7d1-5430-68d7-1844-cd36e4d17798.png)
引用：http://amzn.asia/3eJEdHN
業務用途だと良いんだけど~~オタク~~個人用途で使うのにはちょっと気が引ける。

## やること
* Ubuntuにタグ付き
* 使わないパソコンを複数VLAN/SSIDが吹けるアクセスポイントにして節約する :money_mouth: 


# 構成
## 環境
* Ubuntu 16.04.3 LTS (Xenial Xerus)
* ASUS K53E 
未検証だがRaspiのような小さいARM系のPCでも大丈夫。

## L2/L3トポロジー図

![qiita-20171212.png](https://qiita-image-store.s3.amazonaws.com/0/94774/8e8828ac-f750-2aa6-61d7-0f1650f97343.png)



# 設定内容
## :zero: 事前準備
* ルーター/L2SWの設定
    * 使用するVLANとVLANインターフェースを用意しておく。
    * NATする場合はNATの準備
    * WANの準備 PPPoE/tunnel インターフェースなど
    * Ubuntuをつなぐポートにタグ付きパケットを流すようにする
* Ubuntuの入ったパソコンの準備
    * 無線インターフェース(wlan0)の有効化
        * もし、USBドングルなどを利用する場合はドライバのインストールを事前にしておく

## :one: 仮想VLANインターフェースの作成
まずUbuntu内で仮想インターフェースを利用できる環境を用意する。
とりあえずL2SWのアクセスポートにPCを繋いでインターネットに出れるようにする。

### 1.1 VLANに必要なソフトをインストール
ネットワークインターフェース周りを弄る前に必要なパッケージをインストールする。
これにより```vconfig```というVLANインターフェースを扱うためのコマンドが使えるようになる。

```zsh:~/
sudo apt install vlan
```


### 1.2 networkmangerを止める
何かと邪魔してくるのでnetworkmanagerを止める。
うまくやれば止めなくても動くかもしれない。

```zsh:~/
sudo service network-manager stop
sudo update-rc.d -f network-manager remove
```

### 1.3 8021qモジュールの追加
タグ付きパケットを扱うために必要なモジュールをLinuxカーネルにロードする。

```zsh:~/
sudo modprobe 8021q
```
再起動後も有効化するために書いちゃう

```zsh:~/
sudo su -c 'echo "8021q" >> /etc/modules'
```
### 1.4 イーサネットを挿す
事前に用意したトランクポートとUbuntuのPCをイーサネットでつなぐ。

### 1.5 仮想インターフェースの追加
VLANインターフェースを追加する

```zsh:~/
# eth0にvlan100のインターフェースを追加する。
sudo vconfig add eth0 100
# eth0にvlan200のインターフェースを追加する。
sudo vconfig add eth0 200
```

### 1.6 L2動作確認
vconfigの設定ファイルは以下の場所にある。動いていれば```eth0.100```あたりにパケットが来ているはずである。

```zsh:/etc/proc/vlan
%ls
config  eth0.100  eth0.200

%sudo cat config
VLAN Dev name    | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
eth0.200       | 200  | eth0
eth0.100       | 100  | eth0


% sudo   cat eth0.200
eth0.200  VID: 200       REORDER_HDR: 1  dev->priv_flags: 1
         total frames received         1497
          total bytes received       171346
      Broadcast/Multicast Rcvd          167

      total frames transmitted          784
       total bytes transmitted       101369
Device: eth0
INGRESS priority mappings: 0:0  1:0  2:0  3:0  4:0  5:0  6:0 7:0
 EGRESS priority mappings:

```

### 1.7 静的IPアドレスの設定
別に静的である必要は無い気がするが管理用に固定されてると良いので。
```auto eth0```をコメントアウトしておく。環境によっては無いかもなのでそのままパス。

```zsh:/etc/network/iterfaces
auto lo
iface lo inet loopback

# 元のeth0はautoで立ち上がらせないようにしておく。
#auto eth0

auto eth0.200
iface eth0.200 inet static
        address 10.200.200.100
        netmask 255.255.0.0
        gateway 10.200.0.1
        vlan-raw-device eth0
        nameservers 8.8.8.8
        nameservers 8.8.4.4
auto eth0.100
iface eth0.100 inet static
        address 10.100.200.100
        netmask 255.255.0.0
        gateway 10.100.0.1
        vlan-raw-device eth0
        nameservers 8.8.8.8
        nameservers 8.8.4.4

```


### 1.8 ネットワーク再起動
ネットワークを再起動して動くか確認

```zsh:~/
sudo service networking restart
```

エラーを吐く時は、```ip```コマンドで追加したインターフェースを立てたり落としたりしてみる。
ためしにアドレスを振ってみたりする。弊環境ではこのゴニョゴニョで動くようになった。
チートシートはこちら。RedHat用だが大方共通して動く。
[ip コマンド チートシート](https://access.redhat.com/sites/default/files/attachments/rh_ip_command_cheatsheet_1214_jcs_print_ja2.pdf)



## :two:  無線インターフェースとVLANインターフェースを紐付ける

###2.1 必要なソフトのインストール
```hostapd``` がAPモードで無線インターフェースをそもそも動かすために必要なソフト。入れる。

```zsh:~/
sudo apt install hostapd
```


```create_ap``` はコマンド一つでAPを構築して無線が吹けるステキなアプリケーション。
gitから持ってきて,ビルドしてinstall。


```zsh:~/
git clone https://github.com/oblique/create_ap.git
cd create_ap
make install
```

###2.2 無線を吹く
installが終わったらさっそく無線を吹く。
```create_ap``` は様々なオプションがあるので最適な設定を追い求める必要がある。特に使用するチャンネルなど...。
[公式リポジトリ](https://github.com/oblique/create_ap.git)を見る限りsystemdにも出来るみたい。

```zsh:~/
# 一例
create_ap -m bridge wlan0 eth0.200 --ieee80211n --ht_capab '[HT40+]'  home NyanCat!
```

###2.3 もう一個吹く...
**今回の目的は複数VLAN/SSIDを吹くことである！！**

ということでもう一個吹こうとしたところ....複数プロセスが同時に一つのインターフェース(今回であればwlan0)に触ることが出来ないらしく異常終了する。むう残念。

仕方がないのでもう一個USBドングルでインターフェースを追加して無線を吹く。

```zsh:~/
# 一例
create_ap -m bridge wlan0 eth0.100 --ieee80211n --ht_capab '[HT40+]'  business musenlanbenrithanyusen
```
出来た。


## :cross: 機会点
結果的にはドングルをもう一個挿すという悲しい結果になってしまいまった...悔しい。

が、**希望が無いわけではなく**、```create_ap```がラップしている```hostapd```のconfigオプションにこんな記述があることを発見した。

> vlan_bridge
> 無線 LAN と、タグ付けされたインターフェイスを追加するブリッジ(接頭辞)。
引用元：[hostapd.conf 覚書](https://qiita.com/JhonnyBravo/items/5df2d9b2fcb142b6a67c#vlan_bridge)

**なんかVLANインターフェースを創るところからこいつでできそうな雰囲気を醸し出している。**


# :pray: 終わりに
* 今回は残念ながらAdvent Calendar記事という都合上、歯切れの悪い段階での投稿になってしまった。~~(計画性が無いとも言う)~~ :fire:
* 結果的に自分の環境ではドングルを追加することにより複数VLAN/SSIDを達成したが、ダサいので今後hostapd本体での構築に取り組みたい。 :boom: 
* ここまでせっかくお読み戴いたSFC-RG界隈の皆様,たまたま巡り会えた皆様大変申し訳ございません...。
* **「俺もう既にやってるよ」**な方や**「こういうやり方でやってみたら？」**というご奇特な御方がいらっしゃいましたらコメント欄・編集リクエストにてご連絡下さい。:pray:


# refs.
全て2017年12月閲覧

[LinuxPCをWiFiアクセスポイントにする](https://qiita.com/Mokkeee/items/b8a4a092c6d1bada2beb)
[コマンド一発でLinuxマシンを即席無線LANルーターにできる「create_ap」がすごい便利だった](https://qiita.com/KuwabataK/items/5903c7584657151d576a)
[vlan - Ubuntu Wiki](https://wiki.ubuntu.com/vlan)
[Ubuntuで固定IP運用](https://qiita.com/f-akazawa/items/8f610be4804523ca0d17)
[NetworkManagerを使用しないネットワーク設定](http://l-w-i.net/t/ubuntu/network_001.txt)
[virtual boxの仮想マシンがtagged VLANのネットワークに接続する方法](https://qiita.com/asanon-s@github/items/38c4902c50e25b03e83d)
[ttanimu engineering labs](https://ttanimu.wordpress.com/2012/01/17/vlan%E3%81%A8linux/)
[タグVLAN＆KVM サーバを作る① 環境構築](http://eco.senritu.net/ubuntu1304_kvm_setup/)
[vconfig メモ](http://www5b.biglobe.ne.jp/~urajigen/vnuml/vconfig.html)
[ip コマンド チートシート](https://access.redhat.com/sites/default/files/attachments/rh_ip_command_cheatsheet_1214_jcs_print_ja2.pdf)
[Correct way to create VLAN and bridges on Ubuntu 14.04?](https://askubuntu.com/questions/552784/correct-way-to-create-vlan-and-bridges-on-ubuntu-14-04)
[Ubuntu 16.04: bridgeインターフェースの設定](https://www.hiroom2.com/2016/07/11/ubuntu-16-04-bridge%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A/)
[hostapd.conf 覚書](https://qiita.com/JhonnyBravo/items/5df2d9b2fcb142b6a67c#vlan_bridge)