まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:wifi

スタバとか、デニーズとか、マクドナルドとか、最近は(特定のキャリアと契約している前提なしで一定時間使える)無料の公衆無線 LAN が使える場所が増えてきました。

これらを使う場合、まずは無線 LAN をその SSID で普通に接続します。この時点で無線 LAN としては接続できて(IP アドレスが取得できて)いますが、まだインターネットを自由に使える状態ではありません:
2018072203


この状態でウェブブラウザを開くと、「ネットワークのログインページ」を開くボタンが表示されたり、ブラウザの種類によってはどこかのページを開こうとした際にログインページにリダイレクトされて、もう1段階の認証を行うことになります:
2018072200


スタバであればこんな感じのログインページが表示され、ここから処理を進めてインターネットに接続します(場合によってはメールアドレスやパスワードを登録する必要があるかもしれません):
2018072204



この仕組を使う中で気付いたことがあります。自分は主に2種類のノート PC を持ち歩いていて、うち1台ではこの公衆無線 LAN を問題なく使えるのですが、もう1台では「ネットワークのログインページ」へ移動するためのボタンが表示されず、かといって、そのままインターネットを使おうとしても使えない、という現象が発生するのでした:
2018072201


この現象は起こったり起こらなかったり・・・ではなく、問題ない PC では発生せず、問題のある PC では 100% 再現しました。要は「PC の設定の違い」が原因と思われる挙動の違いでした。その原因と対処法を調べたので、その備忘録を兼ねた報告です。

この現象が発生する原因が1つだけとは限らないのですが、自分のケースでの原因は「DNS 設定」でした。問題なく接続できる(ログインページが表示される)方の PC では DNS サーバーのアドレスを自動取得する設定になっていました:
2018072202


一方、接続できない方の PC ではこの部分が特定の DNS サーバーを使うよう指定されていました。具体的には 1.1.1.1 や 8.8.8.8 などの名前解決が早いことで定評のある公衆 DNS サーバーのアドレスを指定していました。自宅や会社で使うぶんにはこの設定でも問題なかったのですが、今回紹介しているような公衆無線 LAN ではこれらの IP アドレスへの接続が(ログインページを経由して認証する前には)許可されていないらしく、ゲートウェイのファイアウォールを超えることができず、結果として名前解決ができずに接続ができない、という状況になっているようでした。

したがって、この場合であれば DNS サーバーを上記のように「自動的に取得」するように設定し直します。すると、再度ウェブブラウザを起動した際にログインページへのリダイレクトボタンが表示されて、改めて認証ページを経由することでインターネットが利用できるようになりました。

1.1.1.1 や 8.8.8.8 にこんな落とし穴があったとは・・・

 

自分は CentOS をサーバー用途だけでなく、X Window System と日本語環境、そして GNOME を入れて、壁紙やスクリーンセーバーも設定してデスクトップクライアントとしても使っています:
2015110101


サーバー用途であれば有線 LAN を繋いで起動しっぱなし・・でいいのですが、デスクトップとして使おうとすると、やはり無線 LAN を使いたくなります。公衆 WiFi にせよ、テザリングにせよ、PCを持ち歩く前提で、その持ち歩き先でネットワークを使うには無線 LAN しかないことも多いです。この無線 LAN を CentOS で使う場合の設定方法を備忘録も兼ねて紹介します。

ちなみに自分は CentOS 6 を使っています。デスクトップ Linux というと Ubuntu の印象が強いかもしれませんが、自分はサーバーとしては普段 CentOS 使いであることに加え、LibreOffice にせよ、IBM Notes にせよ、ウェブブラウザにせよ、デスクトップクライアントとして必要と思われるアプリはほぼ CentOS でも動きます。なので、自分としては慣れた CentOS を使うことにしているのでした。


まず、何はともあれ無線 LAN デバイスが認識されている必要があります。iwconfig コマンドで wlan0 が認識されているかどうかを確認します:
# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11abgn  ESSID:"(ACCESSPOINT名)"
          Mode:Managed  Frequency:2.462 GHz  Access Point: (MACアドレス)
          Bit Rate=58.5 Mb/s   Tx-Power=15 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=41/70  Signal level=-69 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:10112  Invalid misc:816   Missed beacon:0

↑こんな感じで wlan0 デバイスが表示されれば無線 LAN デバイスが OS で認識されていることになります。認識されていない場合は、使っている機種のデバイスドライバを導入するなどして、OS が無線 LAN デバイスを認識している状態にしておく必要があります。

