Connect to Wi-Fi From Terminal on Ubuntu 18.04/20.04 with WPA Supplicant

このチュートリアルでは、wpa_supplicantを使って、Ubuntu 18.04/20.04のサーバーやデスクトップで、コマンドラインからWi-Fiネットワークに接続する方法を紹介します。 最近の家庭用無線ネットワークでは、企業ネットワーク用に設計されたWPA-Enterpriseとは異なり、WPA-PSK(事前共有鍵)で通信が保護されています。 WPA-PSK は WPA-Personal とも呼ばれます。 wpa_supplicant は、WPA サプリカントコンポーネントの実装です。

Step 1: Find The Name of Your Wireless Interface And Wireless Network

iwconfig コマンドを実行して、ワイヤレスインターフェースの名前を調べます。

iwconfig

wlan0 は、Systemd を使用していない Linux システムでは、ワイヤレスネットワークインターフェースの一般的な名前でした。 UbuntuはSystemdを使用しているので、ワイヤレスネットワークインターフェースの名前がwlp4s0のようになっていることがわかるでしょう。

ubuntu server connect to wifi terminal

無線インターフェースが表示されていない場合は、以下のコマンドで表示させる必要があります。

sudo ifconfig wlp4s0 up

次に、以下のコマンドで近くのネットワークをスキャンして、無線ネットワーク名を見つけます。 wlp4s0をご自身の無線インターフェース名に置き換えてください。 ESSIDはネットワーク名の識別子です。

sudo iwlist wlp4s0 scan | grep ESSID

ubuntu 19.04 connect to wifi command line wpa supplicant

Step 2: Connect to Wi-Fi Network With WPA_Supplicant

さて、Ubuntu 18.04/20.04にwpa_supplicantをインストールします。

sudo apt install wpasupplicant

wpa_supplicant.confwpa_passphrasewpa_supplicant.confは、ユーザーがコンピューターに接続させたいすべてのネットワークを記述した設定ファイルです。 以下のコマンドを実行して、このファイルを作成します。

wpa_passphrase your-ESSID your-wifi-passphrase | sudo tee /etc/wpa_supplicant.conf

wpa_passphrase

上のスクリーンショットでは、ESSIDをダブルクオートで囲んでいることに注意してください。これは、ESSIDに空白が含まれているためです。

wpa_passphrasetee/etc/wpa_supplicant.confファイルに書き込まれます。

以下の出力は、ワイヤレスカードがアクセスポイントに正常に接続されたことを示しています。

Successfully initialized wpa_supplicantwlp4s0: SME: Trying to authenticate with c5:4a:21:53:ac:eb (SSID='LinuxBabe.Com Network' freq=2437 MHz)wlp4s0: Trying to associate with c5:4a:21:53:ac:eb (SSID='LinuxBabe.Com Network' freq=2437 MHz)wlp4s0: Associated with c5:4a:21:53:ac:ebwlp4s0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0wlp4s0: WPA: Key negotiation completed with c5:4a:21:53:ac:eb wlp4s0: CTRL-EVENT-CONNECTED - Connection to c5:4a:21:53:ac:eb completed 

Ubuntu デスクトップ版を使用している場合は、以下のコマンドで Network Manager を停止する必要があります。

sudo systemctl stop NetworkManager

そして、次のコマンドを実行して、起動時のNeworkManagerの自動起動を無効にします。

sudo systemctl disable NetworkManager-wait-online NetworkManager-dispatcher NetworkManager

デフォルトでは、wpa_supplicantはフォアグラウンドで実行されます。 接続が完了したら、別のターミナルウィンドウを開いて実行してください

iwconfig

無線インターフェースがアクセスポイントに関連付けられたことを確認できます。

enable wifi on ubuntu using terminal command

CTRL+Cを押すと、現在のwpa_supplicantプロセスを停止し、-Bフラグを追加してバックグラウンドで実行することができます。

sudo wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlp4s0

認証されてワイヤレスネットワークに接続されていますが、まだIPアドレスを持っていません。

