「NetworkManager」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
662行目: 662行目:
 
[[NFS#NetworkManager dispatcher を使う]] を見てください。
 
[[NFS#NetworkManager dispatcher を使う]] を見てください。
   
==== ディスパッチャを使って、LAN ケーブルが挿入されているかに応じてワイヤレスを自動的にオンオフする ====
+
==== ディスパッチャを使って、LAN ケーブルが挿入されているかに応じて Wi-Fi を自動的にオンオフする ====
   
 
アイディアとしては、LAN ケーブルが抜かれた時にのみ Wi-Fi をオンにし (例えば、ラップトップのドックから取り外された時など)、LAN ケーブルが挿入されたら Wi-Fi を自動的に無効化します。
 
アイディアとしては、LAN ケーブルが抜かれた時にのみ Wi-Fi をオンにし (例えば、ラップトップのドックから取り外された時など)、LAN ケーブルが挿入されたら Wi-Fi を自動的に無効化します。

2023年8月18日 (金) 06:18時点における版

関連記事

NetworkManager は、システムがネットワークに自動的に接続できるようにするためにネットワークの検出と設定の機能を提供するプログラムです。NetworkManager の機能は無線ネットワークと有線ネットワークの両方で有用です。無線ネットワークでは、NetworkManager は既知の無線ネットワークを優先するようになっており、最も信頼性のあるネットワークに切り替える機能もあります。NetworkManager 対応のアプリケーションはオンラインモードとオフラインモードの切り替えが可能です。また、NetworkManager は無線接続よりも有線接続を優先するようになっており、モデム接続と特定の種類の VPN に対応しています。NetworkManager は元々 Red Hat によって開発されていましたが、現在では GNOME プロジェクトによってホストされています。

警告: デフォルトでは、機密情報 (Wi-Fi のパスワードなど) は root ユーザからファイルシステムでアクセス可能であり、さらに GUI (nm-applet など) を介して設定にアクセスできるユーザからもアクセス可能です。#Wi-Fi パスワードの暗号化 を参照してください。

目次

インストール

NetworkManager は networkmanager パッケージでインストールできます。このパッケージには、デーモン、コマンドラインインターフェイス (nmcli)、そして curses ベースのインターフェイス (nmtui) が含まれています。

NetworkManager を有効化する

インストールしたら、NetworkManager.service起動/有効化する必要があります。NetworkManager デーモンが起動すると、既に構成されている利用可能な "システム接続" に自動的に接続します。"ユーザ接続" や未構成の接続を設定したり接続したりするには、nmcli やアプレットが必要です。

ノート:
  • ネットワークを設定しようとするサービスが他に動いていないことを確認しなければなりません。事実、ネットワーキングサービスが複数動いていると、互いに干渉してしまいます。現在動作中のサービスの完全なリストは systemctl --type=service で見られます。衝突の恐れのあるサービスは停止してください。NetworkManager サービスを有効化する方法は #設定 を見てください。
  • systemd-resolved起動されていない場合、エラーメッセージがログに溢れ始めます。詳細は #Unit dbus-org.freedesktop.resolve1.service not found を見てください。

追加のインターフェイス

モバイルブロードバンドサポート

NetworkManager はモバイルブロードバンド接続のサポートに ModemManager を使用します。

modemmanagerusb_modeswitchインストールしてください。その後、ModemManager.service有効化し、起動してください。

ModemManager を認識させるために NetworkManager.service再起動する必要がある場合があります。サービスを再起動し、モデムを挿し直せば、認識されるはずです。

フロントエンド (例えば nm-connection-editor) から接続を追加し、接続タイプにモバイルブロードバンドを選択してください。ISP と料金プランを選んだら、APN とその他の設定が mobile-broadband-provider-info にある情報で自動的に書き込まれるはずです。

PPPoE / DSL サポート

PPPoE / DSL サポートに関しては rp-pppoeインストールしてください。PPPoE 接続を追加するには、nm-connection-editor を使って新しい DSL/PPPoE 接続を追加してください。

VPN サポート

NetworkManager 1.16 から WireGuard のネイティブなサポートが追加されました。必要なのは wireguard カーネルモジュールだけです。詳細は NetworkManager のブログ記事の WireGuard を見てください。

その他の VPN タイプに対するサポートはプラグインなシステムをベースとしています。以下のパッケージで提供されています:

警告: VPN サポートに関連するバグが大量に存在しています。デーモンプロセスのオプションが GUI から適切に設定されていることを確認し、パッケージのリリースの度にダブルチェックしてください。
ノート:
  • VPN 使用時に DNS 解決を完全に機能させるには、条件付きフォワーディングをセットアップする必要があります。
  • これらのプラグインは、ドキュメント化されたコマンドラインインターフェイスが存在しなかったり、アプレットが実行されていないと全く動作しなかったりする場合があります。通常のデスクトップ環境を使用している場合には問題になりません。通常とは異なるものを使用している場合は、接続を設定したりアクティブ化したりする際に必要なダイアログが表示されるようにするために #nm-applet を実行するべきです。[1]

使い方

NetworkManager には nmcli(1)nmtui(1) が付属しています。

nmcli 例

近くの Wi-Fi ネットワークを一覧表示します:

$ nmcli device wifi list

Wi-Fi ネットワークに接続します:

$ nmcli device wifi connect SSID_または_BSSID password パスワード

非表示の Wi-Fi ネットワークに接続します:

$ nmcli device wifi connect SSID_または_BSSID password パスワード hidden yes

wlan1 インターフェイスで Wi-Fi に接続します:

$ nmcli device wifi connect SSID_または_BSSID password パスワード ifname wlan1 プロファイル名

インターフェイスを切断します:

$ nmcli device disconnect ifname eth0

名前、UUID、タイプ、バッキングデバイスを含む接続のリストを取得します:

$ nmcli connection show

接続を有効にします (つまり、既存のプロファイルでネットワークに接続します):

$ nmcli connection up 名前_または_uuid

接続を削除します:

$ nmcli connection delete 名前_または_uuid

ネットワークデバイスとその状態のリストを表示します:

$ nmcli device

Wi-Fi をオフにします:

$ nmcli radio wifi off

接続を編集する

設定の包括的なリストについては、nm-settings(5) を参照してください。

まず、接続のリストを取得する必要があります:

$ nmcli connection
NAME                UUID                                  TYPE      DEVICE
有線接続 2          e7054040-a421-3bef-965d-bb7d60b7cecf  ethernet  enp5s0
有線接続 1          997f2782-f0fc-301d-bfba-15421a2735d8  ethernet  enp0s25
MY-HOME-WIFI-5G     92a0f7b3-2eba-49ab-a899-24d83978f308  wifi       --

ここでは、後で使用する接続 ID として最初の列を使用できます。この例では、有線接続 2 を接続 ID として選択します。

作成後に接続 有線接続 2 を設定するには、次の3つの方法があります:

nmcli 対話型エディタ
nmcli connection edit '有線接続 2'
使用法はエディタから十分に文書化されています。
nmcli コマンドラインインターフェイス
nmcli connection modify '有線接続 2' 設定.プロパティ 。使用方法については nmcli(1) を参照してください。例えば、nmcli connection modify '有線接続 2' ipv4.route-metric 200 コマンドを使用して、IPv4 ルートメトリックを 200 に変更できます。

設定を削除するには、次のように空のフィールド ("") を渡します:

nmcli connection modify '有線接続 2' 設定.プロパティ ""
接続ファイル
/etc/NetworkManager/system-connections/ で、対応する 有線接続 2.nmconnection ファイルを変更します。
nmcli connection reload で設定ファイルをリロードすることを忘れないでください。

フロントエンド

デスクトップ環境と統合するために、ほとんどのユーザはアプレットをインストールしたいと考えるでしょう。アプレットはネットワークの選択や設定を容易にするだけでなく、機密情報をセキュアに保存するために必要なエージェントも提供します。様々なデスクトップ環境は独自のアプレットを持っています。デスクトップ環境に独自のアプレットが存在しない場合、#nm-applet を使用することもできます。

GNOME

GNOME にはツールが内蔵されており、ネットワーク設定からアクセス可能です。

KDE Plasma

plasma-nm パッケージをインストールしてください。その後、パネルオプション > ウィジェットを追加 > ネットワーク で KDE タスクバーにアプレットを追加してください。

nm-applet

network-manager-applet は、システムトレイのある Xorg 環境で機能する GTK 3 フロントエンドです。

接続に関する機密情報 (Wi-Fi のパスワードなど) を保存するには、Secret Service D-Bus API を実装しているアプリケーション (GNOME/KeyringKDE WalletKeePassXC など) をインストールし設定してください。

接続の設定で Make available to other users チェックボックスオプションを有効化すると、NetworkManager はその接続のパスワードを平文で保存することに注意してください。とはいえ、パスワードが含まれるファイルは root (及び nm-applet を通して他のユーザ) からしかアクセスできません。#Wi-Fi パスワードの暗号化 を見てください。

trayerstalonetray を使うことで、システムトレイ無しで nm-applet を実行することができます。例えば、以下のようなスクリプトをパスに追加することができます:

nmgui
#!/bin/sh
nm-applet    2>&1 > /dev/null &
stalonetray  2>&1 > /dev/null
killall nm-applet

stalonetray のウィンドウを閉じると、nm-applet も閉じます。なので、ネットワークの設定を終えたら余分なメモリが消費されることはありません。

このアプレットは、Wi-Fi ネットワークの接続や切断などのイベントの通知を表示することができます。これらの通知を表示させるには、通知サーバがインストールされている必要があります (デスクトップ通知 を見てください)。アプレットを通知サーバ無しで使うと、標準出力や標準エラー出力にメッセージが表示され、最悪、アプレットがハングするかもしれません。[2] を参照してください。

通知を無効化した状態で nm-applet を実行するには、アプレットを以下のコマンドで起動してください:

$ nm-applet --no-agent
ヒント: nm-applet自動起動デスクトップファイルによって自動的に起動されるかもしれません。そのような場合に --no-agent オプションを追加するには、デスクトップファイルの Exec 行を変更してください。つまり:
Exec=nm-applet --no-agent
警告: i3 では、nm-applet が --no-agent オプションで起動された場合、パスワード入力ダイアログが表示されないため、アイテムリストをクリックして新しい暗号化された Wi-Fi ネットワークに接続することができなくなります。journal には no secrets: No agents were available for this request と出力されます。

Appindicator

バージョン 1.18.0 から、Appindicator のサポートが公式の network-manager-applet パッケージで利用可能になりました。nm-applet を Appindicator の環境で使うには、アプレットを以下のコマンドで起動してください:

$ nm-applet --indicator

networkmanager-dmenu

フロントエンドのもう一つの選択肢は networkmanager-dmenu-gitAUR です。これは、NetworkManager の接続を nm-applet ではなく dmenurofi で管理する小さなスクリプトです。このスクリプトには必須の機能が全て揃っています。例えば: NetworkManager の既存の Wi-Fi 接続や有線接続に接続する、新しい Wi-Fi 接続に接続する、必要に応じてパスフレーズを要求する、既存の VPN 接続に接続する、ネットワークを有効化/無効化する、nm-connection-editor GUI を起動する、Bluetooth ネットワークに接続する。

設定

NetworkManager を適切に実行させるには、いくつか追加の手順が必要です。ネットワーク設定#ホスト名の設定 で説明されているように、/etc/hosts が設定されていることを確認してください。

NetworkManager のグローバルな設定ファイルは /etc/NetworkManager/NetworkManager.conf です。追加の設定ファイルは /etc/NetworkManager/conf.d/ に置くことができます。通常、グローバルなデフォルト値に対して設定を行う必要はありません。

設定ファイルを編集したら、以下のコマンドで変更を適用することができます:

# nmcli general reload

NetworkManager-wait-online

NetworkManager.service を有効化すると、NetworkManager-wait-online.service も有効化されます。NetworkManager-wait-online.service は oneshot なシステムサービスで、ネットワークが構成されるまで待機します。このサービスには WantedBy=network-online.target が含まれているため、このサービスが終了するのは、network-online.target 自体が有効化されている時か、あるいは network-online.target が他のユニットによって実行された時のみです。systemd#ネットワークが稼働した後にサービスを実行する も参照してください。

デフォルトでは、NetworkManager-wait-online.service は、ネットワーク接続が確立されるのを待つ (nm-online(1) を参照) のではなく、NetworkManager の起動が完了するのを待ちます。ネットワークの準備が整う前に NetworkManager-wait-online.service が終了してしまってブート時に一部のサービスが失敗してしまう場合、NetworkManager-wait-online.service ユニットを拡張し、ExecStart 行から -s を削除してください:

[Service]
ExecStart=
ExecStart=/usr/bin/nm-online -q

ただし、これにより他の問題が発生する可能性があることに注意してください。

一部のケースで、タイムアウトの設定が短すぎるために、このサービスの起動が失敗してしまう場合があります。サービスを編集して NM_ONLINE_TIMEOUT60 からより大きい値に変更してください。

PolicyKit のパーミッションをセットアップする

デフォルトでは、アクティブなローカルセッションのユーザは全員パスワード無しでほぼ全てのネットワーク設定を変更することができます。セッションの種類を確認する方法については、一般的なトラブルシューティング#セッションのパーミッション を見てください。ほとんどの場合、特に設定しなくても全て動作するはずです。

一部のアクション (システムのホスト名を変更するなど) においては、管理者のパスワードが必要です。そのような場合、自身のユーザを wheel グループに追加し、パスワードのプロンプトを表示する Polkit の認証エージェントを実行する必要があります。

リモートセッションの場合 (例えば、ヘッドレス VNC)、NetworkManager を使用するために必要な特権を得る方法は複数あります:

  1. 自身を wheel グループに追加する。アクションの度にパスワードを入力する必要があります。注意点として、wheel グループに追加すると他の権限 (root パスワードを入力せずに sudo を実行できるなど) も付与される場合があります。
  2. 自身を network グループに追加し、以下の内容で /etc/polkit-1/rules.d/50-org.freedesktop.NetworkManager.rules を作成する:
    polkit.addRule(function(action, subject) {
      if (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 && subject.isInGroup("network")) {
        return polkit.Result.YES;
      }
    });
    
    network グループ内の全ユーザがパスワード無しでネットワークの追加と削除を行えるようになります (これは、Polkit 認証エージェントを実行する必要がないことを意味します。なので、この方法は SSH セッションでも使えます。)。

プロクシ設定

NetworkManager は直接プロクシ設定を扱いませんが、GNOMEKDE を使っている場合、NetworkManager の情報を使ってプロクシ設定を管理する proxydriverAUR を使うことができます。

proxydriver でプロクシ設定を変更できるようにするには、GNOME スタートアッププロセスの一部として、次のコマンドを実行する必要があります (GNOME#自動起動 を参照):

$ xhost +si:localuser:ユーザ名

参照: プロキシ設定

接続の確認

NetworkManager は、ネットワークに接続した後にウェブサーバへの接続を試みて、キャプティブポータルなどが存在しないか確認します。デフォルトの接続先ホスト (/usr/lib/NetworkManager/conf.d/20-connectivity.conf で設定されています) は ping.archlinux.org (redirect.archlinux.org の CNAME エイリアス) です。別のウェブサーバを使う、または接続チェックを無効化するには、/etc/NetworkManager/conf.d/20-connectivity.conf を作成してください (NetworkManager.conf(5) § CONNECTIVITY SECTION を参照)。以下は、GNOME のサーバを使用する例です (GNOME を使用する必要はありません):

/etc/NetworkManager/conf.d/20-connectivity.conf
[connectivity]
uri=http://nmcheck.gnome.org/check_network_status.txt

NetworkManager の接続チェックを無効化するには、以下の設定を使用してください。これは、接続チェックを無効化する VPN に接続している場合に便利です。

/etc/NetworkManager/conf.d/20-connectivity.conf
[connectivity]
enabled=false
ノート: 自動的な接続チェックはプライバシーの問題を引き起こす可能性がありますが、Arch Linux のデフォルトの接続先 URL は如何なるアクセスも記録しません。[3] [4] を参照してください。

キャプティブポータル

キャプティブポータルが存在している場合、デスクトップマネージャが、資格情報を求めるウィンドウを自動的に開く場合があります。あなたのデスクトップ環境がこれを行わない場合、capnet-assist パッケージを使用することができます (しかし現在、このパッケージの NetworkManager ディスパッチャスクリプトは壊れています)。あるいは、NetworkManager ディスパッチャスクリプトを以下の内容で作成することもできます:

/etc/NetworkManager/dispatcher.d/90-open_captive_portal
#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs shows a login webpage on walled garden networks.
# See NetworkManager(8) for further documentation of the dispatcher events.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

if [ -x "/usr/bin/logger" ]; then
    logger="/usr/bin/logger -s -t captive-portal"
else
    logger=":"
fi

wait_for_process() {
    PNAME=$1
    while [ -z "$(/usr/bin/pgrep $PNAME)" ]; do
        sleep 3;
    done
}

#launch the browser, but on boot we need to wait that nm-applet starts
start_browser() {
    local user="$1"
    local display="$2"

    export DISPLAY="$display"
    wait_for_process nm-applet

    export XAUTHORITY="/home/$user/.Xauthority"

    $logger "Running browser as '$user' with display '$display' to login in captive portal"
    sudo -u "$user" --preserve-env=DISPLAY,XAUTHORITY -H xdg-open http://capnet.elementary.io 2>&1 > /dev/null
}

# Run the right scripts
case "$2" in
    connectivity-change)
    $logger -p user.debug "dispatcher script triggered on connectivity change: $CONNECTIVITY_STATE"
    if [ "$CONNECTIVITY_STATE" = "PORTAL" ]; then
        # Match last column of who's output with ' :[at least one digit] '
        who | awk '$NF ~ /\(:[0-9]+\)/ { print $1 " " substr($NF, 2, length($NF)-2) };' | \
        while read user display; do
            start_browser $user $display || $logger -p user.err "Failed for user: '$user' display: '$display'"
        done
    fi
    ;;
    *)
    # In a down phase
    exit 0
    ;;
esac

このスクリプトを実行するには、NetworkManager.service再起動するか、システムを再起動する必要があります。そうしたら、ディスパッチャスクリプトはキャプティブポータルを検知するとログインウィンドウを開くはずです。

別の解決策は Google Chrome ベースの captive-browser-gitAUR です。

DHCP クライアント

デフォルトでは、NetworkManager は自身の内蔵 DHCP クライアントを使用します。内蔵 DHCPv4 プラグインは nettools の n-dhcp4 ライブラリをベースにしていますが、内蔵 DHCPv6 プラグインは systemd-networkd ベースのコードから作られています。

別の DHCP クライアントを使用するには、以下の代替実装のどれかをインストールしてください:

DHCP クライアントのバックエンドを変更するには、/etc/NetworkManager/conf.d/ 内に設定ファイルを作成して、そのファイル内で main.dhcp=DHCP_クライアント名 オプションを設定してください。例えば:

/etc/NetworkManager/conf.d/dhcp-client.conf
[main]
dhcp=dhclient
ノート:
  • NetworkManger は IPv6 に dhcpcd を使用することをサポートしていません。NetworkManager issue #5 を参照してください。dhcpcd が DHCP クライアントとして設定されている場合、NetworkManager は DHCPv6 に対しては内臓の DHCP クライアントを使用します。
  • dhclient パッケージと dhcpcd パッケージに同梱されている systemd ユニットは有効化しないでください。NetworkManager と競合してしまいます。詳細は #インストール セクションに書かれているノートを見てください。

DNS の管理

NetworkManager の DNS 管理については、GNOME プロジェクトの wiki ページ Projects/NetworkManager/DNS で説明されています。

DNS キャッシングと条件付きフォワーディング

NetworkManager には、dnsmasq または systemd-resolved を使用して DNS キャッシングと条件付きフォワーディングを有効化するプラグインが存在します (以前は、"条件付きフォワーディング" は NetworkManager のドキュメントで "split DNS" と呼ばれていました)。このセットアップには、DNS ルックアップがキャッシュされるので名前解決の時間が短縮され、VPN ホストの DNS ルックアップが、関連する VPN の DNS サーバに転送されるという長所があります。これは、複数の VPN に接続する場合に特に便利です。

ノート: /etc/resolv.conf/run/systemd/resolve/stub-resolv.conf/run/systemd/resolve/resolv.conf/lib/systemd/resolv.conf/usr/lib/systemd/resolv.conf へのシンボリックリンクである場合、NetworkManager は systemd-resolved を自動的に選択します。dnsmasq を使用するには、まずシンボリックリンクを削除する必要があります。その後で、NetworkManager を再起動してください。
dnsmasq

dnsmasq がインストールされていることを確認してください。そして、/etc/NetworkManager/conf.d/ 内の設定ファイル (無い場合は作成してください) で main.dns=dnsmasq を設定してください:

/etc/NetworkManager/conf.d/dns.conf
[main]
dns=dnsmasq

次に、nmcli general reload を root として実行してください。NetworkManager は自動的に dnsmasq を起動し、/etc/resolv.conf127.0.0.1 を追加します。元の DNS サーバは /run/NetworkManager/no-stub-resolv.conf を見れば分かります。dnsmasq が使用されているかどうかは、drill example.com で同じ DNS ルックアップを2度行ってサーバとクエリの時間を計測すれば確認できます。

ノート:
  • dnsmasq.service を起動したり、/etc/dnsmasq.conf を編集したりする必要はありません。NetworkManager は、その systemd サービスを使わず、さらに dnsmasq のデフォルトの設定ファイルを読み込まずに dnsmasq を起動します。
  • NetworkManager によって起動された dnsmasq インスタンスは 127.0.0.1:53 にバインドされます。なので、これと同じアドレスとポートで他のソフトウェア (dnsmasq.service も含む) を実行することはできません。
dnsmasq のカスタム設定

/etc/NetworkManager/dnsmasq.d/ 内に設定ファイルを作成することで、dnsmasq のカスタム設定を作成することができます。例えば、DNS キャッシュ (RAM 内に格納されます) のサイズを変更するには:

/etc/NetworkManager/dnsmasq.d/cache.conf
cache-size=1000

設定ファイルの構文は以下のコマンドで確認できます:

$ dnsmasq --test --conf-file=/dev/null --conf-dir=/etc/NetworkManager/dnsmasq.d

利用可能な全てのオプションについては dnsmasq(8) を参照してください。

IPv6
この記事またはセクションの正確性には問題があります。
理由: NetworkManager は ::1/etc/resolv.conf に追加しないため、以下の方法では問題を解決できません。@::1 を手動で drill に渡さない限り、Error: error sending query: No (valid) nameservers defined in the resolver というエラーで失敗します。 (議論: トーク:NetworkManager#)

NetworkManager で dnsmasq を有効化すると、IPv6 のみの DNS ルックアップ (つまり、drill -6 [hostname]) が機能しなくなる場合があります (しかし、それ以外では機能する)。この問題を解決するには、以下のファイルを作成し、IPv6 ループバックもリッスンするように dnsmasq を設定してください:

/etc/NetworkManager/dnsmasq.d/ipv6-listen.conf
listen-address=::1

さらに、dnsmasq は上流の IPv6 DNS を優先しません。残念ながら、NetworkManager も IPv6 DNS を優先しません (Ubuntu Bug)。回避策は、NetworkManager の設定で IPv6 DNS を無効化することです (IPv4 DNS があると仮定します)。

DNSSEC

NetworkManager によってデフォルトで開始される dnsmasq インスタンスは、--proxy-dnssec オプションを渡して開始されるため、DNSSEC を検証しません。なので、上流の DNS サーバからの DNSSEC 情報を何でも信頼します。

dnsmasq に DNSSEC を適切に検証させるには、以下の設定ファイルを作成してください (これにより、DNSSEC をサポートしない名前サーバでの DNS 解決が機能しなくなります):

/etc/NetworkManager/dnsmasq.d/dnssec.conf
conf-file=/usr/share/dnsmasq/trust-anchors.conf
dnssec
systemd-resolved

NetworkManager は systemd-resolved を DNS リゾルバ及び DNS キャッシュとして使用することができます。まず先に、systemd-resolved が適切に設定されていて、systemd-resolved.service開始されていることを確認してください。

/etc/resolv.conf/run/systemd/resolve/stub-resolv.conf/run/systemd/resolve/resolv.conf/usr/lib/systemd/resolv.conf へのシンボリックリンクである場合、systemd-resolved は自動的に使用されます。

/etc/NetworkManager/conf.d/ 内の設定ファイルで main.dns=systemd-resolved を設定することで、これを明示的に有効化することもできます:

/etc/NetworkManager/conf.d/dns.conf
[main]
dns=systemd-resolved
openresolv サブスクライバのある DNS リゾルバ

ローカルの DNS リゾルバへのサブスクライバ (加入者) が openresolv に存在している場合、サブスクライバをセットアップし、openresolv を使用するように NetworkManager を設定してください

NetworkManager は単一の "インターフェイス" を resolvconf に広告するため、2つの NetworkManager 接続間で条件付きフォワーディングを行うのは不可能です。NetworkManager issue 153 を参照してください。

この問題は /etc/resolvconf.confprivate_interfaces="*" を設定すれば、部分的に緩和できます [5]。検索ドメインリストに無いドメインのクエリは、フォワーディングされません。そのようなクエリは、他の DNS サーバにフォワーディングされるか、DNS ルートサーバから回帰的に解決されるなどして、ローカルのリゾルバの設定に従って処理されます。

カスタム DNS サーバ

カスタムグローバル DNS サーバの設定

全ての接続に対して DNS サーバを設定するには、NetworkManager.conf(5) 内で [global-dns-domain-*] というセクション内で servers=serveripaddress1,serveripaddress2,serveripaddress3 という構文を使ってDNS サーバを指定してください。例えば:

/etc/NetworkManager/conf.d/dns-servers.conf
[global-dns-domain-*]
servers=::1,127.0.0.1
ノート:
接続でのカスタム DNS サーバの設定
接続でのカスタム DNS サーバの設定 (GUI)

セットアップ方法は、使用するフロントエンドの種類に依ります。手順としては通常、アプレットを右クリックし、プロファイルを編集 (または作成) し、DHCP タイプに 自動 (アドレスのみ) (Automatic (specify addresses)) を選択するというものです。DNS アドレスを入力する必要があり、通常、127.0.0.1, DNS-server-one, ... という形です。

接続でのカスタム DNS サーバの設定 (nmcli / 設定ファイル)

接続の設定dns フィールド (及び、関連する dns-searchdns-options) を使うことで、接続毎に DNS サーバをセットアップすることができます。

methodauto に設定されている場合 (DHCP を使用する場合)、ignore-auto-dnsyes に設定する必要があります。

/etc/resolv.conf

NetworkManager の /etc/resolv.conf 管理モードは、main.rc-manager で設定されます。networkmanager パッケージはこれを、上流のデフォルトである auto ではなく、symlink に設定します。設定と値は NetworkManager.conf(5) man ページでドキュメント化されています。

ヒント: openresolv を使用すると、NetworkManager は、resolvconf によってサポートされている他のソフトウェアと共存できます。例えば、openresolv が subscriber を持つローカル DNS キャッシングおよび分割 DNS リゾルバを実行できます。openresolv で NetworkManager を使用する場合、条件付きフォワーディングはまだ完全にサポートされていないことに注意してください。

また、NetworkManager は、ネットワークの変更後に /etc/resolv.conf を変更するために使用できる、いわゆるディスパッチャスクリプトを介したフックも提供します。詳細は #ネットワークサービスで NetworkManager dispatcher を使用するNetworkManager(8) を参照してください。

ノート:
  • NetworkManager が dnsmasq または systemd-resolved のいずれかを使用するように設定されている場合、適切なループバックアドレスが /etc/resolv.conf に書き込まれます。
  • NetworkManager が書き込む resolv.conf、または /etc/resolv.conf に書き込む内容は、/run/NetworkManager/resolv.conf で見られます。
  • 取得したネームサーバーと検索ドメインを含む resolv.conf ファイルは、/run/NetworkManager/no-stub-resolv.conf にあります。
管理対象外の /etc/resolv.conf

NetworkManager が /etc/resolv.conf に干渉しないようにするには、/etc/NetworkManager/conf.d/ の設定ファイルで main.dns=none を設定してください:

/etc/NetworkManager/conf.d/dns.conf
[main]
dns=none
ヒント: NetworkManager が DNS 設定を systemd-resolved に送信しないように、main.systemd-resolved=false を設定することもできます。
ノート: main.dns=none を使うのではなく、dnsmasqsystemd-resolved などの他の DNS バックエンドを使用するように NetworkManager を設定する方法については、#DNS キャッシングと条件付きフォワーディング を見てください。

その後、/etc/resolv.conf が壊れたシンボリックリンクになり、削除する必要が生じるかもしれません。その場合、新しい /etc/resolv.conf ファイルを作成してください。

openresolv を使う
ノート: NetworkManager は、systemd-resolvconf によって提供されている systemd-resolved の resolvconf インターフェイスの使用をサポートしていません (resolvectl(1) § COMPATIBILITY WITH RESOLVCONF(8))。

openresolv を使用するように NetworkManager を設定するには、/etc/NetworkManager/conf.d/ 内の設定ファイルで main.rc-manager=resolvconf を設定してください:

/etc/NetworkManager/conf.d/rc-manager.conf
[main]
rc-manager=resolvconf

ファイアウォール

現在の接続に基づいて firewalld ゾーンを割り当てることができます。たとえば、職場では制限の厳しいファイアウォールを使用し、自宅では制限の少ないファイアウォールを使用します。

これは、NetworkManager dispatcher を使用して行うこともできます。

ネットワークサービスで NetworkManager dispatcher を使用する

NetworkManager がインターフェイスを立ち上げるまで実行したくないようなネットワークサービスはたくさんあります。NetworkManager には、(例えば NFSSMBNTPd を使用する時などに) ネットワークに接続したらサービスを開始し、切断したらサービスを停止する機能があります。

この機能を有効化するには、NetworkManager-dispatcher.service有効化し、かつ起動する必要があります。

このサービスを有効化したら、/etc/NetworkManager/dispatcher.d 内にスクリプトを追加することができます。

スクリプトは root によって所有されていなければなりません。ディスパッチャは、root によって所有されていないスクリプトを実行しません。セキュリティを高めるために、スクリプトのグループ所有権も root に設定してください:

# chown root:root /etc/NetworkManager/dispatcher.d/10-script.sh

スクリプトファイルを実行可能にするのを忘れないでください。

スクリプトは、ネットワークへの接続時にはアルファベット順で実行され、切断時には逆アルファベット順で実行されます。実行される順番を保証するために、スクリプトの名前の前に数字を置くのが一般的です (例: 10-portmap30-netfs。こうすることで、NFS がマウントを試みる前に、portmapper が立ち上がります)。

スクリプトは以下の引数を受け取ります:

  • インターフェイス名: 例えば eth0
  • アクション: updownvpn-upvpn-down など (完全なリストは NetworkManager-dispatcher(8) を見てください)
警告: 外部ネットワークや公開ネットワークに接続する場合は、どのサービスを起動するのか、どのサーバにサービスは接続できるのかに注意してください。公開ネットワークに接続する際に間違ったサービスを起動してしまうとセキュリティホールを作ってしまう可能性があります。

ディスパッチャのタイムアウトを防ぐ

上記がうまくいっているのであれば、このセクションは関係しません。しかし、ディスパッチャのスクリプトの実行に時間が掛かってしまうという一般的な問題があります。最初は、3 秒だけの内部タイムアウトが使用されていました。呼ばれたスクリプトが時間内に完了しないと、そのスクリプトは kill されていました。後に、タイムアウトは約 20 秒に延長されました (詳細は Bugtracker を参照)。タイムアウトのせいで依然として問題が発生する場合は、NetworkManager-dispatcher.service に対するドロップインファイルを使って、終了後もアクティブ状態を維持するように設定することで問題を回避できます:

/etc/systemd/system/NetworkManager-dispatcher.service.d/remain_after_exit.conf
[Service]
RemainAfterExit=yes

その後、変更した NetworkManager-dispatcher サービスを開始し、かつ有効化してください。

警告: RemainAfterExit 行を追加すると、ディスパッチャが閉じられなくなります。残念ながら、ディスパッチャは、スクリプトを再び実行する前に閉じなければなりません。先の設定により、ディスパッチャはタイムアウトしませんが、閉じられもしません。これは、スクリプトはブート毎に 1 度しか実行されないことを意味します。なので、タイムアウトが実際に問題を起こしていない限り、この行を追加しないでください。

ディスパッチャの例

sshfs でリモートディレクトリをマウントする

このスクリプトは非常に制限された環境内で実行されるため、SSH エージェントに接続するためには SSH_AUTH_SOCK 変数をエクスポートする必要があります。これを行う方法はいくつかあります (詳細はこのメッセージを見てください)。以下の例は GNOME Keyring を使って動作し、キーリングがまだアンロックされていない場合はパスワードを要求します。NetworkManager がログイン時に自動的にネットワークに接続するような状況では、gnome-keyring がまだ開始されておらず、変数のエクスポートが失敗する可能性が高いです (そのために sleep コマンドがあります)。接続とマッチする UUID は、nmcli connection statusnmcli connection list を実行すれば確認できます。

#!/bin/sh
USER='username'
REMOTE='user@host:/remote/path'
LOCAL='/local/path'

interface=$1 status=$2
if [ "$CONNECTION_UUID" = "uuid" ]; then
  case $status in
    up)
      # sleep 10
      SSH_AUTH_SOCK=$(find /tmp -maxdepth 1 -type s -user "$USER" -name 'ssh')
      export SSH_AUTH_SOCK
      su "$USER" -c "sshfs $REMOTE $LOCAL"
      ;;
    down)
      fusermount -u "$LOCAL"
      ;;
  esac
fi

SMB 共有をマウントする

SMB 共有は特定のネットワークや場所 (例えば自宅) でしか利用できないことがあります。ディスパッチャを使えば、現在の場所で利用可能な SMB 共有のみをマウントすることができます。

以下のスクリプトは、特定のネットワークに接続していることを確認し、それに応じて共有をマウントします:

/etc/NetworkManager/dispatcher.d/30-mount-smb.sh
#!/bin/sh

# 接続 UUID はターミナルで "nmcli connection show" を実行して確認してください。
# 全種類の NetworkManager 接続がサポートされています: 無線、VPN、有線など。
if [ "$2" = "up" ]; then
  if [ "$CONNECTION_UUID" = "uuid" ]; then
    mount /your/mount/point & 
    # add more shares as needed
  fi
fi

以下のスクリプトは、ソフトウェアが特定のネットワークからの切断を開始する前に、全ての SMB 共有をアンマウントします:

/etc/NetworkManager/dispatcher.d/pre-down.d/30-umount-smb.sh
#!/bin/sh

if [ "$CONNECTION_UUID" = "uuid" ]; then
  umount -a -l -t cifs
fi
ノート: このスクリプトは上記の通り pre-down.d サブディレクトリに配置してください。さもないと、接続状態が変わる度に毎回、全ての共有がアンマウントされてしまいます。

以下のスクリプトは、特定のネットワークから予期せずに切断されてしまった時に、全ての SMB 共有のアンマウントを試みます:

/etc/NetworkManager/dispatcher.d/40-umount-smb.sh
#!/bin/sh

if [ "$CONNECTION_UUID" = "uuid" ]; then
  if [ "$2" = "down" ]; then
    umount -a -l -t cifs
  fi
fi
ノート:
  • NetworkManager 0.9.8 から、pre-downdown のイベントはシャットダウン時や再起動時に実行されなくなりました。詳細はこのバグレポートを見てください。
  • 上記 2 つの umount スクリプトでは、マウントに実際にアクセスしているアプリケーションが 'ハング' してしまう傾向が依然としてあります。

代替案は、NFS#NetworkManager dispatcher を使う にあるスクリプトを使うことです:

/etc/NetworkManager/dispatcher.d/30-smb.sh
#!/bin/sh

# 接続 UUID はターミナルで "nmcli connection show" を実行して確認してください。
# 全種類の NetworkManager 接続がサポートされています: 無線、VPN、有線など。
WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"

if [ "$CONNECTION_UUID" = "$WANTED_CON_UUID" ]; then
    
    # スクリプトパラメータ $1: ネットワークインターフェイス名 (未使用)
    # スクリプトパラメータ $2: ディスパッチされたイベント
    
    case "$2" in
        "up")
            mount -a -t cifs
            ;;
        "down"|"pre-down"|"vpn-pre-down")
            umount -l -a -t cifs >/dev/null
            ;;
    esac
