UbuntuでWN-G300UA(8192cu)を使ったアクセスポイント仮想化

2017年5月現在、Linux、Debian、Ubuntu、AP、WiFi、アクセスポイントなどをキーワードにしてググると、LinuxでAP化についてそれなりにたくさん情報が入手できる。でも、情報が古かったり安定って書かれてても実はそうでなかったり、意外と単一記事情報だけでは安定稼働にたどり着けなかった。
最初はVyOSでwlan0認識させるのがスマートだ!と思っていたものの、サックリとうまくいかず再起動を繰り返し、ネット遮断がタルくなった(ポンコツだ)。

ルーターも仮想化したし、そうだAPも仮想化しよう

注目すべき構築ポイントは、インターフェイス認識と、Wi-Fiデバイスモジュール(ドライバ)が適切かの2つ。前者はUbuntuの自動認識に任せ、後者はフィクス版に入れ替えることで安定した。以下を真似れば、そのままド安定するものとして覚え書きのメモ。

環境・使用したもの

・ESXi 5.5.0
・ubuntu-16.04-server-amd64.iso で仮想インストール
IOデータ WN-G300UA
・USBデバイスパススルー(「Realtek WN-G300UA」認識)
・create_ap(hostapd)

16.04 LTS標準の8192cuモジュールは諦めるべき

Ubuntuインストール直後にパススルーでWN-G300UAを接続しても自動認識する。一見、問題なく使えるように見えるけれど、iwconfigコマンドで見て「Power Management:off」になっているにも関わらずデバイスがサスペンドしてしまう。
さまざまな情報を頼りにOffにしたつもりでも、表示に反してハマり続ける始末(1か月くらい試行錯誤したポンコツ)。そのためUbuntuデフォモジュールは早々に諦めるのが吉であり、有志のフィクスモジュールへ入れ替えることで超安定した。

$ sudo apt-get install --reinstall linux-headers-$(uname -r) linux-headers-generic build-essential dkms git
$ git clone https://github.com/pvaret/rtl8192cu-fixes.git
$ sudo dkms add ./rtl8192cu-fixes && dkms install 8192cu/1.10 && depmod -a
$ cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/
$ sudo modprobe 8192cu

/etc/network/interfaces はデフォのままいじらず

とにかく簡単に済ませたいので、インターフェイス周りはUbuntuデフォでいっさい変更しない。以下は、Ubuntuインストール時に固定IPアドレスで設定した場合だが、DHCPでも構わないと思う(メンテしづらいから固定よね)。

$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens160
iface ens160 inet static
        address 192.168.0.3
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 192.168.0.51
$

wlan0でなくてもそのまま使う、まったく問題ない

WN-G300UAを仮想マシンにUSBデバイスパススルー接続したら、dmesgで認識状況してみると次のようになる。Ubuntu 16.04 LTSの場合は(10.04以降)、wlan0からwlx3476c541xxxxなどと自動変更されるが、とにかく編集個所を少なく済ますのでそのまま使う。

rtl8192cu 1-1:1.0 wlx3476c541xxxx: renamed from wlan0
などの行が確認できるかがポイント。あちこちで定番と書かれていたWLI-UC-GNM2(バッファロー)なども試したが、お手軽完全自動認識なのは、WN-G300UAだけだった(当方で数製品試した中で)。

