# netctl (日本語)

関連記事

- ネットワーク設定
- ワイヤレス設定
- NetworkManager
- Wicd
- netctl でブリッジ接続

netctl はプロファイルを使ってネットワーク接続を管理・設定する CLI ベースのツールです。netctl は古い netcfg ユーティリティを置き換える新しい Arch Linux の独自プロジェクトです。

## インストール

netctl パッケージが公式リポジトリから利用できます。netctl をインストールすると netcfg が置き換えられます。

netctl と netcfg は衝突するパッケージです。プロファイルが正しく設定されていないと、netctl をインストールした後に接続を失う可能性があります。

Note: `systemctl --type=service` を使ってネットワークを設定するサービスが動作していないことを確認するとよいでしょう。ネットワークサービスが複数あると衝突します。

## 必読

netctl を使う前に以下の man ページを読むのを推奨します:

- netctl
- netctl.profile
- netctl.special

## 設定

netctl はプロファイルを使ってネットワーク接続を管理します。プロファイルファイルは `/etc/netctl/` に保存されています。ユーザーがネットワーク接続を設定するのを助けるために、設定のサンプルファイルが提供されています。これらのサンプルプロファイルが置かれている場所は `/etc/netctl/examples/` です。一般的な設定として以下が用意されています:

- ethernet-dhcp
- ethernet-static
- wireless-wpa
- wireless-wpa-static

サンプルプロファイルを使うには、プロファイルのどれかを `/etc/netctl/examples/` から `/etc/netctl/` にコピーしてあなたの設定にあわせてプロファイルを修正して下さい:

    # cp /etc/netctl/examples/wireless-wpa /etc/netctl/profile

Note: ほとんどの場合プロファイルの中のインターフェイス名を編集する必要があるはずです。v197 から、udev は wlanX や ethX という命名形式を使ってネットワークのインターフェイス名を割り当てなくなりました。無線インターフェイスが wlan0 で、有線インターフェイスが eth0 ということはなくなっています。インターフェイスの名前を調べるには `ip link` コマンドを使って下さい。
Tip: ワイヤレス設定のために、`wifi-menu -o` を使ってプロファイルを `/etc/netctl/` に生成することができます。

プロファイルを作成したら、新しく作ったプロファイルを使って接続を確立するために次を実行して下さい:

    # netctl start profile

Note: profile はファイル名です、フルパスを含みません。フルパスを指定すると netctl はエラーコードを返します。

上のコマンドが失敗する場合、`journalctl -xn` や `netctl status profile` を使って失敗の詳細情報を取得して下さい。そして設定を修正してから再テストして下さい。

### 自動操作

プロファイルを（一つのインターフェイスに）一つしか使わなかったり、手動でプロファイルを切り替える場合、基本的な方法を使って下さい。一般的な例として、サーバー・ワークステーション・ルーターなどがあります。

頻繁に複数のプロファイルを切り替える必要がある時は、プロファイルの自動切り替えを使って下さい。一般的な例として、ラップトップがあります。

#### 基本的な方法

この方法では、インターフェイス毎に一つのプロファイルを固定して起動することができます。最初にプロファイルが問題なく起動することを手動で確認して、それから次のコマンドで `enabled` にしてください:

    # netctl enable profile

このコマンドによって systemd サービスが作成・有効にされ、コンピュータが立ち上がる時にサービスが起動するようになります。ただし、netctl はネットワークインターフェイスデバイスが既に起動している場合 (例えば dhcpcd を使っている場合) はプロファイルを実行しません。

プロファイルへの変更はサービスファイルに自動的には適用されません。変更後、プロファイルを再度有効にする必要があります:

    # netctl reenable profile

Note: ブート時 (もしくはサービスの起動時) にプロファイルの起動が成功した時に初めて接続は確立されます。具体的に言うと、有線接続の場合はケーブルが挿さっている必要があり、無線接続の場合、ネットワークが圏内である必要があります。
Tip: ケーブルが接続されているかどうかにかかわらず、固定 IP プロファイルを有線インターフェイスで有効にするには、プロファイルの中で `SkipNoCarrier=yes` を使って下さい。