fi
ノート: このスクリプトは noauto オプションのマウントは無視します。これらのマウントをディスパッチャが管理できるようにするには、このオプションを取り除くか、auto を使ってください。

pre-down イベントをキャッチできるようにするために /etc/NetworkManager/dispatcher.d/pre-down/ 内にシンボリックリンクを作成してください:

# ln -s ../30-smb.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-smb.sh

NFS 共有をマウントする

NFS#NetworkManager dispatcher を使う を見てください。

ディスパッチャを使って、LAN ケーブルが挿入されているかに応じて Wi-Fi を自動的にオンオフする

アイディアとしては、LAN ケーブルが抜かれた時にのみ Wi-Fi をオンにし (例えば、ラップトップのドックから取り外された時など)、LAN ケーブルが挿入されたら Wi-Fi を自動的に無効化します。

以下のディスパッチャスクリプト[6]を作成してください。LAN_interface の部分はあなたの LAN インターフェイスに置き換えてください。

コンピュータがオンの時に LAN インターフェイスが接続され、コンピュータがオフの時に切断された場合のフェイルセーフがあることに注意してください。このフェイルセーフがないと、コンピュータがオンに戻っても Wi-Fi は依然としてオフであり、LAN インターフェイスが切断されていれば、ネットワーク接続が利用できなくなってしまいます。