[   10.809678] shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
[   11.535186] 8192cu: module verification failed: signature and/or required key missing - tainting kernel
[   11.549935] vmxnet3 0000:03:00.0 ens160: intr type 3, mode 0, 2 vectors allocated
[   11.551539] vmxnet3 0000:03:00.0 ens160: NIC Link is Up 10000 Mbps
[   12.316337] ppdev: user-space parallel port driver
[   12.351602] Adding 2095100k swap on /dev/sda5.  Priority:-1 extents:1 across:2095100k FS
[   12.458274] cfg80211: World regulatory domain updated:
[   12.458281] cfg80211:  DFS Master region: unset
[   12.458284] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
[   12.458288] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[   12.458291] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[   12.458294] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A)
[   12.458297] cfg80211:   (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (N/A)
[   12.458300] cfg80211:   (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (0 s)
[   12.458303] cfg80211:   (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s)
[   12.458306] cfg80211:   (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A)
[   12.458309] cfg80211:   (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[   13.622049] cgroup: new mount options do not match the existing superblock, will be ignored
[   14.525073] NET: Registered protocol family 40
[   15.928550] usbcore: registered new interface driver rtl8192cu
[   16.023436] rtl8192cu 1-1:1.0 wlx3476c541xxxx: renamed from wlan0
[   23.923417] IPv6: ADDRCONF(NETDEV_UP): wlx3476c541xxxx: link is not ready
[   24.057328] ip_tables: (C) 2000-2006 Netfilter Core Team
[   24.089409] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
[   24.711426] IPv6: ADDRCONF(NETDEV_CHANGE): wlx3476c541xxxx: link becomes ready

create_apで十分、神スクリプト

この状態で、ifconfigでインターフェイス状態を見ても、刺した直後は有効になってないため確認できない。でも、iwconfigでリンク状態ならば問題ない。次に、hostapdを超簡単に機能させるcreate_ap をインストールする。hostapdも設定のハマりどころがたくさんある。もうcreate_apに任せるべきw ついでに、iwconfigコマンドが含まれるパッケージ(wireless-tools)も入れておく。

$ sudo apt-get install hostapd
$ git clone https://github.com/oblique/create_ap
$ cd create_ap
$ sudo make install

$ sudo apt-get install wireless-tools

iwconfig で確認すると次の通り。現在のところ、11n有効にできず11gのままで54Mbpsリンク。まぁ、スマホ繋げる程度なので私的にはこのスピードで十分。よって放置。。。

$ iwconfig
lo        no wireless extensions.

ens160    no wireless extensions.

wlx3476c541xxxx  IEEE 802.11bg  ESSID:"xxxxxx"  Nickname:"<WIFI@REALTEK>"
          Mode:Master  Frequency:2.412 GHz  Access Point: 34:76:C5:41:xx:xx
          Bit Rate:54 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=82/100  Signal level=82/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
$
$ sudo create_ap wlx3476c541xxxx ens160 [ap名] [pass] --daemon

などとして起動すれば、hostapd設定もいっさい必要なくアクセスポイントが完成。超簡単!
この時点でifconfigしてみると、Wi-Fiインターフェイスも確認できる。

$ ifconfig
ens160    Link encap:イーサネット  ハードウェアアドレス 00:0c:29:1e:xx:xx
          inetアドレス:192.168.0.3  ブロードキャスト:192.168.0.255  マスク:255.255.255.0
          inet6アドレス: fe80::20c:29ff:fe1e:xxxx/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2353574 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:3407878 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:919124617 (919.1 MB)  TXバイト:4308864706 (4.3 GB)

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

wlx3476c541xxxx Link encap:イーサネット  ハードウェアアドレス 34:76:c5:41:xx:xx
          inetアドレス:192.168.12.1  ブロードキャスト:192.168.12.255  マスク:255.255.255.0
          inet6アドレス: fe80::3676:c5ff:fe41:xxxx/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:3380375 エラー:0 損失:11126 オーバラン:0 フレーム:0
          TXパケット:2129150 エラー:0 損失:17 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:4386989149 (4.3 GB)  TXバイト:944485530 (944.4 MB)
$

最後に、再起動してもcreate_apが自動起動するようにrc.localに書いておく(超適当w)。

$ cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
create_ap wlx3476c541xxxx ens160 [ap名] [pass] --daemon
exit 0
$

終わり! もう二度と構築しないぞ、とovaエクスポートしておきつつ(覚書不要な件w)、16.04 LTSなのでメンテナンスフリーのまま2、3年以上環境壊れないで使い続けられればいいなぁと期待。たぶんイケる。

もう、この環境で1か月以上24時間ド安定しています。

半年後…

たまにクライアントが切断される事象が気になり、スマートデバイスも激増したため、XiaomiのAP買いました(;´∀`)仮想化断念。。。

sponsored links