#### プロファイルの自動切り替え

netctl は自動でプロファイルを切り替えるために2つの特別な systemd サービスを用意しています:

- 有線インターフェイス: `netctl-ifplugd@interface.service`。これを使うと、あなたがケーブルを抜き差しするたびに netctl プロファイルが変更されます。
- 無線インターフェイス: `netctl-auto@interface.service`。これを使うと、あなたが特定のネットワークの圏内から他のネットワークの圏内に移動したときに netctl のプロファイルが変更されます。

Note: netcfg では同じ用途で `net-auto-wireless.service` と `net-auto-wired.service` を使っていました。

まず必要なパッケージをインストールしてください:

- `netctl-auto@interface.service` を使うには wpa_actiond パッケージが必要です。
- `netctl-ifplugd@interface.service` を使うには ifplugd パッケージが必要です。

そして `netctl-auto@interface.service` や `netctl-ifplugd@interface.service` が起動できるプロファイルを全て設定してください。

`netctl-auto@interface.service` によって無線プロファイルが自動的に起動しないようにしたい場合は、そのプロファイルに `ExcludeAuto=yes` を加える必要があります。また、`Priority=` を使うことで複数のプロファイルが利用可能な場合に、どのプロファイルを優先的に使うか設定できます。`netctl-ifplugd@interface.service` は DHCP を使うプロファイルを優先します。固定 IP のプロファイルを優先させるために、`AutoWired=yes` を使うことができます。詳しくは `netctl.profile(5)` を見て下さい。

Warning: netctl-auto による WPA のプロファイルの自動選択は `Security=wpa-config` オプションでは出来ません、代わりに `Security=wpa-configsection` を使って下さい。

プロファイルを設定して、動作するのを確認したら、systemctl を使ってサービスを有効にしてください:

    # systemctl enable netctl-auto@interface.service
    # systemctl enable netctl-ifplugd@interface.service

Warning:

- `Key=` の値が空だったり、プロファイルのどれかにエラーがある場合、このユニットは起動時に `"Failed to read or parse configuration '/run/network/wpa_supplicant_wlan0.conf'` というメッセージを残して (そのプロファイルが使われていなかったとしても) 失敗します。
- この方法は基本的な方法と衝突します。以前 netctl でプロファイルを有効にしていたのならば、

      # netctl disable profile

  を実行してプロファイルを二重に起動しないようにしてください。

netctl 1.3 から、netctl-auto サービスを止めないで netctl-auto によって管理されているインターフェイスを手動で操作できるようになりました。netctl-auto コマンドを使ってこれを行うことが可能です。利用可能な操作のリストを表示するには次を実行してください:

    # netctl-auto --help

### netcfg からの移行

netctl はプロファイルの保存に `/etc/netctl` を使います。`/etc/network.d` (netcfg のプロファイル保存場所) ではありません。

netcfg からの移行をするためには、最低でも以下の操作が必要です:

- netcfg サービスを無効にする: `systemctl disable netcfg.service`
- netcfg をアンインストールして netctl をインストールする。
- ネットワークプロファイルファイルを新しいディレクトリに移動する。
- `netctl.profile(5)` に従ってプロファイル内の変数の名前を修正する (ほとんどの変数の名前は `UpperCamelCase` です、つまり `CONNECTION` は `Connection` になります)。
- 固定 IP 設定では、`Address` 変数で IP の後ろにネットマスクを付ける (例: `Address=('192.168.1.23/24' '192.168.1.87/24')` サンプルプロファイルより)。
- `wireless-wpa-configsection` サンプルに従って無線プロファイルを設定している場合、定義済みの `wpa_supplicant` オプションを上書きしてしまうので注意してください。隠された無線ネットワークに接続するには、`wireless-wpa-configsection` 内で `scan_ssid=1` をオプションに追加してください。; `Hidden=yes` は効果がありません。
- interface 変数などクオートが必要ない変数のクォーテーションを外す (これは見た目を整えるためです)。
- 前の `NETWORKS` に設定していたプロファイルごとに `netctl enable profile` を実行する。'last' はこの方法では使えません、`netctl.special(7)` を見て下さい。
- netcfg-menu の代わりに `netctl list` や `netctl start profile` を使う。wifi-menu は使い続けられます。
- netcfg とは異なり、netctl はデフォルトでは他の NIC に接続されていない NIC をデフォルトで立ち上げられません。この問題を解決するには、`/etc/netctl/profile` の最後に `SkipNoCarrier=yes` を加えて下さい。