/etc/NetworkManager/dispatcher.d/wlan_auto_toggle.sh
#!/bin/sh

if [ "$1" = "LAN_interface" ]; then
    case "$2" in
        up)
            nmcli radio wifi off
            ;;
        down)
            nmcli radio wifi on
            ;;
    esac
elif [ "$(nmcli -g GENERAL.STATE device show LAN_interface)" = "20 (unavailable)" ]; then
    nmcli radio wifi on
fi
ノート: nmcli を使えばインターフェイスの一覧を得られます。イーサネット (LAN) インターフェイスの名前は en で始まります (例: enp0s5)。

ディスパッチャを使って、ネットワーク接続が確立された後に VPN に接続する

この例では、特定の Wi-Fi ネットワークに接続した後に、以前定義された VPN 接続に自動的に接続したいと思います。最初にすべきことは、そのネットワークに接続した後にすることを定義するディスパッチャスクリプトを作成することです。

ノート: このスクリプトでは iwgetid を使うために wireless_tools を必要とします。
/etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh
VPN_NAME="NetworkManager に定義されている VPN 接続の名前"
ESSID="Wi-Fi ネットワークの ESSID (接続名ではない)"

interface=$1 status=$2
case $status in
  up|vpn-down)
    if iwgetid | grep -qs ":\"$ESSID\""; then
      nmcli connection up id "$VPN_NAME"
    fi
    ;;
  down)
    if iwgetid | grep -qs ":\"$ESSID\""; then
      if nmcli connection show --active | grep "$VPN_NAME"; then
        nmcli connection down id "$VPN_NAME"
      fi
    fi
    ;;
