Ubuntu日和

【第29回】Ubuntuのネットワーク設定入門

 第28回では、読者のネットワーク心をくすぐる変態デバイス「R86S」を紹介した。これをUbuntuと組み合わせて活用するためには、Ubuntuのネットワーク設定に関する知識が必要になる。そこで今回は、Ubuntuにおけるネットワーク設定の基本部分を説明することにしよう。大丈夫、本当にUbuntuの初心者向けの回だ。もちろん光ファイバーとか10GbEの話とか出てこないので安心して読んでほしい。

デスクトップとサーバーで異なるネットワーク設定

 最近の家庭内ネットワークでは、おそらく大半のケースがブロードバンドルーターかそれに類する何かにぶら下がったEthernetないしWi-Fiデバイスが使われていることだろう。これは出先でノートPCを使う場合も同じで、公衆Wi-Fiやモバイルルーターにデザリングなど、Wi-Fi/USB/Bluetoothなどのメディアの違いはあれ、PCから見れば家庭内と同じような仕組みでネットワークに接続できているはずだ。PCにSIMを挿して接続するケースももちろん存在するが、昔のようにモデムに繋いで直接ATコマンドを打つケースは、格段に少なくなっていると思われる。

 そこで今回はEthernet/Wi-Fiにつなぐことのみを想定して、Ubuntuのネットワーク設定について解説しよう。Ubuntuを含むLinuxのネットワークスタックは、大雑把に次のコンポーネントに分かれている。

Linuxのざっくりとしたネットワークスタック

 まず最初に重要なのが「 カーネルドライバとファームウェア 」だ。カーネルドライバは、特定のデバイスを動かすためのソフトウェア部分になる。これがないと基本的にそのネットワークデバイスは動かないものと思ってほしい。

 ただし、Intelのようなメジャーなメーカー製だとよっぽど新しいデバイスでない限りは、最新のカーネルで問題なく動作する。気をつけなければいけないのは、Ubuntuが常に最新のカーネルを使っているとは限らない点だ。このため、買ったばかりのデバイスをわくわくしながら接続しても、実はUbuntuがサポートする前だったということは起こりうる。

 自分でドライバを組み込むことも可能だが、慣れていないとかなり苦労するだろう。このあたり、メーカーが自身が最新のドライバを、すぐにインストールできる形で配布しているWindowsには及ばない点ではある。言い換えると、チップのデータシートを入手したり、その挙動を実機で確認しながら自分でデバイスドライバを書くチャンスだ。もちろんイチから書かなくても、チップベンダーがソースコードも含めて提供するLinux向けのカーネルドライバをインストールするだけで済むことも多い。

普及してきた2.5GbE/5GbEのUSB-NICなんかでも、汎用のUSBネットワークドライバだけでは済まないことがある

 ネットワークデバイスによっては、ドライバだけでなくファームウェア(「binary blob」とも呼ばれる)が必要になることがある。だいたいはカーネルドライバが、認識したデバイスやその用途に合わせて適切なファームウェアをロードすることになっている。このファームウェアが組み込まれていないと、うまく動かないかもしれない。認識はしたし通信もできるけれども、期待したほど速度が出ないなんて場合は、ドライバかファームウェアの問題が考えられる。汎用ドライバだけで済むことの多いUSB-NICなんかも、ものによっては別の方法で(udevなどの仕組みを使って)設定をしないと速度が出ないなんてこともあるので注意しよう。

 「 ネットワークスタック 」は、いわゆるTCP/IPなどのプロトコル処理を行なうカーネル内部の実装だ。デバイスドライバに対する抽象化層を提供し、パケットフィルターやパケットキャプチャで使われる仕組みもここを経由する。また、このネットワークスタックに対してアプリケーションが操作したり情報を収集するための口が「 システムコール 」となる。ネットワークソフトウェアの開発者以外は、このあたりについてそこまで気にすることはないだろう。

 IPアドレスを割り振ったり、Wi-Fiの認証を行なったりするのが「 ネットワーク設定ツール 」の部分となる。今回紹介するのがこの部分だ。Webブラウザなどに代表されるネットワークを利用する「 アプリケーション 」は、ネットワーク設定ツールによって設定された内容をもとに、各種ライブラリを利用してシステムコールを呼び出し、ネットワーク通信を行なうことになる。よって、あらかじめ適切な設定がされていることを期待される。

 Ubuntuの場合、ネットワーク設定ツールは「デスクトップ」と「サーバー」で異なるソフトウェアを採用している。

  • デスクトップ用:NetworkManager
  • サーバー用:systemd-networkd

  NetworkManager はUbutnuを含むデスクトップLinuxで広く採用されている設定・管理ツールである。基本的なネットワークやWi-Fiの設定に加えて、VPNやプロキシなどもすべてNetworkManagerが提供するGUIで行なえるため、まずはこれの使い方を覚えると良いだろう。ちなみにCLI機能も充実しており、Red HatなどはサーバーでもNetworkManagerを採用している。