### パスワードの暗号化 (256-bit PSK)

Note: "暗号化"されていたとしても、プロファイルに記述したキーだけで WPA-PSK ネットワークに接続することは可能です。従って、この手順は人間が読めるパスフレーズを隠すことにしか訳に立ちません。ファイルを読める人間がネットワークに接続するのを止めることはできません。どこでも同じパスフレーズを使うというのはセキュリティ的に問題があります、同じパスワードをどこかで使っていないか自問自答するべきでしょう。

パスワードを平文で保存したくない場合、256-bit Encrypted PSK を生成するという方法があります。これはパスフレーズと SSID から標準アルゴリズムを使って計算します。

- 方法 1: `wifi-menu -o` を実行して `/etc/netctl` に設定ファイルを生成する
- 方法 2: 手順に従って手動設定する

どちらの方法でも、`chmod 600 /etc/netctl/<config_file>` をしてパスワードにユーザーがアクセスできないようにするのを提案します。

wpa_passphrase を使ってあなたの 256-bit Encrypted PSK を生成してください:

    $ wpa_passphrase your_essid passphrase

    network={
      ssid="your_essid"
      #psk="passphrase"
      psk=64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
    }

Note: 表示された情報はプロファイルで使うのでターミナルを閉じないで下さい。

新しいターミナルを開き、サンプルファイル `wireless-wpa` を `/etc/netctl/examples` から `/etc/netctl` にコピーしてください。

    # cp /etc/netctl/examples/wireless-wpa /etc/netctl/wireless-wpa

それからお好きなテキストエディタを使って `/etc/netctl/wireless-wpa` を編集する必要があります。先に wpa_passphrase を使って生成された Encrypted Pre-shared Key (psk) をプロファイルの `Key` 変数に追加してください。

256-bit Encrypted PSK を含むネットワークプロファイル `wireless-wpa` は以下のようになるはずです:

    /etc/netctl/wireless-wpa

    Description='A simple WPA encrypted wireless connection using 256-bit Encrypted PSK'
    Interface=wlp2s2
    Connection=wireless
    Security=wpa
    IP=dhcp
    ESSID=your_essid
    Key=\"64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a

Note:

- `Key` 変数には netctl.profile(5) の最後で説明されている special non-quoting rules を使うようにして下さい。
- パスフレーズが失敗する場合、`Key` の中の `\"` を削除してみてください。

## Tips and Tricks

### GUI を使う

netctl や接続を管理するのにグラフィカルユーザーインターフェースが欲しい場合、netgui をインストールすることができます。ただし、netgui はまだベータなので問題が起こった時のために基本的な netctl の構文には慣れておいて下さい。

### 'netcfg current' の代用

以前 `netcfg current` を使っていた場合は、`netctl-auto` で起動した接続の代わりとして `# netctl-auto current` を使うことができます (netctl-1.3 以降の機能)。

接続を手動でパースするには、次を使って下さい:

    # netctl list | awk '/*/ {print $2}'

### Eduroam

いくつかの大学では "Eduroam" という名前のシステムを使って無線ネットワークを管理しています。このシステム用に、以下のフォーマットの WPA config-section プロファイルが利用できます:

    /etc/netctl/wlan0-eduroam

    Description='Eduroam-profile for <user>'
    Interface=wlan0
    Connection=wireless
    Security=wpa-configsection
    IP=dhcp
    WPAConfigSection=(
     'ssid="eduroam"'
     'proto=RSN WPA'
     'key_mgmt=WPA-EAP'
     'auth_alg=OPEN'
     'eap=PEAP'
     'identity="<user>"'
     'password="<password>"'
    )