では、この認識された wlan0 を無線 LAN に接続して実際に IP アドレスが割当られるようにします。/etc/sysconfig/network-script/ifcfg-wlan0 を以下のような内容で作成します:
DEVICE="wlan0"
ONBOOT="yes"
BOOTPROTO=dhcp
TYPE=Wireless
MODE=Auto
ESSID="(ACCESSPOINT名)"
IPV6INIT=no
NAME="System wlan0"

↑この例のように ONBOOT="yes" としておくと、起動と同時に有効になります。また TYPE=Wireless としておきます。ESSID には接続先の SSID を記載しておきます。

また /etc/sysconfig/wpa_supplicant の INTERFACES に wlan0 が含まれるようにしておきます:
  :
: INTERFACES="-iwlan0"
: :

具体的な SSID や接続形式を指定した接続設定は /etc/wpa_supplicant/wpa_supplicant.conf に記述します。このファイルの雛形を wpa_passphrase コマンドを使って作成します:
# wpa_passphrase ACCESSPOINT PASSPHRASE > /etc/wpa_supplicant/wpa_supplicant.conf

↑ ACCESSPOINT には SSID 名を、PASSPHRASE には接続パスフレーズ(パスワード)を指定します。この後に作成される /etc/wpa_supplicant/wpa_supplicant.conf をテキストエディタで開きます:

ctrl_interface=/var/run/wpa_supplicant
#ctrl_interface_group=wheel
ap_scan=1
network={
        ssid="ACCESSPOINT"
        key_mgmt=WPA-PSK
        proto=WPA WPA2
        pairwise=CCMP TKIP
        group=CCMP TKIP WEP104 WEP40
        #psk="PASSPHRASE"
        psk=*********************************************************************
}


↑この例では WPA2 で接続することを指定したかったので、赤字の部分を後から追記しています。


では実際に接続サービスを実行するために必要なファイル(/etc/init.d/prepnet)を以下の内容で用意します:
#!/bin/sh

/etc/init.d/messagebus start
/etc/init.d/wpa_supplicant start
killall dhclient >/dev/null 2>&1

実際にサービスとして必要なファイルは /etc/rc5.d/S09prepnet ですが、/etc/init.d/prepnet からシンボリックリンクを作成します:
# chmod a+rx /etc/init.d/prepnet
# ln -s /etc/init.d/prepnet /etc/rc3.d/S09prepnet
# ln -s /etc/init.d/prepnet /etc/rc5.d/S09prepnet

最後にサービスの自動実行設定を行います:
# chkconfig messagebus off
# chkconfig wpa_supplicant off
# chkconfig NetworkManager off
# chkconfig network on

ここまで行ってシステムを再起動すると、指定した SSID に接続して、IP アドレスが割り振られるところまでが確認できるようになります:
# ifconfig
  :
  :
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:608 (608.0 b)  TX bytes:608 (608.0 b)

wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.0.XXX  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:182828 errors:0 dropped:0 overruns:0 frame:0
          TX packets:176362 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:23847854 (22.7 MiB)  TX bytes:189332502 (180.5 MiB)
  :
  :

一昔前と違って、CentOS でも Skype アプリはあるし、LINE も(Chrome プラグインで)動くので CentOS をデスクトップ環境として採用できない理由はあまりないなあ、と思ってます。敢えて言えば iTunes はない。けど、個人的には iTunes に縛られたくないんだよね~。。


オフィスの中で無線 LAN を使っていると、たまにこんなことに遭遇します:
無線 LAN の調子が悪い!
繋がることは繋がるけど、反応が悪いし、すぐに切れちゃう!
全く繋がらないわけではないから自分の設定ミスではない。これは無線 LAN ステーション自体が不安定なのが原因だ! 管理者でてこーい!!

で、念のため隣の同僚に「お前もそうだよな?」と確認すると・・・ あれ、なんで大丈夫なの?
無線 LAN ステーションがおかしいわけではない? 何で自分だけ・・・??
wifi


こういった現象、もちろん原因が1つに絞られるわけではないのですが、考えられる可能性の1つとして「無線 LAN の(規格の)種類」があります。同じ無線 LAN ステーションに対しても異なるモードで接続した機器は異なる挙動になる可能性がある、ということです。