NetworkManagerの設定画面

  systemd-networkd は、「全てを統べる1つのプロセス」であるところの「 systemd 」のコンポーネントとして開発されているツール&サービスだ。systemdはデバイスの認識・設定を行なう「 udev 」というツールも吸収しており、そちらと組み合わせて使うことも多い。

 ただしsystemd-networkdは、設定ファイルをsystemdの流儀に合わせて記述する必要がある。慣れてしまえばそこまで難しくはないのだが、構成によっては設定が複数のファイルにまたがってしまうなど、複雑な構成に対するトライアンドエラーがそこそこ面倒だったりする。

 そこでUbuntuでは「 netplan 」という設定ジェネレータを採用し、YAMLファイルに設定を書けば適切なsystemd-networkdの設定を生成したり、設定の反映やロールバックが行なえるような仕組みを用意している。Ubuntuを使うならnetplanの使い方を覚えると楽だろう。ちなみに将来的にはNetworkManagerの設定もnetplanで管理できるようにする計画は存在する。

 第28回では「ipコマンド」を使っていくつか設定を行なった。最近のLinuxならこのipコマンド(iproute2パッケージ)を使う方法が、最も基本的な手段となる。デバッグや動作確認などが目的で、一時的に設定を反映したいならipコマンドも役に立つだろう。設定するかどうかは別にして、とりあえず「ip -s addr」だけ覚えておけばなんとかなることも多い。「ip addr」がネットワークデバイスとそれに紐付いたIPアドレスを表示するコマンドであり、ipコマンドの直後に「-s」を付けることで、統計情報(送受信したパケット数やデータ量など)を表示してくれる。ipコマンドは最小一致したコマンド名を自動保管してくれるので、「ip -s a」などでもOKだ。

ipコマンドで各種統計情報を表示した例

 NetworkManagerもsystemd-networkdも、Wi-Fiのデバイスには対応しているが、アクセスポイントに接続するための認証部分はほかのツールを利用している。それが「 wpa_supplicant 」だ。NetworkManagerの操作時にwpa_supplicantを意識することはないが、systemd-networkdなら個別に設定が必要な点に注意しよう。netplanを使う場合は、YAMLファイルに接続情報を記述することになる。

 これでUbuntuを使う場合に抑えておきたい設定ツールの名前が一通り出てきた。実際はsystemd-resolvedやdhclientなど、ほかにもいろいろ存在するが、特別な設定にしない限りはNetworkManagerやsystemd-networkdにお任せしてけば十分だろう。また、ほかのLinuxディストリビューションだとConnManやiwdなど他の設定ツール・管理ツールを採用していることもある。

NetworkManagerの基本

 Ubuntuデスクトップを使うのであれば、NetworkManagerを使えば必要なことはすべてまかなえるだろう。UIとしてはシステム設定に統合されているため、「NetworkManagerを使っている」と意識することもない。ここではそのUIを一通り紹介しよう。

有線LAN/Ethernetへの接続

 ネットワーク関連の設定へのアクセス方法はいくつか存在するが、一番手っ取り早いのが画面右上の「 システムステータス領域 」をクリックすることだ。