esac

全ての Wi-Fi ネットワークで VPN への接続を試みたい場合は、次の ESSID 定義を使用できます: ESSID=$(iwgetid -r)。スクリプトのパーミッションを適宜設定することを忘れないでください。

VPN の機密情報が保管される方法により、上記のスクリプトで VPN への接続しようとしても、NetworkManager-dispatcher.service が 'no valid VPN secrets' というエラーで失敗する場合があります。幸運なことに、スクリプトから VPN のパスワードにアクセスする方法は他にもあります。

1: それらの方法の1つでは、VPN 接続の設定ファイルを編集して、root からはアクセスできないキーリングではなく自身で機密情報を保存させるように NetworkManager を設定する必要があります: /etc/NetworkManager/system-connections/VPN接続の名前 を開き、password-flagssecret-flags1 から 0 に変更してください。

それだけではうまく行かない場合は、以下の内容で passwd-file を安全な場所にディスパッチャスクリプトと同じパーミッションと所有権で作成する必要があるかもしれません:

/path/to/passwd-file
vpn.secrets.password:パスワード

ファイルからパスワードを得られるようにするために、スクリプトは適宜変更する必要があります:

/etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh
VPN_NAME="NetworkManager に定義されている VPN 接続の名前"
ESSID="Wi-Fi ネットワークの ESSID (接続名ではない)"