Tip: To prevent storing your password as plaintext, you can generate a password hash with `$ echo -n <password> | iconv -t utf16le | openssl md4`. Then use it as `'password=hash:<hash>'`.

TTLS や認証を受けた大学では以下の設定が動きます:

    /etc/netctl/wlan0-eduroam

    Description='Eduroam university'
    Interface=wlan0
    Connection=wireless
    Security=wpa-configsection
    IP=dhcp
    ESSID=eduroam
    WPAConfigSection=(
        'ssid="eduroam"'
        'proto=RSN WPA'
        'key_mgmt=WPA-EAP'
        'eap=TTLS'
        'anonymous_identity="anonymous@domain_university"'
        'identity="XXX@domain_university"'
        'password="XXX"'
        'ca_path="/etc/ssl/certs/"'
        'ca_path2="/etc/ssl/certs/"'
        'phase2="auth=PAP"'
    )

### ボンディング

kernel documentation より:

  Linux bonding ドライバは複数のネットワークインターフェースを単一の論理的な「結合された」インターフェースに統合する手段を提供します。結合されたインターフェースの動作はモードに依存します。一般に言われる事ですが、モードはホットスタンバイまたは負荷分散サービスを提供します。加えて、リンクの保全監視が実現されます。

#### ロードバランシング

netctl とボンディングを使うには、公式リポジトリから追加のパッケージをインストールする必要があります: ifenslave.

`/etc/netctl/examples/bonding` を `/etc/netctl/bonding` にコピーして、以下のように編集してください:

    /etc/netctl/bonding

    Description='Bond Interface'
    Interface='bond0'
    Connection=bond
    BindsToInterfaces=('eth0' 'eth1')
    IP=dhcp
    IP6=stateless

古い設定を無効にして、bonding を自動的に起動するよう設定してください。新しいプロファイルに切り替えるには:

    # netctl switch-to bonding

Note: これは `bonding` ドライバーのデフォルトであるラウンドロビン方式を使います。詳しくは公式ドキュメントを見て下さい。
Tip: 状態とボンディングモードを確認するには:

    $ cat /proc/net/bonding/bond0

#### 有線から無線へのフェイルオーバー

This example describes how to use bonding to fallback to wireless when the wired ethernet goes down. It is assumed that dhcpcd service is running for all interfaces as by default.

You'll need additional packages from the official repositories: ifplugd, ifenslave and wpa_supplicant.

First configure the `bonding` driver to use `active-backup`:

    /etc/modprobe.d/bonding.conf

    options bonding mode=active-backup
    options bonding miimon=100
    options bonding primary=eth0
    options bonding max_bonds=0

The `max_bonds` option avoids the `Interface bond0 already exists` error. `fail_over_mac=active` setting may be added if MAC filtering is used.

Next, configure a netctl profile to enslave the two hardware interfaces:

    /etc/netctl/failover

    Description='A wired connection with failover to wireless'
    Interface='bond0'
    Connection=bond
    BindsToInterfaces=('eth0' 'wlan0')
    IP='dhcp'
    SkipNoCarrier='no'

Enable the profile on startup.

    # netctl enable failover

Configure wpa_supplicant to associate with known networks. This can be done with a netctl profile (remember to use `IP='no'`) and a wpa_supplicant service running constantly, or on-demand with wpa_cli. Ways to do this are covered on the wpa_supplicant page. To run wpa_supplicant constantly create wpa_supplicant config file `/etc/wpa_supplicant/wpa_supplicant-wlan0.conf` and then run:

    # systemctl enable wpa_supplicant@wlan0

Set `IP='no'` in wired network profile. IP address should be assigned to bond0 interface only.