sudo dhclient wlp4s0

これで無線LANにプライベートIPアドレスが付与されましたが、これは次のように表示できます。

ip addr show wlp4s0

ubuntu dhclient obtain private ip address

これで、インターネットにアクセスできるようになりました。 プライベートIPアドレスを公開するには、

sudo dhclient wlp4s0 -r

隠れた無線ネットワークへの接続

無線ルーターがESSIDをブロードキャストしない場合は、/etc/wpa_supplicant.confファイルに以下の行を追加する必要があります。

scan_ssid=1

以下のようになります。

network={ ssid="LinuxBabe.Com Network" #psk="12345qwert" psk=68add4c5fee7dc3d0dac810f89b805d6d147c01e281f07f475a3e0195 scan_ssid=1}

Step 3: Auto Connect At Boot Time

ブート時にワイヤレスネットワークに自動的に接続するには、wpa_supplicant.service/lib/systemd/system//etc/systemd/system/wpa_supplicantが私たちの修正を上書きしないようにするためです。

sudo cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service

Nanoなどのコマンドラインのテキストエディターでファイルを編集します。

sudo nano /etc/systemd/system/wpa_supplicant.service

次の行を見つけます。

ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant

次のように変更します。 ここでは、ExecStartコマンドに設定ファイルと無線インターフェース名を追加しています。

ExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant.conf -i wlp4s0

失敗が検出されたときには、常にwpa_supplicantの再起動を試みることをお勧めします。 ExecStart行のすぐ下に以下を追加します。

Restart=always

このファイルの中に以下の行があれば、コメントアウトします(行頭に#文字を追加します)。

Alias=dbus-fi.w1.wpa_supplicant1.service

ファイルを保存して閉じます。 (Nanoテキストエディタでファイルを保存するには、Ctrl+OEnterCtrl+Xを押します)。

sudo systemctl daemon-reload

ブート時にwpa_supplicantサービスを開始するように設定します。

sudo systemctl enable wpa_supplicant.service

また、DHCPサーバーからプライベートIPアドレスを取得するために、ブート時にdhclientを開始する必要があります。

dhclientのsystemdサービスユニットを作成することで実現できます。

sudo nano /etc/systemd/system/dhclient.service

以下のテキストをファイルに入力してください。

sudo systemctl enable dhclient.service

固定IPアドレスの取得方法

固定IPアドレスを取得したい場合は、dhclient.serviceを無効にする必要があります。

sudo systemctl disable dhclient.service

Ubuntu 18.04/20.04でnetplanを使用して静的IPアドレスを設定する必要があります。 /etc/netplan/の下に設定ファイルを作成します。

sudo nano /etc/netplan/10-wifi.yaml

このファイルに以下の行を追加します。 192.168.0.102をご希望のIPアドレスに置き換えてください。 インデントに注意してください。

network: ethernets: wlp4s0: dhcp4: no addresses: gateway4: 192.168.0.1 version: 2

このファイルを保存して閉じます。

sudo netplan apply

期待通りに動作しない場合は、--debug オプションをオンにすることもできます。

sudo netplan --debug apply

/etc/netplan/.yamlnetplannetplansystemd-networkdwpa_supplicant.servicesystemd-networkd.serviceの前に実行されるように設定することをお勧めします。そうすれば、システムはまずWi-Fiアクセスポイントに関連付けられ、次にプライベートIPアドレスを取得します。

sudo nano /etc/systemd/system/wpa_supplicant.service

次の行を見つけます。

Before=network.target

これを次のように変更します。

Before=network.target systemd-networkd.service

ファイルを保存して閉じます。

静的IPアドレスを取得するもう一つの方法は、ルーターがこの機能をサポートしている場合、ルーターの管理インターフェイスにログインし、ワイヤレスカードのMACアドレスに静的IPを割り当てることです。

Ubuntuでサービスにアクセスするためにホスト名を使用する

実際には、Ubuntuボックスに静的IPアドレスを取得する必要はありません。 UbuntuはmDNS(マルチキャストDNS)を使用してホスト名をローカルネットワークにアナウンスすることができ、クライアントはそのホスト名でUbuntuボックスのサービスにアクセスすることができます。

mDNSを使用するためには、mDNS/DNS-SDのオープンソース実装であるavahi-daemonをインストールする必要があります。

sudo apt install avahi-daemon

サービスを開始します。

sudo systemctl start avahi-daemon

ブート時の自動起動を有効にします。

sudo systemctl enable avahi-daemon

Avahi-daemonはUDP 5353でリスンするので、ファイアウォールでこのポートを開く必要があります。 UFWを使用している場合は、以下のコマンドを実行してください。

sudo ufw allow 5353/udp

続いて、hostnamectlコマンドでUbuntuボックスに固有のホスト名を設定してください。 ubuntuboxは、ローカルネットワーク内の他のデバイスによって既に使用されていない、お好みのホスト名に置き換えてください。

sudo hostnamectl set-hostname ubuntubox

ここでavahi-daemonを再起動します。

sudo systemctl restart avahi-daemon

でステータスを確認すると、

systemctl status avahi-daemon

ドメインで終わるmDNSホスト名を見ることができます。

avahi-daemon mdns hostname

クライアント・コンピュータにも、mDNS/DNS-SDソフトウェアをインストールする必要があります。

  • Linuxユーザーは、avahi-daemonをインストールしてください。
  • Windowsユーザーは、Bonjourプリントサービスをインストールするか、iTunesをインストールして、Bonjourサービスを有効にする必要があります。
  • macOSでは、Bonjourがプリインストールされています。

これで、ubuntubox.local ホスト名を使ってサービスにアクセスできるようになり、IPアドレスを確認したり入力したりする必要がなくなりました。

Raspberry PiのWifiブロック解除

Raspberry Pi用のUbuntu ARM OSは、デフォルトでワイヤレスインターフェイスをブロックします。

sudo rfkill unblock wifi

起動時にブロックを解除するには、systemd サービスユニットを作成します。

sudo nano /etc/systemd/system/unblock-wifi.service

そこに以下の行を追加します。

Description=RFKill Unblock WiFi DevicesRequires=wpa_supplicant.serviceAfter=wpa_supplicant.serviceType=oneshotExecStart=/usr/sbin/rfkill unblock wifiExecStop=RemainAfterExit=yesWantedBy=multi-user.target

ファイルを保存して閉じます。

sudo systemctl enable unblock-wifi

unblock-wifi.servicewpa_supplicant.serviceが起動した後に実行する必要があり、そうしないと無線LANのブロック解除ができないことがわかりました。 なお、デスクトップ環境をインストールしている場合は、接続の妨げになるネットワークマネージャーが動作している可能性があります。 それを無効にする必要があります。 例えば、私はRaspberry Piで軽量のLXQTデスクトップ環境を使用しているので(sudo apt install lubuntu-desktop)、connman.serviceとNetworkManager.serviceを無効にする必要があります。

sudo systemctl disable connman.service NetworkManager.service

複数のWi-Fiネットワーク

/etc/wpa_supplicant.conf 設定ファイルには複数のWi-Fiネットワークを含めることができます。wpa_supplicantは、設定ファイルのネットワークブロックの順序、ネットワークのセキュリティレベル、および信号強度に基づいて、最適なネットワークを自動的に選択します。

2つ目の Wi-Fi ネットワークを追加するには、

wpa_passphrase your-ESSID your-wifi-passphrase | sudo tee -a /etc/wpa_supplicant.conf

-atee コマンドと一緒に使用する必要があることに注意してください。これにより、元のコンテンツを削除する代わりに、新しい Wifi-network をファイルに追加します。

Wrapping Up

このチュートリアルが、Ubuntu 18.04/20.04をWPA Supplicantを使ってコマンドラインからWi-Fiネットワークに接続するのに役立つことを願っています。

Rate this tutorial

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です