interface=$1 status=$2
case $status in
  up|vpn-down)
    if iwgetid | grep -qs ":\"$ESSID\""; then
      nmcli connection up id "$VPN_NAME" passwd-file /path/to/passwd-file
    fi
    ;;
  down)
    if iwgetid | grep -qs ":\"$ESSID\""; then
      if nmcli connection show --active | grep "$VPN_NAME"; then
        nmcli connection down id "$VPN_NAME"
      fi
    fi
    ;;
esac

2: あるいは、password-flags を変更して、設定ファイル内に vpn-secrets セクションを追加してパスワードを直接書き込むという方法もあります:

 [vpn]
 ....
 password-flags=0
 
 [vpn-secrets]
 password=パスワード
ノート: NetworkManager の接続エディタを再び開き、VPN のパスワード/機密情報を保存し直す必要があるかもしれません。

ディスパッチャを使って、VPN プロバイダの接続時に IPv6 を無効化する

多くの商用 VPN プロバイダーは IPv4 のみをサポートしています。つまり、IPv6 のトラフィックは全て VPN をバイパスし、事実上、使い物にならなくなります。ディスパッチャを使って、VPN に接続されている時は全ての IPv6 トラフィックを無効化することで、この問題を回避できます。

/etc/NetworkManager/dispatcher.d/10-vpn-ipv6
#!/bin/sh

case "$2" in
	vpn-up)
		echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
		;;
	vpn-down)
		echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6
		;;
esac

OpenNTPD

OpenNTPD#NetworkManager dispatcher を使う を参照してください。

systemd-timesyncd で DHCP 経由で受信した NTP サーバを動的に設定する

異なるネットワーク間 (例: 会社の LAN、自宅の Wi-Fi、その他の様々な Wi-Fi) でローミングする場合、timesyncd によって使用されている NTP サーバを DHCP によって提供されているものに設定したい場合があります。ただし、NetworkManager 自体は systemd-timesyncd と通信して NTP サーバを設定することはできません。

ディスパッチャを使うことで、この問題を回避できます。

systemd-timesyncd の設定ようのオーバーレイディレクトリ /etc/systemd/timesyncd.conf.d作成してください (まだ存在していない場合)。/etc/NetworkManager/dispatcher.d 内に以下を追加してください:

/etc/NetworkManager/dispatcher.d/10-update-timesyncd
#!/bin/sh

[ -z "$CONNECTION_UUID" ] && exit 0
INTERFACE="$1"
ACTION="$2"

case $ACTION in
up | dhcp4-change | dhcp6-change)
    [ -n "$DHCP4_NTP_SERVERS" ] || exit
    mkdir -p /etc/systemd/timesyncd.conf.d
    cat <<-THE_END >"/etc/systemd/timesyncd.conf.d/${CONNECTION_UUID}.conf"
        [Time]
        NTP=$DHCP4_NTP_SERVERS
    THE_END
    systemctl restart systemd-timesyncd.service
    ;;
down)
    rm -f "/etc/systemd/timesyncd.conf.d/${CONNECTION_UUID}.conf"
    systemctl restart systemd-timesyncd.service
    ;;
esac

NetworkManager が新しいネットワーク接続を設定する (ACTION=up) か、既存の接続の更新を取得する (ACTION=dhcp4-change または ACTION=dhcp6-change) 度に、接続データに NTP サーバ (DHCP4_NTP_SERVERS) に関する情報が含まれていると、接続固有のオーバーレイ設定ファイルが /etc/systemd/timesyncd.conf.d に書き込まれ、このファイルには、提供された NTP サーバ (1台または複数) の情報が記述されます。提供された NTP サーバが含まれます。接続が停止される (ACTION=down) と、接続固有のオーバーレイファイルは削除されます。systemd-timesyncd の設定が変更されるたびに、サービスは再起動され、更新された設定を取得します。NetworkManager で 2つ以上の接続を並行して管理する場合、updhcp4-changedhcp6-change、そして down アクションが任意の順序で来るかもしれないので、設定内の異なる NTP サーバ名が上書きされないように接続固有の設定ファイルを意図的に使用しています。

テスト

