NetworkManager
関連記事
NetworkManager は、システムがネットワークに自動的に接続できるようにするためにネットワークの検出と設定の機能を提供するプログラムです。NetworkManager の機能は無線ネットワークと有線ネットワークの両方で有用です。無線ネットワークでは、NetworkManager は既知の無線ネットワークを優先するようになっており、最も信頼性のあるネットワークに切り替える機能もあります。NetworkManager 対応のアプリケーションはオンラインモードとオフラインモードの切り替えが可能です。また、NetworkManager は無線接続よりも有線接続を優先するようになっており、モデム接続と特定の種類の VPN に対応しています。NetworkManager は元々 Red Hat によって開発されていましたが、現在では GNOME プロジェクトによってホストされています。
目次
- 1 インストール
- 2 使い方
- 3 フロントエンド
- 4 設定
- 5 ネットワークサービスで NetworkManager dispatcher を使用する
- 6 テスト
- 7 ヒントとテクニック
- 7.1 Wi-Fi パスワードの暗号化
- 7.2 Wi-Fi でインターネット接続を共有する
- 7.3 イーサネットでインターネット接続を共有する
- 7.4 cron ジョブやスクリプトでネットワークが立ち上がっているか確認する
- 7.5 ブート時にシークレットを使ってネットワークに接続する
- 7.6 OpenConnect で KWallet 内のパスワードを使う
- 7.7 特定のデバイスを無視する
- 7.8 MAC アドレスのランダム化を設定する
- 7.9 IPv6 プライバシー拡張を有効にする
- 7.10 接続ごとに一意の DUID を設定する
- 7.11 有線接続の操作
- 7.12 Wi-Fi バックエンドとして iwd を使用する
- 7.13 ネットワーク名前空間での実行
- 7.14 VPN に自動的に接続する
- 8 トラブルシューティング
- 8.1 安全な Wi-Fi ネットワークのパスワードの入力を求めるプロンプトが表示されない
- 8.2 Network management disabled
- 8.3 dhclient と DHCP に関する問題
- 8.4 dhcpcd と DHCP に関する問題
- 8.5 3G モデムが検知されない
- 8.6 ラップトップで WLAN をオフに切り替える
- 8.7 固定 IP 設定が DHCP に戻る
- 8.8 ノーマルユーザーで接続を編集できない
- 8.9 隠れた無線ネットワークの削除
- 8.10 VPN が Gnome で動作しない
- 8.11 可視化されたヨーロッパのワイヤレスネットワークに接続できない
- 8.12 Systemd のボトルネック
- 8.13 定期的なネットワーク接続断、遅延、パケットロス (WiFi)
- 8.14 Lenovo ラップトップ (IdeaPad、Legion など) で Wi-Fi をオンにできない
- 8.15 ホスト名の送信をオフにする
- 8.16 nm-applet が i3wm で消える
- 8.17 nm-applet トレイアイコンが正しく表示されない
- 8.18 Unit dbus-org.freedesktop.resolve1.service not found
- 8.19 Secrets が要求されましたが、提供されませんでした
- 8.20 iwd との WPA エンタープライズ接続
- 8.21 VPN で Secrets のリクエストに失敗する
- 8.22 OpenVPN 接続が OpenSSL の ca md too weak エラーで失敗する
- 9 参照
インストール
NetworkManager は networkmanager パッケージでインストールできます。このパッケージには、デーモン、コマンドラインインターフェイス (nmcli
)、そして curses ベースのインターフェイス (nmtui
) が含まれています。
NetworkManager を有効化する
インストールしたら、NetworkManager.service
を起動/有効化する必要があります。NetworkManager デーモンが起動すると、既に構成されている利用可能な "システム接続" に自動的に接続します。"ユーザ接続" や未構成の接続を設定したり接続したりするには、nmcli やアプレットが必要です。
追加のインターフェイス
- nm-connection-editor: グラフィカルユーザインターフェイス。
- network-manager-applet: システムトレイアプレット (
nm-applet
)。
モバイルブロードバンドサポート
NetworkManager はモバイルブロードバンド接続のサポートに ModemManager を使用します。
modemmanager と usb_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 タイプに対するサポートはプラグインなシステムをベースとしています。以下のパッケージで提供されています:
- networkmanager-openconnect: OpenConnect 用
- networkmanager-openvpn: OpenVPN 用
- networkmanager-pptp: PPTP クライアント用
- networkmanager-strongswan: strongSwan 用
- networkmanager-vpnc
- networkmanager-fortisslvpn-gitAUR
- networkmanager-iodine-gitAUR
- networkmanager-libreswanAUR
- networkmanager-l2tp
- networkmanager-ssh-gitAUR
- network-manager-sstp
使い方
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/Keyring、KDE Wallet、KeePassXC など) をインストールし設定してください。
接続の設定で Make available to other users
チェックボックスオプションを有効化すると、NetworkManager はその接続のパスワードを平文で保存することに注意してください。とはいえ、パスワードが含まれるファイルは root (及び nm-applet
を通して他のユーザ) からしかアクセスできません。#Wi-Fi パスワードの暗号化 を見てください。
trayer か stalonetray を使うことで、システムトレイ無しで 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
Appindicator
バージョン 1.18.0 から、Appindicator のサポートが公式の network-manager-applet パッケージで利用可能になりました。nm-applet を Appindicator の環境で使うには、アプレットを以下のコマンドで起動してください:
$ nm-applet --indicator
フロントエンドのもう一つの選択肢は networkmanager-dmenu-gitAUR です。これは、NetworkManager の接続を nm-applet
ではなく dmenu や rofi で管理する小さなスクリプトです。このスクリプトには必須の機能が全て揃っています。例えば: 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_TIMEOUT
を 60
からより大きい値に変更してください。
PolicyKit のパーミッションをセットアップする
デフォルトでは、アクティブなローカルセッションのユーザは全員パスワード無しでほぼ全てのネットワーク設定を変更することができます。セッションの種類を確認する方法については、一般的なトラブルシューティング#セッションのパーミッション を見てください。ほとんどの場合、特に設定しなくても全て動作するはずです。
一部のアクション (システムのホスト名を変更するなど) においては、管理者のパスワードが必要です。そのような場合、自身のユーザを wheel
グループに追加し、パスワードのプロンプトを表示する Polkit の認証エージェントを実行する必要があります。
リモートセッションの場合 (例えば、ヘッドレス VNC)、NetworkManager を使用するために必要な特権を得る方法は複数あります:
- 自身を
wheel
グループに追加する。アクションの度にパスワードを入力する必要があります。注意点として、wheel
グループに追加すると他の権限 (root パスワードを入力せずに sudo を実行できるなど) も付与される場合があります。 - 自身を
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 は直接プロクシ設定を扱いませんが、GNOME や KDE を使っている場合、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
キャプティブポータル
キャプティブポータルが存在している場合、デスクトップマネージャが、資格情報を求めるウィンドウを自動的に開く場合があります。あなたのデスクトップ環境がこれを行わない場合、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
DNS の管理
NetworkManager の DNS 管理については、GNOME プロジェクトの wiki ページ Projects/NetworkManager/DNS で説明されています。
DNS キャッシングと条件付きフォワーディング
NetworkManager には、dnsmasq または systemd-resolved を使用して DNS キャッシングと条件付きフォワーディングを有効化するプラグインが存在します (以前は、"条件付きフォワーディング" は NetworkManager のドキュメントで "split DNS" と呼ばれていました)。このセットアップには、DNS ルックアップがキャッシュされるので名前解決の時間が短縮され、VPN ホストの DNS ルックアップが、関連する VPN の DNS サーバに転送されるという長所があります。これは、複数の VPN に接続する場合に特に便利です。
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.conf
に 127.0.0.1
を追加します。元の DNS サーバは /run/NetworkManager/no-stub-resolv.conf
を見れば分かります。dnsmasq が使用されているかどうかは、drill example.com
で同じ DNS ルックアップを2度行ってサーバとクエリの時間を計測すれば確認できます。
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 で 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.conf
で private_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-search
と dns-options
) を使うことで、接続毎に DNS サーバをセットアップすることができます。
method
が auto
に設定されている場合 (DHCP を使用する場合)、ignore-auto-dns
を yes
に設定する必要があります。
/etc/resolv.conf
NetworkManager の /etc/resolv.conf
管理モードは、main.rc-manager
で設定されます。networkmanager パッケージはこれを、上流のデフォルトである auto
ではなく、symlink
に設定します。設定と値は NetworkManager.conf(5) man ページでドキュメント化されています。
また、NetworkManager は、ネットワークの変更後に /etc/resolv.conf
を変更するために使用できる、いわゆるディスパッチャスクリプトを介したフックも提供します。詳細は #ネットワークサービスで NetworkManager dispatcher を使用する と NetworkManager(8) を参照してください。
管理対象外の /etc/resolv.conf
NetworkManager が /etc/resolv.conf
に干渉しないようにするには、/etc/NetworkManager/conf.d/
の設定ファイルで main.dns=none
を設定してください:
/etc/NetworkManager/conf.d/dns.conf
[main] dns=none
その後、/etc/resolv.conf
が壊れたシンボリックリンクになり、削除する必要が生じるかもしれません。その場合、新しい /etc/resolv.conf
ファイルを作成してください。
openresolv を使う
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 には、(例えば NFS や SMB、NTPd を使用する時などに) ネットワークに接続したらサービスを開始し、切断したらサービスを停止する機能があります。
この機能を有効化するには、NetworkManager-dispatcher.service
を有効化し、かつ起動する必要があります。
このサービスを有効化したら、/etc/NetworkManager/dispatcher.d
内にスクリプトを追加することができます。
スクリプトは root によって所有されていなければなりません。ディスパッチャは、root によって所有されていないスクリプトを実行しません。セキュリティを高めるために、スクリプトのグループ所有権も root に設定してください:
# chown root:root /etc/NetworkManager/dispatcher.d/10-script.sh
スクリプトファイルを実行可能にするのを忘れないでください。
スクリプトは、ネットワークへの接続時にはアルファベット順で実行され、切断時には逆アルファベット順で実行されます。実行される順番を保証するために、スクリプトの名前の前に数字を置くのが一般的です (例: 10-portmap
、30-netfs
。こうすることで、NFS がマウントを試みる前に、portmapper が立ち上がります)。
スクリプトは以下の引数を受け取ります:
- インターフェイス名: 例えば
eth0
- アクション: up、down、vpn-up、vpn-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
サービスを開始し、かつ有効化してください。
ディスパッチャの例
sshfs でリモートディレクトリをマウントする
このスクリプトは非常に制限された環境内で実行されるため、SSH エージェントに接続するためには SSH_AUTH_SOCK
変数をエクスポートする必要があります。これを行う方法はいくつかあります (詳細はこのメッセージを見てください)。以下の例は GNOME Keyring を使って動作し、キーリングがまだアンロックされていない場合はパスワードを要求します。NetworkManager がログイン時に自動的にネットワークに接続するような状況では、gnome-keyring がまだ開始されておらず、変数のエクスポートが失敗する可能性が高いです (そのために sleep コマンドがあります)。接続とマッチする UUID
は、nmcli connection status
か nmcli 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
以下のスクリプトは、特定のネットワークから予期せずに切断されてしまった時に、全ての 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
代替案は、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
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
ディスパッチャを使って、ネットワーク接続が確立された後に VPN に接続する
この例では、特定の Wi-Fi ネットワークに接続した後に、以前定義された VPN 接続に自動的に接続したいと思います。最初にすべきことは、そのネットワークに接続した後にすることを定義するディスパッチャスクリプトを作成することです。
/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-flags
と secret-flags
を 1
から 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=パスワード
ディスパッチャを使って、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つ以上の接続を並行して管理する場合、up
、dhcp4-change
、dhcp6-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 モードとしてホットスポットかアドホックを選択してください。
これで、次回必要になるときのために接続は保存されます。
イーサネットでインターネット接続を共有する
シナリオ: デバイスが Wi-Fi 経由でインターネットに接続されていて、イーサネットで他のデバイスとインターネット接続を共有したいと考えている場合。
要件:
- 接続を共有できるようにするために dnsmasq パッケージと nm-connection-editor パッケージをインストールしてください。NetworkManager は (
dnsmasq.service
とは独立に) 独自の dnsmasq インスタンスを DHCP サーバとして開始することに注意してください。これに関する注意事項は #dnsmasq を見てください。 - インターネットに接続されたデバイスとその他のデバイスが適切なイーサネットケーブルで接続されていること (これは通常、間をクロスオーバーケーブルやスイッチで繋ぐことを意味します)。
- インターネット共有がファイアウォールによってブロックされていないこと。
手順:
- ターミナルから
nm-connection-editor
を実行してください。 - 新しいイーサネット接続を追加してください。
- 何かわかりやすい名前を付けてください。例えば "Shared Internet"。
- "IPv4 設定" ("IPv4 Settings") を開いてください。
- "メソッド:" ("Method:") で "他のコンピューターへ共有" ("Shared to other computers") を選択してください。
- 保存
これで、NetworkManager の有線接続に "Shared Internet" という新しいオプションができたはずです。
cron ジョブやスクリプトでネットワークが立ち上がっているか確認する
一部の cron ジョブではネットワークが立ち上がっている必要があり、ネットワークが落ちている状態でそのようなジョブを実行したくない場合があります。そうするには、NetworkManager の nm-tool にクエリして、ネットワークの状態をチェックする if テストを追加してください。このテストは、何らかのインターフェイスが立ち上がっていれば成功し、インターフェイスが全て落ちている場合は失敗します。これは、ある時は有線接続されていて、ある時は無線で、またある時はネットワークから切断されているようなノート PC で便利です。
if [ $(nm-tool|grep State|cut -f2 -d' ') == "connected" ]; then # ネットワークがオンラインの時に実行したいコード else # ネットワークがオフラインの時に実行したいコード (注記: この部分と上の else は任意です) fi
これは、例えば F-Prot ウイルススキャナのシグネチャを更新するために fpupdate を実行する cron.hourly
で便利です。また、nm-tool の出力の様々な部分を使えば、ネットワークを識別することもできます。例えば、アクティブなワイヤレスネットワークにはアスタリスクが付くので、ネットワーク名を grep して、その後でアスタリスクを grep しますs。
ブート時にシークレットを使ってネットワークに接続する
デフォルトでは、NetworkManager はシークレットを要求するネットワークにはブート時に自動的に接続しません。NetworkManager では、そのようなネットワークは、そのネットワークをデフォルトで使用するユーザがログインした後にのみ、接続されるからです。この動作を変更するには、以下を行ってください:
- パネルの
nm-applet
のアイコンを右クリックし、"接続を編集する" を選択し、Wi-Fi タブを開いてください。 - 使いたい接続を選択し、編集ボタンをクリックしてください。
- “Connect Automatically” と “Available to all users” のボックスにチェックを入れてください。
- 加えて、"Wi-Fi Security" タブで "Store password for all users (not encrypted)" が選択されていることを確認してください。
ログアウトし、ログインし直せば完了です。
OpenConnect で KWallet 内のパスワードを使う
接続時にユーザ名とパスワードを入力することはできますが、plasma-nm 0.9.3.2-1 から、KWallet から直接 OpenConnect のユーザ名とパスワードを取得することが可能になりました。
"KDE Wallet Manager" を開き、"Network Management|Maps" で対象の OpenConnect VPN 接続を見つけてください。"Show values" をクリックし、認証情報を以下の形式で "VpnSecrets" に入力してください (ユーザ名 と パスワード の部分は適宜置き換えてください):
form:main:username%SEP%ユーザ名%SEP%form:main:password%SEP%パスワード
次回の接続時に、ユーザ名とパスワードが "VPN secrets" ダイアログボックスに入力されるはずです。
特定のデバイスを無視する
NetworkManager で特定のデバイスを無視し、そのデバイスに対してはアドレスとルート (route) の設定を試みないようにすることが望ましい場合があります。/etc/NetworkManager/conf.d/unmanaged.conf
で以下のオプションを使うことで、MAC またはインターフェイス名によって特定のデバイスを無視することができます:
[keyfile] unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth0
ファイルを編集したら、nmcli general reload
を root として実行してください。その後、NetworkManager があなたの設定を変更することなく、インターフェイスを構成できるようになっているはずです。
MAC アドレスのランダム化を設定する
MAC アドレスのランダム化は、本物の MAC アドレスをネットワークに開示しないことで、プライバシーを向上させることができます。
NetworkManager は2種類の MAC アドレスランダム化をサポートしています: スキャン中のランダム化とネットワーク接続におけるランダム化です。どちらのモードも、/etc/NetworkManager/NetworkManager.conf
を変更するか、/etc/NetworkManager/conf.d/
内に別の設定ファイルを作成することで設定できます (前者は NetworkManager によって上書きされる場合があるので、後者が推奨されます)。
Wi-Fi スキャン中のランダム化はデフォルトで有効化されていますが、以下の行を /etc/NetworkManager/NetworkManager.conf
か /etc/NetworkManager/conf.d
内の別の設定ファイルに追加することで無効化することができます:
/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device] wifi.scan-rand-mac-address=no
ネットワーク接続における MAC アドレスランダム化は、無線インターフェイスとイーサネットインターフェイスで別々のモードを設定することができます。モードに関する詳細は GNOME のブログ記事を参照してください。
MAC アドレスランダム化に関して、最も重要なモードは stable
と random
です。stable
は、新しいネットワークに接続した時にランダムな MAC アドレスを生成し、そのネットワークと MAC アドレスを永続的に関連付けます。これはつまり、そのネットワークに接続すると毎回同じ MAC アドレスが使用されることを意味します。それとは対照的に、random
は、ネットワークに接続する度に、そのネットワークが新しかろうが既知であろうが、新しい MAC アドレスを生成します。/etc/NetworkManager/conf.d
内に設定ファイルを追加してこの MAC アドレスランダム化を設定することができます:
/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 # 各 Wi-Fi に対してランダムな MAC を生成し、それらを関連付ける。 wifi.cloned-mac-address=stable
詳細は GNOME ブログ記事を参照してください。
IPv6 プライバシー拡張を有効にする
接続ごとに一意の 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 setting の dhcp-duid
の説明を参照してください。
有線接続の操作
NetworkManager は、デフォルトで、有線イーサネット接続を検出するたびに接続プロファイルを生成します。接続を生成する時点では、利用可能なイーサネットアダプターがさらにあるかどうかはわかりません。そのため、最初の有線接続を "有線接続1" と呼びます。この接続を生成しないようにするには、no-auto-default
を設定します。(NetworkManager.conf(5) を参照)、または単純に削除することで、この接続を生成しないようにすることができます。そうすれば、NetworkManager はこのインターフェイスの接続を二度と生成しないように記憶します。
また、接続を編集 (およびディスクに永続化) したり、削除したりすることもできます。NetworkManager は新しい接続を再生成することはありません。それから、名前を好きなものに変更することができます。この作業には nm-connection-editor などを使ってできます。
Wi-Fi バックエンドとして iwd を使用する
実験的 iwd バックエンド を有効にするには、最初に インストール iwd してから、次の設定ファイルを作成します。
/etc/NetworkManager/conf.d/wifi_backend.conf
[device] wifi.backend=iwd
または、networkmanager-iwdAUR をインストールすることもできます。これは、iwd のみで動作する NetworkManager を構築するように設定された修正パッケージです。主な違いは、iwd が必要であり、wpa_supplicant は、ビルド後にアンインストールできます。
ネットワーク名前空間での実行
ネットワーク名前空間内で 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 チップは、デフォルト 規制ドメイン で出荷されます。アクセスポイントがこれらの制限内で動作しない場合、ネットワークに接続できません。これを修正するのは簡単です:
- インストール wireless-regdb をインストールします。
/etc/conf.d/wireless-regdom
に正しい国番号をアンコメントする。- 設定は起動時にしか読み込まれないので、システムを再起動する。
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
の出力をチェックし、ソフトブロックが持続することを確認します。
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 のバグ/問題です [9]
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 に送信しようとするためです。[10]
これは、/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 構成を有効にします。