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

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

タグ:lan

スタバとか、デニーズとか、マクドナルドとか、最近は(特定のキャリアと契約している前提なしで一定時間使える)無料の公衆無線 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 に縛られたくないんだよね~。。


このページのトップヘ