NetworkManager アプレットはログイン時にロードされるようになっているので、ほとんどのユーザにとって追加の設定は必要ないはずです。以前のネットワーク設定を無効化し、ネットワークから切断されているならば、NetworkManager が動作するかどうかをテストできます。まず始めに、NetworkManager.service起動してください。

一部のアプレットは、NetworkManager アプレットをアプリケーションメニューからロードできるようにするために、.desktop ファイルを提供しています。デスクトップファイルが提供されていない場合は、アプレットを使用するためのコマンドを見つけるか、アプレットをロードするために一度ログアウトして再度ログインする必要があります。アプレットが開始されれば、DHCP サーバを使って自動設定によるネットワーク接続のポーリングが開始されるでしょう。

awesome などの XDG 非互換のウィンドウマネージャで GNOME のアプレットを開始するには:

nm-applet --sm-disable &

固定 IP アドレスの場合は、NetworkManager にそのことを伝えなければなりません。手順としては通常、アプレットを右クリックし、'接続を編集する' ('Edit Connections') などのような項目を選択します。

ヒントとテクニック

Wi-Fi パスワードの暗号化

デフォルトでは、NetworkManager はパスワードを平文で /etc/NetworkManager/system-connections/ 内の設定ファイルに保存します。保存されているパスワードを表示するには、以下のコマンドを使ってください:

# grep -r '^psk=' /etc/NetworkManager/system-connections/

パスワードは root ユーザからファイルシステムでアクセス可能であり、さらに GUI (例: nm-applet) を通して設定にアクセスできるユーザからもアクセス可能です。。

パスワードは、平文ではなく、キーリングの中で暗号化された形で保存するのが望ましいです。しかし、これの欠点は、それぞれのユーザで接続をセットアップしなけれならないことです。

キーリングを読み書きするために、利用可能なシークレットエージェントが存在していなければなりません。いかのどれかを使用できます:

  • nmcli--ask オプションを使う。
  • #フロントエンド に挙げられているグラフィカルインターフェイス

シークレットエージェントが利用できないと、no secrets: No agents were available for this request. というエラーで認証が失敗します。

GNOME Keyring を使う

以下の方法を使うには、GNOME Keyring のキーリングデーモンが開始されていて、キーリングがアンロックされている必要があります。

さらに、全ユーザのパスワードを保存しないように NetworkManager を設定する必要があります。GNOME の network-manager-applet を使って、ターミナルから nm-connection-editor を実行し、ネットワーク接続を選択し、編集 (Edit) をクリックし、Wi-Fi セキュリティー (Wi-Fi Security) タブを選択し、パスワード入力欄の右のアイコンをクリックして、このユーザーのパスワードのみ保存する (Store the password only for this user) にチェックを入れてください。

KDE Wallet を使う

KDE の plasma-nm を使う場合、アプレットをクリックし、右上の 設定 アイコンをクリックし、ネットワーク接続を選択し、一般設定 (General configuration) タブを選択し、すべてのユーザはこのネットワークに接続可能 (All users may connect to this network) のチェックを外してください。このオプションにチェックが入っていると、たとえキーリングデーモンが実行されていたとしても、パスワードが平文で保存されてしまいます。

以前このオプションにチェックが入っていて、後にチェックを外した場合、ファイルからパスワードを消すために reset オプションを使用する必要がある場合があります。あるいは、接続を削除し、再度セットアップしてください。

Wi-Fi でインターネット接続を共有する

数クリックでインターネット接続 (例: 3G、有線) を共有することができます。ただし、ファイアウォールはインターネット共有を妨害する場合があることに注意してください。

AP モードをサポートする Wi-Fi カードが必要になります。詳細は ソフトウェアアクセスポイント#Wi-Fi デバイスが AP モードをサポートしていること を見てください。

接続を共有できるようにするために dnsmasq パッケージをインストールしてください。NetworkManager は (dnsmasq.service とは独立に) 独自の dnsmasq インスタンスを DHCP サーバとして開始することに注意してください。これに関する注意事項は #dnsmasq を見てください。

共有された接続を作成してください:

  • アプレットをクリックし、新規 Wi-Fi ネットワークを作成 (Create new wireless network) を選んでください。
  • ウィザードに従ってください (WPA2 以上を選んでください。パスワードは 8 文字以上にしてください。さもないと失敗します)。
  • Wi-Fi モードとしてホットスポットかアドホックを選択してください。

これで、次回必要になるときのために接続は保存されます。

ノート: Android はアドホックネットワークへの接続をサポートしていません。Android と接続を共有するには、インフラストラクチャモードを使用してください (つまり、Wi-Fi モードを "ホットスポット" に設定する)。

イーサネット経由でインターネット接続を共有する

シナリオ: お使いのデバイスは Wi-Fi 経由でインターネットに接続されており、そのインターネット接続をイーサネット経由で他のデバイスと共有したいと考えています。

要件:

  • 実際に接続を共有できるようにするために、dnsmasqnm-connection-editor パッケージを インストール してください。NetworkManager は DHCP サーバとして dnsmasq.service とは独立した dnsmasq のインスタンスを起動することに注意してください。注意点については、dnsmasq を参照してください。
  • インターネットに接続している機器と他の機器が、適切なイーサネットケーブルで接続されていること(これは通常、クロスオーバーケーブルや間にスイッチを挟むことを意味します)
  • インターネット共有が ファイアウォール でブロックされていないこと。

手順:

  • ターミナルから nm-connection-editor を実行します。
  • 新しい Ethernet 接続を追加します。
  • 何かわかりやすい名前をつけてください。例えば、"Shared Internet "など。
  • IPv4の設定 "に移動します。
  • "方法":で "他のコンピュータと共有" を選択します。
  • 保存

これで、NetworkManager の有線接続の下に新しいオプション "インターネットを共有" が表示されます。

cron ジョブやスクリプトでネットワークが立ち上がっているか確認する

cron ジョブの中にはネットワークが立ち上がっている必要があるジョブもあります。ネットワークが立ち上がっていない場合はジョブを実行しないようにすることができます。そのためには、NetworkManager の nm-tool を使ってネットワークの状態を確認する if テストを追加します。インターフェイスが立ち上がっている場合はテストは通りますが、全てのインターフェイスがダウンになっている場合はテストを通過しません。無線でネットワークにつながっていたり、いなかったりするノートパソコンなどで有用です。

if [ $(nm-tool|grep State|cut -f2 -d' ') == "connected" ]; then
    #Whatever you want to do if the network is online
else
    #Whatever you want to do if the network is offline - note, this and the else above are optional
fi

上記は cron.hourly スクリプトを使って fpupdate を実行し F-Prot ウイルススキャナをアップデートしている場合などに有用です。

ログイン時に自動的に接続する

デフォルトでは、パスワードを入力しないと使えないネットワークの場合 NetworkManager は起動時に自動的に接続しません。自動的に接続するには以下の設定が必要です:

  1. nm-applet アイコンを右クリックして Edit Connections を選択し Wireless タブを開いて下さい
  2. 使用したい接続を選択して Edit ボタンをクリックしてください
  3. “Connect Automatically” と “Available to all users” のボックスにチェックを入れて下さい
  4. さらに、"Wi-Fi Security" の下で、"Store password for all users (not encrypted)" が選択されていることを確認してください

一度ログアウトしてから再ログインすれば設定は完了です。

KWallet にパスワードを入力して OpenConnect

接続時に両方の値を入力できますが、plasma-nm 0.9.3.2-1 以降では KWallet から OpenConnect のユーザー名とパスワードを直接取得できます。

"KDE Wallet Manager" を開き、"Network Management|Maps" で OpenConnect VPN 接続を検索します。"値を表示" をクリックし、 このフォームのキー "VpnSecrets" に資格情報を入力します (ユーザー名パスワード は適宜置き換えてください):

form:main:username%SEP%username%SEP%form:main:password%SEP%password

次回接続すると、ユーザー名とパスワードが "VPN シークレット" ダイアログボックスに表示されます。

特定のデバイスを無視する

時々 NetworkManager に特定のデバイスを無視してもらってアドレスやルートを設定しないのが望ましいことがあります。/etc/NetworkManager/NetworkManager.conf で以下を使うことで MAC やインターフェイス名によってデバイスを無視するよう設定できます:

[keyfile]
unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth0

これを記述した後、NetworkManager を再起動してください。設定したデバイスに触れないように NetworkManager でインターフェイスを設定できるはずです。

MAC アドレスのランダム化の設定

ノート: stable

は新しいネットワークに接続する際にランダムな MAC アドレスを生成し、その2つを恒久的に関連付けます。つまり、そのネットワークに接続するたびに同じ MAC アドレスが使用されます。一方、random は、新しいネットワークに接続するたびに、新しい MAC アドレスが生成されます。MAC ランダム化の設定は、/etc/NetworkManager/conf.d の下に希望の設定を追加することで行えます。

/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device-mac-randomization]
# "yes" がデフォルトです
wifi.scan-rand-mac-address=yes とする。

[connection-mac-randomization]
# 全てのイーサネット設定の MAC をランダム化する
ethernet.cloned-mac-address=random
# 各 WiFi に対してランダムな MAC を生成し、2つを恒久的に関連付ける。
wifi.cloned-mac-address=stable