システムステータス領域をクリックすると、接続済みの情報が表示される
無線LANの場合は、接続するアクセスポイントもここから変更できる

 ここで「有線設定」を選ぶと、Ethernetの設定ツールが立ち上がる。これはシステム設定アプリを起動し「ネットワーク」を選択した場合と同じだ。

有線LANのネットワークの設定画面は、認識しているインターフェイスがすべて表示される

 「+」はプロファイルで、複数の設定セットを保持し切り替えられる仕組みとなっている。特定のプロファイルの変更は、個々のインターフェイスの設定の右にある歯車アイコンを押そう。「詳細」タブでは現在のIPアドレスなどの設定内容を確認できる。

設定画面その1:詳細タブでは現在の設定を確認できる

 「自動接続する」はデバイスを認識し、リンクアップを検出したら自動的に設定するモードだ。普段使うインターフェイスならチェックを入れておくことになるだろう。「他のユーザーも利用できるようにする」はここで設定した内容が、同じPCにログインしたほかのユーザーとも共有できる仕組みだ。メインのネットワークインターフェイスであればこちらもセットしておくことになる。

 「従量制接続」にチェックを入れておくと、ソフトウェアのアップデート等のネットワーク帯域を消費するシステム処理を自動的には実施しないモードになる。要するに「ギガが減る」のを防ぐための機能だ。テザリングで接続するインターフェイスなら有効化しておこう。

 さらにほかのタブについてもスクリーンショットを見ながら説明しよう。

設定画面その2:Identityタブでは主にプロファイルのメタデータやEthernetの設定を行なう。ここを変更することはまずないはずだ
設定画面その3:IPv4タブではIPv4アドレスとDNSやデフォルトルートなどの設定を行なう。基本的にすべて「自動」を選んでおけば問題ないが、固定IPアドレス等を設定したくなるとまずはこのタブを操作することになる

 「他のコンピューターと共有」は少し分かりにくいかもしれない。これを有効化した状態で、ターゲットとなるネットワークインターフェイスにほかのPCをつなぐと、そのほかのPCは専用のプライベートアドレスが割り振られて、インターネットに接続できるようになる。つまりPCを簡易ルーターにするモードだ。たとえば有線LANしかないマシンを、手元の有線/無線両対応のPCを経由してインターネットに接続したい場合などに便利だ。

 ちなみに最後のチェックボックスを有効化すると、デフォルトルートでははなく静的ルートとして設定される。つまりルートとネットマスクにマッチするアドレス宛のみ、指定したゲートウェイが使われることになる。

設定画面その4:IPv6タブもIPv4と同じ内容になる。ただし「自動」はDHCPv6だけでなくSLAACも有効化される
設定画面その5:セキュリティタブでは802.1x機能を設定できる。家庭内LANでは使うことはあまりないだろう

 VPNはUbuntu 22.04 LTSだとOpenVPNとPPTPの設定をGUIで行なえる。一応WireGuardにも対応しているが、CLIでの操作が必要になる。最新のUbuntu 23.04であればGUIで設定できるようになっているので気になるならそちらを試してみると良いだろう。

Ubuntu 23.04では、システムステータス領域が拡張されてワンタッチでオン・オフを切り替えたり、機内モードを設定できるようになっている

無線LAN/Wi-Fiへの接続

 Wi-Fiの接続も、画面右上の「 システムステータス領域 」からアクセスできる。システム設定だとWi-Fiのメニューがそれだ。

公開されているSSID一覧がリアルタイムで更新/表示される

 ウィンドウの右上のスライドが「オレンジ色」になっている場合、Wi-Fi機能が有効化されている。使わないのであれば無効化しておいても良いだろう。有効化されている場合、「ネットワーク一覧」が随時更新されているので、接続したいアクセスポイントのSSIDをクリックしよう。