If you have a wired and wireless connection to the same network, you can probably now disconnect and reconnect the wired connection without losing connectivity. In most cases, even streaming music won't skip!

### DHCP がタイムアウトする問題

If you are having timeout issues when requesting leases via DHCP you can set the timeout value higher than netctl's 30 seconds by default. Create a file in `/etc/netctl/hooks/` or `/etc/netctl/interfaces/`, add `TimeoutDHCP=40` to it for a timeout of 40 seconds and make the file executable.

### 接続がタイムアウトする問題

If you are having timeout issues that are unrelated to DHCP (on a static ethernet connection for example), and are experiencing errors similar to the following when starting your profile:

    # journalctl _SYSTEMD_UNIT=netctl@profile.service

    Starting network profile 'profile'...
    No connection found on interface 'eth0' (timeout)
    Failed to bring the network up for profile 'profile'

Then you should increase carrier and up timeouts by adding `TimeoutUp=` and `TimeoutCarrier=` to your profile file:

    /etc/netctl/profile

    ...
    TimeoutUp=300
    TimeoutCarrier=300

Don't forget to reenable your profile:

    # netctl reenable profile

### 全てのインターフェイスを使う

In some cases it may be desirable to allow a profile to use any interface on the system. A common example use case is using a common disk image across many machines with differing hardware (this is especially useful if they are headless). If you use the kernel's naming scheme, and your machine has only one ethernet interface, you can probably guess that eth0 is the right interface. If you use udev's Predictable Network Interface Names, however, names will be assigned based on the specific hardware itself (e.g. enp1s0), rather than simply the order that the hardware was detected (e.g. eth0, eth1). This means that a netctl profile may work on one machine and not another, because they each have different interface names.

A quick and dirty solution is to make use of the `/etc/netctl/interfaces/` directory. Choose a name for your interface alias (`en-any` in this example), and write the following to a file with that name (making sure it is executable).

    /etc/netctl/interfaces/en-any

    #!/bin/bash
    for interface in /sys/class/net/en*; do
            break;
    done
    Interface=$(basename $interface)
    echo "en-any: using interface $Interface";

Then create a profile that uses the interface. Pay special attention to the `Interfaces` directive. The rest are only provided as examples.

    /etc/netctl/wired

    Description='Wired'
    Interface=en-any
    Connection=ethernet
    IP=static
    Address=('192.168.1.15/24')
    Gateway='192.168.1.1'
    DNS=('192.168.1.1')

When the `wired` profile is started, any machine using the two files above will automatically bring up and configure the first ethernet interface found on the system, regardless of what name udev assigned to it. Note that this is not the most robust way to go about configuring interfaces. If you use multiple interfaces, netctl may try to assign the same interface to them, and will likely cause a disruption in connectivity. If you don't mind a more complicated solution, `netctl-auto` is likely to be more reliable.

### netctl@wlan(...).service が失敗した場合のジョブ

Some people have an issue when they connect to a network with netctl, e.g.

    # netctl start wlan0-ssid

    Job for netctl@wlan0\x2ssid.service failed. See 'systemctl status netctl@wlan0\x2ssid.service' and 'journalctl -xn' for details.

When then looking at journalctl -xn, either of the following are shown:

If your device (wlan0 in this case) is up:

    network[2322]: The interface of network profile 'wlan0-ssid' is already up

If it's down:

    dhcpcd[261]: wlan0: ipv4_sendrawpacket: Network is down

One way to solve this is to use a different dhcp-client, and getting your netctl profile to use it.

    # pacman -S dhclient
    # vim /etc/netctl/wlan0-ssid

    /etc/netctl/wlan0-ssid

    ...
    ForceConnect=yes
    DHCPClient='dhclient'

Save it and try to connect with the profile:

    # netctl start wlan0-ssid

Now it should work!

## 参照

- 公式アナウンススレッド: https://bbs.archlinux.org/viewtopic.php?id=157670
- AUR に cinnamon アプレットがあります: cinnamon-applet-netctl-systray-menu

Category:

- Networking (日本語)