dorapon2000’s diary

忘備録的な。CTFやってます。

ubuntu server 16.04LTS をWifiにつなげる

知識不足でWifiにつなげるだけで非情に苦労しました。


前提

linuxでのwifiへの接続方法

2種類あるようです。

  • iwconfig
  • wpa_supplicant

一般的にはwpa_supplicantのようですが、WEPのときはiwconfigでも設定できるようです*1。 WPAやWPA2のときはwpa_supplicantが必要です。 私のルーターはWPA2-PSK-CCMPなのでwpa_supplicantを使いました。

流れ

  1. wpa_supplicantのinstall
  2. wpa_supplicant.confを作って、wifiの接続方法などを設定する
  3. /etc/network/interfacesをいじって起動時にWifiへ接続するようにする
  4. 謎のエラーと戦う

wpa_supplicantのinstall

$ sudo apt-get install wpa_supplicant

私の環境では、はじめから入ってました。

wpa_supplicant.conf

wpa_supplicant.confは接続するSSIDや接続方式、パスワードを記述する設定ファイルです。 まず、wpa_passphraseコマンドを使って雛形的なものを作ります。

$ wpa_passphrase my_ssid my_passwod
network={
    ssid="my_ssid"
    #psk="my_password"
    psk=e53bb7df43156b8a6ad5d3ea5bb4078fada2531e2d5d5208c3bc1a17c3278220
}

これだけではターミナルに表示されるだけなので、ファイルに出力します。

$ sudo wpa_passphrase my_ssid my_passwod >> /etc/wpa_supplicant/wpa_supplicant.conf

wpa_supplicant.confを書き換えて次のようにします。

ctrl_interface=/var/run/wpa_supplicant # UNIXドメインソケットを作成する領域
ctrl_interface_group=wheel # 上記UNIXドメインソケットの所有グループ

network={
    ssid="my_ssid"
    #psk="my_password"
    psk=e53bb7df43156b8a6ad5d3ea5bb4078fada2531e2d5d5208c3bc1a17c3278220
    key_mgmt=WPA-PSK # 暗号化キーの管理方式
    proto=RSN # 認証方式
    pairwise=CCMP # ユニキャスト用暗号化方式
    group=CCMP # ブロードキャスト/マルチキャスト用の暗号化方式
}

重要なのはnetwork={}に追加した4項目です。

  • key_mgmt は WPA-PSK でも WPA2-PSK でも WPA-PSK が入る。
  • proto は WPA-PSK なら WPA、WPA2-PSK なら RSN
  • parwise と group は恐らく同じものが入る。TKIP または、CCMP (AESのこと)。

ここらへんは以下のサイトが理解の助けになりました。 security.nekotricolor.com

なお、修正すればWEPも設定できます。詳しくは Linuxで無線LAN (ゆうちくりんの忘却禄) で少し紹介されています。

実行する

wpa_supplicantコマンドはオプション(-i -c)と値をくっつけることに注意です。

$ sudo wpa_supplicant -iwlp3s0b1 -c/etc/wpa_supplicant/wpa_supplicant.conf 
...
CTRL-EVENT-CONNECTED - Connection to xx:xx:xx:xx:xx:xx completed ・・・

このようなメッセージが出れば成功です。Ctrl-Cで停止して改めてバックグラウンドで実行します。

$ sudo wpa_supplicant -iwlp3s0b1 -c/etc/wpa_supplicant/wpa_supplicant.conf -B

少し話がそれますが、wlp3s0b1というのはwlanのことです。 新しい命名規則によって、wlanではなくそのようにつけられてそうです。 調べながら知りましたが、詳しくはこちらに。 qiita.com

ちなみに、以下のように、wlan0からrenameされていることがわかります。

$ dmesg | grep wlp3s0b1
[   18.439600] brcmsmac bcma0:1 wlp3s0b1: renamed from wlan0

起動時にWifiへ接続するようにする

先程のやり方では再起動するたびにコマンドを打ち込まなくてはいけないので、起動時に設定するようにします。

$ sudo vi /etc/network/interfaces
--- 

auto lo
 
iface lo inet loopback
 
auto wlp3s0b1
allow-hotplug wlp3s0b1
iface wlp3s0b1 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

ここでは起動時にdhcpサーバ (ルーター) にIPアドレスを割り当ててもらうようにしています。 細かい書式はこちらで詳しく説明されています。自分自身いまいちわかっていませんが。 qiita.com

謎のエラーと戦う

実際は次のようなメッセージ(エラー?)が出て、とても悩まされました。 (dmesg中の一部が突然がターミナルに出力される)

cfg80211 invalid regulatory domain detected

しかし、wifiはつながっているのです。

答えはInvalid JP regulatory domainで見つけました。 どうやら、指定された範囲内に周波数が少し収まっていないぞということらしいです。 そこで友人に借りていたOpenWrt内蔵のBuffalo WZR-HP-AG300Hをルーターとして使っていることを思い出しました。 OpenWrtはカスタマイズ性に優れすぎたファームウェアです。 ちゃんと設定してないと確かにそういうこともあるかもと確認をしていると、さればよ。 ロケール設定がデフォルトの「00 - 世界」のままでした。 国によって使える周波数帯が異なるのだから、ここを設定しなくては範囲が合わないということです。

ということで「JP - Japan」に変えたら、メッセージは出なくなりました。

追記

一度成功したからブログを書いたんですが、再起動したらwifiに繋がらなくなってしまいました。 原因は今のところ2つありました。

  • ubuntuにはwheelグループがない
  • dhcpクライアントがうまく起動してない

wheelグループがないのは知りませんでした。いずれ必要になると思い、以下のサイトを参考にwheel作りました。 kawairi.jp
dhcpがうまく起動しないのはよくわかりません。今のところ手動でなんとかしてます。

$ sudo dhclient wlp3s0b1

参考