詳細については、次の GNOME ブログ投稿 を参照してください。

IPv6 プライバシー拡張を有効にする

参照 IPv6#NetworkManager

接続ごとに一意の DUID を設定する

DHCPv6 Unique Identifier (DUID) は、DHCPv6 クライアントが DHCPv6 サーバーに対して自身を識別するために使用する値です。NetworkManager は3種類の DUID をサポートしています。

  • DUID-UUID (RFC 6355): Universally Unique IDentifier (UUID) から生成されます。
  • DUID-LL (RFC 3315): リンク層アドレス (別名 MAC アドレス) から生成されます。
  • DUID-LLT (RFC 3315): リンク層アドレスとタイムスタンプから生成されます。

内部 NetworkManager の DHCP クライアントが使用されている場合 (デフォルト)、マシン ID (/etc/machine-id) から生成されたグローバルで永続的な DUID-UUID で自身を識別します。これは、すべての接続が同じ UUID を共有することを意味し、プライバシーの侵害となる可能性があります。

幸いなことに、NetworkManager は、接続の安定した ID とホストごとの一意のキーから派生した、接続ごとの一意の DUID を提供できます。/etc/NetworkManager/conf.d の下に次の設定を追加することで、これを有効にすることができます。

/etc/NetworkManager/conf.d/duid.conf
[connection]
ipv6.dhcp-duid=stable-uuid

stable-ll および stable-llt 値もサポートされています。詳細については、nm-settings(5) § ipv6 settingdhcp-duid の説明を参照してください。

有線接続の操作

NetworkManager は、デフォルトで、有線イーサネット接続を検出するたびに接続プロファイルを生成します。接続を生成する時点では、利用可能なイーサネットアダプターがさらにあるかどうかはわかりません。そのため、最初の有線接続を "有線接続1" と呼びます。この接続を生成しないようにするには、no-auto-default を設定します。(NetworkManager.conf(5) を参照)、または単純に削除することで、この接続を生成しないようにすることができます。そうすれば、NetworkManager はこのインターフェイスの接続を二度と生成しないように記憶します。

また、接続を編集 (およびディスクに永続化) したり、削除したりすることもできます。NetworkManager は新しい接続を再生成することはありません。それから、名前を好きなものに変更することができます。この作業には nm-connection-editor などを使ってできます。

Wi-Fi バックエンドとして iwd を使用する

ノート:
  • iwd.service を有効にしたり、iwd を手動で構成したりしないでください。 NetworkManager が起動し、それ自体を管理します。
  • iwd に切り替える前に 既存の問題 を検討してください。

実験的 iwd バックエンド を有効にするには、最初に インストール iwd してから、次の設定ファイルを作成します。

/etc/NetworkManager/conf.d/wifi_backend.conf
[device]
wifi.backend=iwd

または、networkmanager-iwdAUR をインストールすることもできます。これは、iwd のみで動作する NetworkManager を構築するように設定された修正パッケージです。主な違いは、iwd が必要であり、wpa_supplicant は、ビルド後にアンインストールできます。

ノート: iwdに切り替えた後、convert existing NetworkManager network profiles する必要がある場合があります。

ネットワーク名前空間での実行

ネットワーク名前空間内で NetworkManager を実行する場合(たとえば、選択したアプリケーションで使用する必要がある特定のデバイスを管理する場合)、名前空間に移動する前にデバイスを停止します。

$ ip link set dev MY_DEVICE down
$ ip link set dev MY_DEVICE netns MY_NAMESPACE
$ ip netns exec MY_NAMESPACE NetworkManager
...
$ ip netns exec MY_NAMESPACE killall NetworkManager

そうしないと、NetworkManager は後で device is strictly unmanaged エラーで接続の確立に失敗します。

VPN に自動的に接続する

NetworkManager は、インターネットに接続するときに、ネットワークごとに VPN に自動的に接続するように設定できます。 VPN 接続自体は GNOME の NetworkManager フロントエンドに追加できますが、VPN を自動的に使用するには nmcli を使用する必要があります。他のフロントエンドにはこの制限がない場合があります。

まず、すべてのユーザが VPN 接続を利用できるようにすることを確認します。GNOME では、これは details タブの下にあるボックスにチェックを入れることで完了します。Identity タブのパスワード欄で右側のアイコンをクリックし、Store the password for all users に設定します。

次に、VPN 接続の UUID を見つけ、それをインターネット接続の connection.secondaries に追加してください。

# UUID=$(nmcli --get-values connection.uuid connection show name-of-VPN-connection)
# nmcli connection modify name-of-Internet-connection connection.secondaries "$UUID"

これで、NetworkManager が再起動され、設定したインターネット接続に接続すると、VPN に自動的に接続されるはずです。

トラブルシューティング

安全な Wi-Fi ネットワークのパスワードの入力を求めるプロンプトが表示されない

セキュリティで保護されたWi-Fiネットワークに接続しようとすると、パスワードの入力を求めるプロンプトは表示されず、接続は確立されません。これは、keyring・パッケージがインストールされていない場合に発生します。簡単な解決策は、gnome-keyring をインストールすることです。パスワードを暗号化して保存したい場合は、GNOME Keyring に従って gnome-keyring-daemon を設定します。

Network management disabled

時々 NetworkManager を終了したときに pid (state) ファイルが削除されずに 'Network management disabled' というメッセージが表示されることがあります。これが発生した場合は、手動でファイルを削除する必要があります:

# rm /var/lib/NetworkManager/NetworkManager.state

dhclient と DHCP に関する問題

DHCP を使って IP を取得するときに問題が起こるときは、以下を /etc/dhclient.conf に追加してみてください:

 interface "eth0" {
   send dhcp-client-identifier 01:aa:bb:cc:dd:ee:ff;
 }

aa:bb:cc:dd:ee:ff は NIC の MAC アドレスに置き換えてください。MAC アドレスは iproute2 パッケージの ip link show interface コマンドを使うことでわかります。

dhcpcd と DHCP に関する問題

ルーターによっては、/etc/dhcpcd.conf (dhcpd.conf とは別のファイルです) 内の次の行をコメントアウトしないと正しく接続できないことがあります:

require dhcp_server_identifier

ネットワーク上で複数の DHCP サーバーを使ってなければこの修正によって問題が起こることはありません。詳細は このページ を見て下さい。

3G モデムが検知されない

USB 3G モデム#Network_Manager を参照してください。

ラップトップで WLAN をオフに切り替える

ラップトップについているスイッチを使って WiFi アダプタを無効にしてその後また有効にした時に NetworkManager が動作しないことがしばしばあります。これはほとんど rfkill の問題です。公式リポジトリから rfkill[リンク切れ: 置換パッケージ: util-linux] をインストールして、ドライバが rfkill に無線アダプタの状態を通知しているかどうか確かめるために次のコマンドを実行してください:

$ watch -n1 rfkill list all

アダプタの切り替えを行った後に identifier がブロックされたままの場合、手動でブロックを解除することができます (X は上のコマンドで出力された identifier の番号に置き換えてください):

# rfkill event unblock X

固定 IP 設定が DHCP に戻る

未解決のバグのため、デフォルトの接続を固定 IP にしたとき、nm-applet は正しく設定を保存できず、自動 DHCP に戻ります。

この問題を解決するにはデフォルトの接続 (例: "Auto eth0") を nm-applet で編集してから、接続の名前を変更し (例: "my eth0")、"Available to all users" のチェックを外して、固定 IP の設定をして、それから Apply をクリックする必要があります。これで新しい接続が指定した名前で保存されます。

さらに、デフォルト接続を自動で接続して欲しくない場合があるかもしれません。そうするには、nm-connection-editor を (root 以外で) 起動してください。接続エディタで、デフォルト接続 (例: "Auto eth0") を編集して "Connect automatically" のチェックを外して Apply をクリックして終了してください。

ノーマルユーザーで接続を編集できない

#PolicyKit パーミッションの設定 を見て下さい。

隠れた無線ネットワークの削除

ステルスが有効になっているネットワークは無線のリストに表示されないので、GUI で削除することは出来ません。次のコマンドでネットワークを削除することが可能です:

# rm /etc/NetworkManager/system-connections/[SSID]

他の接続でもこのコマンドは使えます。

VPN が Gnome で動作しない

Gnome で NetworkManager を使って openconnect や vpnc 接続を設定すると、ダイアログが表示されず以下のエラーが /var/log/errors.log に現れることがあります:

localhost NetworkManager[399]: <error> [1361719690.10506] [nm-vpn-connection.c:1405] get_secrets_cb(): Failed to request VPN secrets #3: (6) No agents were available for this request.

これは GNOME の NM アプレットが /usr/lib/gnome-shell にダイアログスクリプトがあると想定しているのが原因です。NetworkManager のパッケージは /usr/lib/networkmanager に配置します。"一時的な"修正として (このバグをしばらく回避できます)、以下のシンボリックリンクを作成してください:

  • OpenConnect の場合: ln -s /usr/lib/networkmanager/nm-openconnect-auth-dialog /usr/lib/gnome-shell/
  • VPNC (すなわち Cisco VPN) の場合: ln -s /usr/lib/networkmanager/nm-vpnc-auth-dialog /usr/lib/gnome-shell/