Wi-Fi接続時の認証画面

 こちらはシンプルにアクセスポイントのパスワードを入力するだけだ。WPSに対応している古いタイプのアクセスポイントなら、WPSボタンを押せばパスワードを入力しなくても接続できる。接続の設定を変えたい/削除したい場合は、SSIDの右に表示される歯車を押そう。

 画面右上の縦三点のケバブメニューからは、非公開のSSIDへの接続やPCのアクセスポイント化に対応している。「 PCのアクセスポイント化 」とは、Wi-Fiのデバイスを使ってPCそのものをアクセスポイントとにする機能だ。たとえば有線LANのコネクタをルーターに接続しておいてアクセスポイント化すれば、ほかのマシンはそのPCを経由してインターネットに接続できるようになる。有線LANしかない環境で出先のノートPCをそこに繋いだ上で、スマートフォンをPCにWi-Fiでつなぐなんてケースに対応できるのだ。

アクセスポイント化する場合、SSIDも任意の文字列を設定できる

 Ubuntu 23.04からは、アクセスポイントへの接続設定を「 QRコードで表示 」できるようになった。このQRコードを表示しスマートフォンで読み込めば、Wi-Fiのアクセスポイント・パスワード情報を簡単にスマートフォンにも共有できる。

最初のSSID一覧にQRコードボタンが追加され、そこからQRコードで接続情報を共有できるようになった

 ほかにも機内モードのボタンが追加されるなど、より新しいUbuntuでは全体的にNetworkManagerの機能が拡充されている。

NetworkManagerのCLI

 デスクトップ版のUbuntuはNetworkManagerを採用しているため、Red Hat Enterprise Linux(RHEL)のようにCLIでも操作できる。それが「nmcli」コマンドだ。nmcliコマンドはipコマンドと同じようにサブコマンド方式を採用している。また、サブコマンド短縮表記できるのも同じだ。Ubuntuだとあまり使うことはないのだが、デスクトップでもCLIを駆使してみたいという愛すべき酔狂のために、簡単なコマンドをいくつか紹介しておこう。

nmcliのサンプル集
すべてのデバイスの詳細を表示する
$ nmcli
eno1: 接続済み から プロファイル 1
        "Intel I219-LM"
        ethernet (e1000e), D4:5D:DF:1D:F8:92, hw, mtu 1500
        ip4 デフォルト, ip6 デフォルト
        inet4 192.168.0.59/24
(以下略)

デバイスリストを表示する
$ nmcli device status
DEVICE          TYPE      STATE            CONNECTION
eno1            ethernet  接続済み         プロファイル 1
lxdbr0          bridge    接続済み (外部)  lxdbr0
(以下略)

コネクション(保存されている接続情報)を表示する
$ nmcli connection
NAME            UUID                                  TYPE      DEVICE
プロファイル 1  8ba68a24-077a-4b9f-abb9-14e1ef43dfbd  ethernet  eno1
lxdbr0          f248dd23-e17a-410c-aec9-e06dac029e4f  bridge    lxdbr0

Wi-Fiの公開アクセスポイントの一覧を表示する
$ nmcli device wifi list
IN-USE  BSSID              SSID             MODE      CHAN  RATE        SIGNAL  BARS  SECURITY
        5A:9B:49:4B:C2:CB  1f-for-guest     インフラ  100   540 Mbit/s  62      ▂▄▆_  WPA2 WPA3
(以下略)

 いずれも副作用のない状態表示のコマンドなので、気軽に入力して欲しい。もちろんGUIで操作できる接続設定の追加や変更、Wi-Fiのアクセスポイントへの接続は一通り行なえる。「nmcli help」でサブコマンドの一覧を、「nmcli サブコマンド help」で簡単な説明を表示してくれるので活用すると良いだろう。

systemd-networkdとnetplan

 サーバー版のUbuntuにはNetworkManagerはインストールされていない。前述したようにnetplanとsystemd-networkdの組み合わせが定番だ。

 まずはnetplanから説明しよう。netplanはネットワーク設定のジェネレータだ。YAMLファイルからsystemd-networkd向けの設定ファイルを生成・反映してくれる。YAMLファイルは「/etc/netplan/」の下に置くことで反映される。複数のファイルに分割して配置することも可能だ。

 Ubuntuサーバーをインストールした直後だと、おそらく次のような名前のファイルが生成されていることだろう。