まず無線 LAN の種類を説明します。現在は 802.11a / 802.11b / 802.11g / 802.11n という4つの規格が存在しています。無線 LAN ステーションと無線 LAN 子機(PC とかスマホとか)やドライバが対応している無線 LAN 規格によってどのモードで接続することになるかが決まります。

これら4つの規格の違いは何でしょうか?使っている電波周波数や最大速度の違いもありますが、使い勝手を左右する違いとして「干渉の差」と「障害物の影響度合い」があります。

4つの規格を電波周波数帯で分けると、802.11a が 5GHz、802.11b と 802.11g が 2.4GHz です(802.11n は規格としては両方に対応しています)。周波数が高いほど、電子レンジや Bluetooth といった他の電子機器が発する電波ノイズの影響を受けにくくなります。例えば Bluetooth のマウスを接続した機器が近くにあるとか、そもそも自分自身が Bluetooth マウスを使っている、といった環境だとすると、無線 LAN を 802.11a で使っているとそれらの影響はあまり受けないけど、802.11b や 802.11g だと電波干渉を受けやすい(つまり無線も繋がりにくくなるし、マウスの方にも影響がでやすい)と言えます。

一方、周波数が高いと壁などの物理的な障害物があった時に電波が弱くなってしまい、広い範囲では利用しにくくなります。その意味では 802.11a はステーションから自分までの間にある障害物の影響を受けやすいので限られた範囲での利用になってしまう一方、802.11b や 802.11g は比較的広い範囲で使える、と言えます。

なお 802.11n は、規格としては 802.11a/b/g 全てを網羅しているのですが、実際には機器によって一部機能のみ使えたり使えなかったりもします。

仮に全ての規格に対応した無線 LAN の親機/子機を持っているとして、さてどのモードで接続させるのがよいでしょうか? これは何を優先するのか、という順位によっても答が変わってきます。でも壁の少ない、狭いオフィス内で使うことを前提とするのであれば、電波干渉の受けにくい 802.11a がいいのかな、と思っています。


話を戻します。

上記で書いたような現象が起こる原因の1つとして考えられるのは以下です:
・この人は 802.11b/g で無線 LAN に接続した結果、電波干渉の影響を受けて不安定になっている
・周りの同僚は 802.11a で無線 LAN に接続した結果、電波干渉をほとんど受けずに快適に使えている

一例として、日本で発売された iPhone の各バージョンがどの無線 LAN 規格に対応しているか、を特徴と併せて表にしてみました:
規格利用周波数帯電波干渉障害物の影響最大速度iPhoneの対応バージョン
802.11a5GHz受けにくい受けやすい54Mbps5 / 5c / 5s
802.11b2.4GHz受けやすい受けにくい11Mbps3G / 3GS/ 4 / 4s / 5 / 5c / 5s
802.11g2.4GHz受けやすい受けにくい54Mbps3G / 3GS/ 4 / 4s / 5 / 5c / 5s
802.11n(規格上は 802.11a/b/g を網羅)300Mbps4 / 4s / 5 / 5c / 5s

例えばですが、上記の人は iPhone 4s を使っていて、同僚が iPhone 5 以降を使っていた場合、自分は 802.11g に接続して干渉を受け、同僚は 802.11a に接続して快適、ということが起こり得るわけです。

余談ですが 802.11n についても補足しておくと、iPhone 4/4s は規格としては 802.11n に対応しています。でも干渉を受けにくい 5GHz 帯の電波を使って接続できるかというとできません。iPhone 4/4s の無線 LAN は利用周波数帯に関しては 2.4GHz での接続しかできない、ということです。この辺りがちょっとややこしいというかわかりにくい所です。

これはもちろん iPhone だけの問題ではなく、アンドロイドスマホやノート PC でも言えることです。使っている無線 LAN がどの規格に対応しているのか、無線 LAN 親機はどのモードでの接続に対応しているのか、それらによって隣の人と比べた際の無線 LAN の挙動も変わってくる、ということが起こり得るわけです。


iPhone に限った話をすると、4s 以前のモデルは無線 LAN では干渉を受けやすい接続しかサポートされてません。ということは、例えば Bluetooth キーボードと無線 LAN を同時に使おうとすると、それだけで干渉しまくる環境ができあがってしまうわけで、まあちょっと嫌だなあ、、、と。 その意味では今 4s 以前を使っていて無線 LAN に不満がある人はこの点だけでも 5 以降に変えるメリットはあるかもしれないですねー








 

このページのトップヘ