他の NM VPN プラグインでも同じように設定してください。

可視化されたヨーロッパのワイヤレスネットワークに接続できない

WLAN チップは、デフォルト 規制ドメイン で出荷されます。アクセスポイントがこれらの制限内で動作しない場合、ネットワークに接続できません。これを修正するのは簡単です:

  1. インストール wireless-regdb をインストールします。
  2. /etc/conf.d/wireless-regdom に正しい国番号をアンコメントする。
  3. 設定は起動時にしか読み込まれないので、システムを再起動する。

Systemd のボトルネック

時が立つにつれてログファイル (/var/log/journal) が膨大になってしまうことがあります。そうすると NetworkManager を使う場合にブートパフォーマンスに大きな影響を与えます。参照: systemd#少しづつ起動時間が長くなっている

定期的なネットワーク接続断、遅延、パケットロス (WiFi)

NetworkManager は2分ごとにスキャンを行います。

一部の WiFi ドライバは、接続/アソシエーション中にベースステーションのスキャンを行うと問題が発生します。症状としては、VPN 接続断/再接続、パケットロス、ウェブページのロードに失敗してリフレッシュすると良くなるなどがあります。

journalctl -f を root として実行すると、スキャンが行われていることがわかります。以下のようなメッセージが定期的にログに現れます:

NetworkManager[410]: <info>  (wlp3s0): roamed from BSSID 00:14:48:11:20:CF (my-wifi-name) to (none) ((none))

ローミングが重要でないならば、WiFi 接続プロファイルでアクセスポイントの BSSID をロックすることにより、定期的なスキャンの挙動を無効化することができます。

Lenovo ラップトップ (IdeaPad、Legion など) で Wi-Fi をオンにできない

一部の Lenovo モデルでは、Wi-Fi ドライバーがソフトブロックを誤って報告するため、ideapad_laptop モジュールに問題があります。 カードは netctl で操作できますが、NetworkManager などのマネージャーは機能しません。これが問題であることを確認するには、ハードウェアスイッチを切り替えた後に rfkill list の出力をチェックし、ソフトブロックが持続することを確認します。

この記事またはセクションの正確性には問題があります。
理由: rfkill.default_staterfkill.master_switch_mode を使用してみてください (kernel-parameters.html を参照)) rfkill の問題を修正します。 (議論: トーク:NetworkManager#)

Unloading ideapad_laptop モジュールでこれを修正する必要があります。(警告: これにより、ラップトップのキーボードとタッチパッドも無効になる可能性があります!)

ホスト名の送信をオフにする

NetworkManager はデフォルトでホスト名を DHCP サーバーに送信します。ホスト名の送信は、グローバルではなく接続ごとにのみ無効にできます (Issue#584)

特定の接続の DHCP サーバーへのホスト名の送信を無効にするには、ネットワーク接続ファイルに以下を追加します。

/etc/NetworkManager/system-connections/your_connection_file
...
[ipv4]
dhcp-send-hostname=false
...
[ipv6]
dhcp-send-hostname=false
...

nm-applet が i3wm で消える

通知に xfce4-notifyd.service を使用する場合は、ユニットを 編集 して、以下を追加する必要があります。

/etc/systemd/user/xfce4-notifyd.service.d/display_env.conf
[Service]
Environment="DISPLAY=:0.0"

デーモンをリロードした後 xfce4-notifyd.service。 i3 を終了し、再度起動すると、アプレットがトレイに表示されます。

nm-applet トレイアイコンが正しく表示されない

現在、nm-applet のトレイアイコンは互いに重なり合って描かれています。つまり、ワイヤレス強度を表示するアイコンが、有線接続がないことを示すアイコンの上に表示される場合があります。 これは明らかに GTK3 のバグ/問題です [7]

GTK3 のパッチが適用されたバージョンが AUR に存在し、トレイアイコンのバグを修正しているようです:gtk3-classicAUR

Unit dbus-org.freedesktop.resolve1.service not found

systemd-resolved.service が開始されていない場合、NetworkManager は D-Bus を使用して開始しようとし、失敗します。

dbus-daemon[991]: [system] Activating via systemd: service name='org.freedesktop.resolve1' unit='dbus-org.freedesktop.resolve1.service' requested by ':1.23' (uid=0 pid=1012 comm="/usr/bin/NetworkManager --no-daemon ")
dbus-daemon[991]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.resolve1.service': Unit dbus-org.freedesktop.resolve1.service not found.
dbus-daemon[991]: [system] Activating via systemd: service name='org.freedesktop.resolve1' unit='dbus-org.freedesktop.resolve1.service' requested by ':1.23' (uid=0 pid=1012 comm="/usr/bin/NetworkManager --no-daemon ")

これは、NetworkManager が NetworkManager.conf(5)main.dns= 設定に関係なく、DNS 情報を systemd-resolved に送信しようとするためです。[8]

これは、/etc/NetworkManager/conf.d/ の設定ファイルで無効にできます:

/etc/NetworkManager/conf.d/no-systemd-resolved.conf
[main]
systemd-resolved=false

FS#62138 を参照してください。

Secrets が要求されましたが、提供されませんでした

nmcli device wifi connectSSIDpasswordpassword を使用してネットワークに接続しようとすると、次のエラーが表示されます。

Error: Connection activation failed: (7) Secrets were required, but not provided

このエラーにはさまざまな原因が考えられるため、 journal を読んでください (-u NetworkManager でフィルタリングしてください) たとえば、NetworkManager が接続を確立するのに時間がかかりすぎた場合、パスワードが正しくない可能性があります。

NetworkManager[1372]: <warn>  [1643991888.3808] device (wlan0): Activation: (wifi) association took too long
NetworkManager[1372]: <info>  [1643991888.3809] device (wlan0): state change: config -> need-auth (reason 'none', sys-iface-state: 'managed')
NetworkManager[1372]: <warn>  [1643991888.3838] device (wlan0): Activation: (wifi) asking for new secrets

接続プロファイルを削除して、新しいプロファイルを作成してみてください。

$ nmcli connection delete SSID
$ nmcli device wifi connect SSID password password

MAC アドレスのランダム化を無効にすることもできます。

/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device]
wifi.scan-rand-mac-address=no

iwd との WPA エンタープライズ接続

iwd backend を使用して NetworkManagerで eduroam のような WPA エンタープライズネットワークに接続しようとすると、NetworkManager から次のエラーが発生します。

 Connection 'eduroam' is not avialable on device wlan0 because profile is not compatible with device (802.1x connection must have IWD provisioning files).

これは、NetworkManager が WPA Enterprise ネットワークを設定できないためです。そのため、iwd#WPA Enterprise で説明されているように、iwd 設定ファイル /var/lib/iwd/essid.8021x を使用して設定する必要があります。

VPN で Secrets のリクエストに失敗する

もし、このようなエラーが発生したら

Failed to request VPN secrets #1: No agents were available for this request.

パスワードが空であるか、PolicyKit パーミッションの設定 が必要なためです。

OpenVPN 接続が OpenSSL の ca md too weak エラーで失敗する

openssl がバージョン3に更新されたため、従来の暗号化アルゴリズムで生成された証明書はデフォルトで拒否されます。このような設定で networkmanager-openvpn を使用しようとすると、ログに次のエラーが記録される可能性があります。

nm-openvpn[14359]: OpenSSL: error:0A00018E:SSL routines::ca md too weak
nm-openvpn[14359]: Cannot load certificate file /home/archie/.local/share/networkmanagement/certificates/my_issued_cert.crt
nm-openvpn[14359]: Exiting due to fatal error

正しいアプローチは、OpenVPN サーバー管理者に、より安全な証明書を生成して再発行してもらうことです。ただし、当面の回避策として、OpenVPN には tls-cipher "DEFAULT:@SECLEVEL=0" が必要です。これはプラグインでは不可能かもしれませんが、nmcli では可能です。これとは別に、OpenSSL で レガシー プロバイダーを有効にする必要もあります。

まず、次の出力から、問題のある VPN 接続の名前を取得します。

$ nmcli connection show

接続名が vpn.example.com であると仮定すると、次のように nmcli を使用します。

$ nmcli connection modify vpn.example.com +vpn.data tls-cipher=DEFAULT:@SECLEVEL=0

変更は /etc/NetworkManager/system-connections/vpn.example.com.nmconnection に即座に反映されます。

OpenSSL に関しては、OpenSSL wiki の説明に従って /etc/ssl/openssl.cnf を編集します。

具体的には、[provider_sect] セクションの最後に legacy = legacy_sect を追加します。[default_sect] の下で activate = 1 のコメントを外します。最後に、activate = 1 という行も含む新しいセクション [legacy_sect] を追加します。他のほとんどの既存の構成セクションを除外すると、最終結果は次のようになります。

/etc/ssl/openssl.cnf
openssl_conf = openssl_init

[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
legacy = legacy_sect

[default_sect]
activate = 1

[legacy_sect]
activate = 1

最後に、NetworkManager.service再起動 して、新しい OpenSSL 構成を有効にします。

参照