インストール時に自動生成された設定ファイルの例
$ cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens160:
      dhcp4: true
  version: 2

 もし何か設定したいなら、このファイルを編集しても良いし、別のファイルを作成しても良い。複数のファイルで同じキーを設定している場合、後に読み込まれたほうが有効化される。よって追加設定したければ「NN-名前.yaml」というファイル名にしておいて、「NN」の部分を大きな数字にすると良いだろう。

 上記のファイルの場合「Ethernetのインターフェイスであるens160は、DHCPでIPv4アドレスを取得する」と指定している。シンプルなサーバーならこれで十分だ。DHCPではなくIPv4の固定アドレスを指定したいなら次のようになる。

固定IPアドレスの例
network:
  version: 2
  ethernets:
    enp160:
      addresses:
        - 192.0.2.100/24
      nameservers:
        search:
          - "example.local"
        addresses:
          - 8.8.8.8

 さまざまなネットワーク構成の設定例がnetplanのドキュメントに掲載されているので、まずはそちらを参照しよう。

 変更したファイルは「netplan」コマンドを使用する。いくつかのサブコマンドが存在するが、おそらく主に使うのは「netplan try」だけだろう。

YAMLファイルから設定を生成し反映する。一定時間入力がなければ、設定を元に戻す
$ sudo netplan try
Do you want to keep these settings?


Press ENTER before the timeout to accept the new configuration


Changes will revert in 116 seconds
Configuration accepted.

 これはいったん設定を反映したあと、一定時間(初期値は120秒)の間にENTERキーが入力されなかったら設定をロールバックするモードだ。何か設定を間違えて、リモートのサーバーにアクセスできなくなるのを防ぐ機能を持っている。netplanを使うなら普段からtryサブコマンドを常用するように心がけよう。これだけで「リモートから接続できなくなったサーバーのネットワークの設定を元に戻すために、パケットの代わりに人間が片道数時間の移動を行なう」なんて事故を減らせる。

 ちなみにnetplanのバックエンドはsystemd-networkdとなる。こちらは「networkctl」コマンドを使うことで状態の確認や設定の変更を行なえる。

systemd-networkdのフロントエンドであるnetworkctlコマンドを用いて、各インターフェイスの状態を表示
$ networkctl list
IDX LINK         TYPE     OPERATIONAL SETUP
  1 lo           loopback carrier     unmanaged
  2 ens160       ether    routable    configured
  3 lxdbr0       bridge   routable    unmanaged
  5 veth26ed968c ether    carrier     unmanaged
 11 veth2bce2fba ether    carrier     unmanaged

5 links listed.

 一時的にインターフェイスをアップ/ダウンしたいだけなら、YAMLファイルを編集するよりは「sudo networkctl down インターフェイス名」などが簡単だ。ただし間違ったインターフェイスをダウンしてしまうと、やはり片道数時間コースになりかねないので注意しよう。

多彩でカオスなネットワーク設定

 今回は基本的な部分しか紹介できなかったが、もともとUbuntuを含むLinuxシステムは多彩なネットワーク設定が可能で、さまざまなツールも揃っている。

 たとえば、DNSなどの名前解決に関わるresolvconfや/etc/hosts、フィルタリングや転送などパケットの操作を行なうxtables/nftables、パケットキャプチャを行なうtcpdumpやwireshark、ネットワークデバイス情報を表示/設定するethtool、ipコマンドのWi-Fiデバイス版であるiwコマンドなどなど枚挙に暇がない。これらはLinuxを使っていく上で少しつづ覚えていくとよい。

 最初のうちは何か「やってみたいこと」が出てきても、大抵の場合「すでに誰かがやっている」、「便利なツールが用意されている」ことが大半なので、まずはやりたいことをうまく言語化して検索してみよう。今ならChatGPTをはじめとする対話型のAIに相談するのも有効だ。

 ぜひさまざまな設定やツールを試して、いろんなネットワークトラブルに遭遇しよう。