Gentoo Linux ハンドブック:ネットワーク設定
以降のハンドブックのネットワークに関する部分は、OpenRC init システムを実行していて、ネットワーク管理システムとして netifrc を利用しているシステムのために、「高度な」ネットワーク設定について記述しています。
systemd を実行しているシステムについては、systemd の記事のネットワークの箇所を確認すべきです。
はじめに
このネットワークガイドは、ユーザーがシステム設定を正しく完了し、ハードウェアのインターフェース名を特定していることを前提にしています。ネットワークインターフェース名は、ネットワークカードがシステム上のどのバスに存在するかによって命名されます。そのため、インターフェース名は eno0、ens1、wlan0、enp1s0 などの変種である可能性があります。各システムはこれとわずかに異なるインターフェース名を持つかもしれません。以下の内容ではインターフェース名は eth0 に設定されていると仮定していますが、前述したような名前でも動作します。
ネットワークカードの設定を始めるなら、まずGentooのRCシステムにそのことを伝えましょう。これは、net.lo から net.eth0 (もしくは他の、システム上のネットワークインターフェース名)へのシンボリックリンクを /etc/init.d に作成することで行うことができます。
root #
cd /etc/init.d
root #
ln -s net.lo net.eth0
これでもう、GentooのRCシステムはそのインターフェースについて知っているわけです。さらに、この新たなインターフェースをどのように設定するのかも教える必要があります。全てのネットワークインターフェースの設定は /etc/conf.d/net ファイルにあります。下に示すのは、DHCPと静的アドレスのサンプル設定です。
# DHCPを使う場合
config_eth0="dhcp"
# CIDR記法で静的IPを設定する場合
config_eth0="192.168.0.7/24"
routes_eth0="default via 192.168.0.1"
dns_servers_eth0="192.168.0.1 8.8.8.8"
# ネットマスクによる記法で静的IPを設定する場合
config_eth0="192.168.0.7 netmask 255.255.255.0"
routes_eth0="default via 192.168.0.1"
dns_servers_eth0="192.168.0.1 8.8.8.8"
何も設定されていないインターフェースは DHCP を使うと推定されます。
CIDRはClassless InterDomain Routingの略称です。元々、IPv4アドレスはA、BそしてCに分類されていました。初期の分類システムはインターネットが大人数で使用されることを想像していなかったので、一意的なアドレスの枯渇の危機にあります。CIDRは1つのIPアドレスが多くのIPアドレスを示すようにする取り組みです。CIDRのIPアドレスは、IPアドレスの最後がスラッシュとそれに続く数字で終わることを除けば、普通のIPアドレスに似ています(例えば192.168.0.0/16)。CIDRはRFC 1519で説明されています。
インターフェースの設定が完了したら、次のコマンドで開始または停止できます。
root #
rc-service net.eth0 start
root #
rc-service net.eth0 stop
ネットワークのトラブルシューティングをするときは、/var/log/rc.log を見てください。/etc/rc.conf 内で rc_logger 変数を
NO
に設定していなければ、ブート試行についての情報がこのログファイルに保存されるでしょう。ネットワークインターフェースが正常に停止と開始を行えることを確認したら、次のステップは Gentoo 起動時に開始されるように設定することです。このように:
root #
rc-update add net.eth0 default
root #
rc
最後の rc コマンドは、現在のランレベルで開始していないすべてのスクリプトを開始するよう Gentoo に指示します。
高度な設定
config_eth0変数は、インターフェースの設定の中心です。これはインターフェース(この場合eth0)を設定する高レベルの命令リストです。この命令リストの各コマンドは順に実行されます。少なくとも1つのコマンドが動作すれば、インターフェースはOKとみなします。
ビルドインの命令一覧です:
値 | 説明 |
---|---|
null
|
何もしません。 |
noop
|
もしインターフェースが起動していて、アドレスが存在するなら、設定を正常に中止します。 |
IPv4またはIPv6のアドレス | アドレスをインターフェースに追加します。 |
dhcp 、adsl またはapipa (あるいはサードパーティモジュールによるカスタム値)
|
コマンドを提供するモジュールを実行します。例えばdhcp は、dhcpcd、dhclientまたはpumpが提供できるDHCPを提供するモジュールを実行します。
|
コマンドが失敗する場合の fallback 値を設定してください。fallback は config の構造と正確に一致している必要があります。
これらの値を一緒に繋げることが可能です。これは実際の例です:
# 3つのIPv4アドレスを追加する
config_eth0="192.168.0.2/24
192.168.0.3/24
192.168.0.4/24"
# 1つのIPv4アドレスと2つのIPv6アドレスを追加する
config_eth0="192.168.0.2/24
4321:0:1:2:3:4:567:89ab
4321:0:1:2:3:4:567:89ac"
# インターフェースがダウンしDHCPを使用して新しいアドレスが設定されない限り、
# カーネルに設定されているアドレスを保持する。もしDHCPが失敗したら、APIPAに
# よって決定された静的アドレスを追加する。
config_eth0="noop
dhcp"
fallback_eth0="null
apipa"
ifconfig
モジュールを使用して複数のアドレスを追加するとき、それぞれの追加アドレスに対してインターフェースの別名が作成されます。上の 2 つの例では、eth0、eth0:1、eth0:2 のインターフェースが得られるでしょう。カーネルや他のプログラムは eth0:1 と eth0:2 を eth0 として扱うでしょうから、これらのインターフェースに対して何か特別なことを行うことはできません。フォールバックの順番は重要です!もしnullオプションが指定されなかったら、
noop
が失敗した時だけapipa
が実行されるでしょう。ネットワーク依存関係
/etc/init.d/ 内の init スクリプトは、特定のネットワークインターフェース、または単に "net" に依存することができます。Gentoo の init システム内のすべてのネットワークインターフェースは、"net" と呼ばれるものを提供します。
もし /etc/rc.conf 内で rc_depend_strict 変数が YES
に設定されている場合、"net" への依存関係が満たされたと見なされるためには、"net" を提供するすべてのネットワークインターフェースがアクティブでなくてはなりません。言い換えると、システムが net.eth0 と net.eth1 を持ち、ある init スクリプトが "net" に依存している場合、両方が有効でなくてはなりません。
一方、rc_depend_strict="NO"
が設定されていると、少なくともひとつのネットワークインターフェースが有効になった時点で、"net" 依存関係は解決されたものとしてマークされます。
しかし、net.br0 が net.eth0 と net.eth1 に依存している場合はどうでしょう? net.eth1 はブリッジに追加する前に構成を必要とする、無線デバイスや PPP デバイスであるかもしれません。/etc/init.d/net.br0 が net.lo へのシンボリックリンクである限り、その中では設定することができません。
これに対する答えは /etc/conf.d/net 内で rc_net_{interface}_need 設定を定義することです:
rc_net_br0_need="net.eth0 net.eth1"
しかし、これだけでは不十分です。Gentoo のネットワーク init スクリプトは、"net" と呼ばれる仮想依存を、ネットワークが利用可能になったときにシステムに通知するために使用します。上のケースでは明らかに、net.br0 が稼働しているときだけネットワークは利用可能としてマークされるべきで、他のネットワークインターフェースが稼働しているときではありません。そこで、/etc/conf.d/net にそのことも書く必要があります:
rc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"
依存関係についてのさらに詳しい説明については、Gentoo ハンドブックの init スクリプトの編集についてのセクションを確認してください。/etc/rc.conf についてのさらなる情報は、当ファイル内にコメントとして書かれています。
変数名と値
変数の名前は動的に決まります。通常は、variable_${interface|mac|essid|apmac}
という構造に従います。例えば、dhcpcd_eth0 は eth0 のための dhcpcd のオプションの値を保持し、dhcpcd_essid は、あるインターフェースが "essid" という ESSID に接続するときの dhcpcd のオプションの値を保持します。
しかしながら、インターフェース名が ethx のような名前でなくてはならない確実なルールは存在しません。実際に、多くの無線インターフェースは ethx の他に、wlanx あるいは rax のような名前を持つことがあります。さらに、ブリッジなどの一部のユーザー定義インターフェースは、好きな名前を付けられます。さらに愉快なことに、無線アクセスポイントは半角英数以外の文字の文字を含むことができます。これはユーザが ESSID ごとのネットワークパラメータを設定するときに重要です。
これの何が問題かというと、Gentoo がネットワークのために bash 変数を利用していて、bash は半角英数以外の文字を使えないということです。この制限を回避するために、私たちは非半角英数の文字をすべて _ (アンダースコア) 文字に置き換えます。
bash のもうひとつの問題は、変数の値です。一部の文字をエスケープする必要があります。これは、エスケープする必要がある文字の前に \ (バックスラッシュ) 文字を置くことで行えます。エスケープする必要がある文字は、"、'、そして \ です。
次の例では、利用できる文字の最大範囲を含む無線 ESSID を使用します。私たちは ESSID My "\ NET を使用します:
# 動作しますが、ドメインは無効です
dns_domain_My____NET="My \"\\ NET"
上の例は、ESSID が My "\ NET であるアクセスポイントに無線カードが接続しているときに、DNS ドメインを My "\ NET に設定します。
ネットワークインターフェースの命名
動作の仕組み
ネットワークインターフェースの名前は任意に選択されます: Linux カーネルとデバイスマネージャ (多くのシステムではデバイスマネージャとして udev を使用しますが、他も利用可能です) が、一定のルールに基づいてインターフェース名を選択します。
インターフェースカードがシステムで検出されたとき、Linux カーネルはこのカードについての必要なデータを収集します。これには以下が含まれます:
- ネットワークカードのオンボードの (機器自体に設定された) 登録名。後で ID_NET_NAME_ONBOARD の値を通じて確認できます。
- ネットワークカードが接続されたスロット。後で ID_NET_NAME_SLOT の値を通じて確認できます。
- ネットワークカードデバイスにアクセスするためのパス。後で ID_NET_NAME_PATH の値を通じて確認できます。
- カードの (ベンダによって設定された) MAC アドレス。後で ID_NET_NAME_MAC の値を通じて確認できます。
この情報に基づき、デバイスマネージャはそのインターフェースをシステム上でどう命名するか決定します。デフォルトでは、上の変数のうち最初の 3 つ(ID_NET_NAME_ONBOARD, _SLOT or _PATH) のうち最初にヒットしたものを使用します。例えば、ID_NET_NAME_ONBOARD が見つかり、 eno1
に設定されていれば、そのインターフェースは eno1 と呼ばれるでしょう。
アクティブなインターフェースの名前が与えられたとき、提供された変数の値は udevadm を使って確認することができます:
root #
udevadm test-builtin net_id /sys/class/net/enp3s0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc. ID_NET_NAME_PATH=enp3s0
上の 3 つの変数のうちの最初に (この場合は唯一の) ヒットした変数は ID_NET_NAME_PATH で、この値がインターフェース名として使用されます。3 変数がすべて値を持ってないない場合は、システムはカーネルが提供する名前 (eth0、eth1 等) に回帰します。
伝統的なカーネル命名法を使う
この変更がされる以前は、ネットワークインターフェースカードは Linux カーネルによって、ドライバが読み込まれる順番に応じて (比較的はっきりしない理由で) 命名されていました。この挙動は、ブートローダで net.ifnames=0
ブートパラメータを設定することで今でも有効化することができます。
カスタムの名前を使う
命名法の変更の背景にあったアイデアは、ユーザを混乱させることではなく、簡単に名前を変更できるようにすることでした。システムに 2 個のインターフェースがあり、上の命名法が無ければ eth0 そして eth1 と呼ばれていた状況を想定してください。片方は有線によってネットワークにアクセスし、他方は無線アクセスです。インターフェース命名法のサポートがあると、ユーザはこれらを lan0 (有線) と wifi0 (無線) という名前で呼ばせることができます。eth* や wlan* 等の、以前のよく知られた名前は、提案される名前と衝突する可能性が今もあるので、使用を避けるのが最善です。
独自の命名ルールを設定するには、カードに対するパラメータの値を確認して、この情報を使用してください:
root #
udevadm test-builtin net_id /sys/class/net/eth0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc.
root #
vim /etc/udev/rules.d/70-net-name-use-custom.rules
# First one uses MAC information, and 70- number to be before other net rules SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="c8:0a:a9:42:9d:76", NAME="lan0"
root #
vim /etc/udev/rules.d/76-net-name-use-custom.rules
# Second one uses ID_NET_NAME_PATH information, and 76- number to be between # 75-net-*.rules and 80-net-*.rules SUBSYSTEM=="net", ACTION=="add", ENV{ID_NET_NAME_PATH}=="enp3s0", NAME="wifi0"
ルールはデフォルトのものより先に適用される (ルールは英数字順に適用され、70 は 80 より先に来る) ので、デフォルトの名前ではなくルールファイルで指定された名前が使用されます。ファイルに許可されている数字は 76 から 79 までの間です (75 で始まるルールで環境変数が設定され、80 で始まるルールでフォールバックの命名が行われます)。
ネットワークモジュール
Netifrc はモジュール化されたネットワークスクリプトをサポートしています。つまり、既存のスクリプトとの互換性を保ちつつ、新しいインターフェースタイプのサポートと設定モジュールを簡単に追加することができます。
モジュールは、それらが必要とするパッケージがインストールされていれば、デフォルトでロードされます。必要なパッケージがインストールされていないモジュールを指定した場合、インストールする必要のあるパッケージを示すエラーが報告されます。理想的には、同様のサービスを提供する 2 個以上のパッケージがインストールされていて、そのうち一方を選択したい場合にのみ、モジュール設定が使用されます。
ここで説明されるすべての設定は、特に指定が無い限り /etc/conf.d/net に保存されるものです。
# iproute2 より ifconfig を優先します
# modules="ifconfig"
# インターフェースごとに異なるモジュールを指定できます
# ここでは dhcpcd より dhclient を優先します
modules_eth0="dhclient"
# 使用したくないモジュールを指定することもできます - 例えば無線の設定の
# 管理に supplicant あるいは linux-wlan-ng を使用しているが、それでも
# 接続している ESSID ごとにネットワーク設定を管理したい。
modules="!iwconfig"
インターフェース・ハンドラー
私たちは 2 種類のインターフェースハンドラを提供しています: ifconfig と iproute2 です。一方のみがあれば、すべてのネットワーク設定を行うことができます。
どちらもシステムプロファイルの一部として、デフォルトでインストールされます。iproute2 のほうが強力で、柔軟な設定が行えるパッケージです。ifconfig と net-tools は、今はもうネットワーク構成のために使用すべきではありません。
iproute2 と ifconfig は非常に似たことを行うものなので、基本的な設定はどちらに対しても動作するようになっています。例えば、下の設定は使用されるモジュールにかかわらず動作します。
config_eth0="192.168.0.2/24"
config_eth0="192.168.0.2 netmask 255.255.255.0"
DHCP
DHCP は、サーバから IP アドレスなどのネットワーク情報 (DNS サーバ、ゲートウェイ等) を取得するための方法です。ネットワーク上に動作している DHCP サーバがあれば、ユーザはそれぞれのデバイスに DHCP を介して構成情報を取得することを指示するだけで、DHCP を使用してデバイスを自動的に設定することができます。もちろん、このためには (例えば、無線アクセスポイントや PPPoE 等を経由した) ネットワーク接続が必要です。
DHCP の機能は dhclient または dhcpcd によって提供されます。DHCP モジュールのそれぞれに長所と短所があります。以下に概略を示します:
DHCP モジュール | パッケージ | 長所 | 短所 |
---|---|---|---|
dhclient | net-misc/dhcp | BIND DNS ソフトウェアを作成している ISC によって作成されている。非常に柔軟な設定が可能。DHCPv4 または DHCPv6 を提供するために使用できる。 | 設定が過剰に複雑、ソフトウェアはかなり肥大化している、DHCP から NTP サーバを取得できない、デフォルトではホスト名を送信しない。もう上流で保守されていない。 |
dhcpcd | net-misc/dhcpcd | 長きにわたり Gentoo のデフォルト、外部ツールへの依存が無い、Gentoo により活発に開発されている。DHCPv4 と DHCPv6 を同時に提供する。 | たまに遅いことがある、リース期間が無限の場合にデーモン化しない。 |
複数の DHCP クライアントがインストールされている場合は、modules="dhcpcd"
などのように "modules" 変数を設定することによって、どのクライアントを使用するかを指定することができます。指定しておらず、dhcpcd がインストールされている場合は、dhcpcd がデフォルトで使用されます。
DHCP モジュールに特定のオプションを送信するには、module_eth0="..." を使用してください。ここで module は、例えば "dhcpcd_eth0" などの、使用したい DHCP モジュールです。
私たちは DHCP を比較的特定のソフトウェアに依存しないようにしています。dhcp_eth0 変数を使用した次のコマンドをサポートしています。デフォルトではこれらはどれも設定されません:
release
- IP アドレスが再利用できるように解放します。
nodns
- /etc/resolv.conf を上書きしません。
nontp
- /etc/ntp.conf を上書きしません。
nonis
- /etc/yp.conf を上書きしません。
# 複数の DHCP モジュールがインストールされている場合のみ必要
modules="dhcpcd"
config_eth0="dhcp"
dhcpcd_eth0="-t 10" # 10 秒後にタイムアウト
dhcp_eth0="release nodns nontp nonis" # アドレス取得だけ行う
dhcpcd はデフォルトで現在のホスト名を DHCP サーバに送信するので、もうこれを指定する必要はありません。
# 複数の DHCP モジュールがインストールされている場合のみ必要
modules="dhclient"
config_eth0="dhcpv6"
# デュアルスタックネットワーク上で DHCPv4 と DHCPv6 の両方を使用するには、上の行を削除して、以下の行のコメントを解除してください
#config_eth0="dhcp
#dhcpv6"
# DHCPv6 のために dhclient にランタイム引数を渡すには
dhclientv6_eth0="-t 10" # 10 秒後にタイムアウト
# 汎用 DHCPv6 オプションを設定する
dhcpv6_eth0="release nodns nontp nonis nogateway nosendhost"
PPPoE/PPPoA を使用した ADSL
まずは ADSL ソフトウェアのインストールが必要です:
root #
emerge --ask net-dialup/ppp
次に、PPP net スクリプトと、PPP が使用する Ethernet インターフェースのための net スクリプトを作成してください:
root #
ln -s /etc/init.d/net.lo /etc/init.d/net.ppp0
root #
ln -s /etc/init.d/net.lo /etc/init.d/net.eth0
/etc/rc.conf で rc_depend_strict を YES
に設定しているか確認してください。
そして /etc/conf.d/net を設定することが必要です。
config_eth0=null (Specify the ethernet interface)
config_ppp0="ppp"
link_ppp0="eth0" (Specify the ethernet interface)
plugins_ppp0="pppoe"
username_ppp0='user'
password_ppp0='password'
pppd_ppp0="
noauth
defaultroute
usepeerdns
holdoff 3
child-timeout 60
lcp-echo-interval 15
lcp-echo-failure 3
noaccomp noccp nobsdcomp nodeflate nopcomp novj novjccomp"
rc_need_ppp0_need="net.eth0"
また、 /etc/ppp/pap-secrets 内にパスワードを記載することもできます。
# 以下の「*」は必要です。
"username" * "password"
PPPoE を USB モデムとともに使用する場合は、br2684ctl を emerge しているか確認してください。適切に設定する方法についての情報は /net-dialup/speedtouch-usb/files/README をお読みください。
/usr/share/doc/netifrc-*/net.example.bz2 の ADSL と PPP についてのセクションをよく読んでください。ここには一部の PPP 構成で必要になりそうなすべての設定について、より詳しい説明が多く書かれています。
APIPA (Automatic Private IP Addressing)
APIPA は、そのインターフェースから arping を使用して、 169.254.0.0-169.254.255.255 の範囲内のランダムなアドレスに ping することで、範囲内の使用されていないアドレスを探します。応答が無かった場合、そのアドレスがインターフェースに割り当てられます。
これは以下の条件を満たす LAN でのみ有用です:
- DHCP サーバがなく;
- システムはインターネットに直接接続しておらず;
- 他のすべてのコンピュータが APIPA を使用している。
APIPA サポートを追加するには、arping
USE フラグを有効化して net-misc/iputils を emerge するか、net-analyzer/arping を emerge してください。
# まず DHCP を試し、失敗した場合は APIPA にフォールバックする
config_eth0="dhcp"
fallback_eth0="apipa"
# APIPA だけを使う
config_eth0="apipa"
ボンディング
ボンディングは、ネットワーク帯域を増やすためや、ハードウェア故障時の回復力を改善するために使用されます。システムに同一のネットワークに接続する 2 個のネットワークカードが存在するとき、これらをくっつける (bond) ことができます: そうすると、アプリケーションには 1 個のインターフェースとして見えるでしょうが、実際には両方のネットワークカードが使用されるでしょう。
ボンディングを構成する方法は複数あります。そのうちの一部、例えば 802.3ad LACP モードなどは、専用のサポートやネットワークスイッチの追加の構成が必要になります。それぞれの選択肢のリファレンスについては、/usr/src/linux/Documentation/networking/bonding.txt のローカルコピーを参照してください。
まず、ボンディングに参加するインターフェースの設定をクリアしてください:
config_eth0="null"
config_eth1="null"
config_eth2="null"
次に、インターフェース間のボンディングを定義してください:
slaves_bond0="eth0 eth1 eth2"
config_bond0="192.168.100.4/24"
# 要求に合った、正しいモードと追加の構成オプションを選択してください
mode_bond0="balance-alb"
関連するランレベルから net.eth* サービスを削除し、net.bond0 サービスを作成して、このサービスを適切なランレベルに追加してください。
ブリッジ (802.1d サポート)
ブリッジはネットワークを相互接続するのに使用されます。例えば、あるネットワークには、ADSL モデム経由でインターネットに接続するサーバと、そのネットワーク上の他のデバイスがこのモデムを経由してインターネットにアクセスできるようにするための、無線アダプタがあるとします。ブリッジを作成することで、2 個のインターフェースを相互接続することができます。
# ブリッジを構成します - 詳細は "man brctl" を確認してください
bridge_forward_delay_br0=0
bridge_hello_time_br0=200
bridge_stp_state_br0=1
# ブリッジ br0 にポートを追加する
bridge_br0="eth0 eth1"
# dhcp が開始しないように、元のポートを null 値に設定する必要があります
config_eth0="null"
config_eth1="null"
# 最後にブリッジにアドレスを割り当てます - DHCP を使用することもできます
config_br0="192.168.0.1/24"
# 追加の構成が必要かもしれないので、eth0 と eth1 に依存させます
rc_net_br0_need="net.eth0 net.eth1"
ブリッジ構成を使用するために、上の変数名のドキュメントを確認してください。
IPv6 を使ってブリッジを構成する場合、SLAAC によって、上の例で見られるように STP を
1
に設定することが要求されます。MAC アドレス
ネットワーク設定ファイルを通して、インターフェースの MAC アドレスを変更することもできます。
# インターフェースの MAC アドレスを設定するには
mac_eth0="00:11:22:33:44:55"
# 末尾 3 バイトのみをランダム化するには
mac_eth0="random-ending"
# 物理接続種別 (例: ファイバ、銅線、無線) が同一である、すべてのベンダの
# インターフェース間でランダム化するには
mac_eth0="random-samekind"
# 物理接続種別 (例: ファイバ、銅線、無線) を問わず、すべてのベンダの
# インターフェース間でランダム化するには
mac_eth0="random-anykind"
# 完全ランダム化 - 警告: これにより生成された MAC アドレスの一部は
# 期待通りに動作しないことがあります
mac_eth0="random-full"
トンネリング
トンネリングは、インターフェースハンドラによって行うことができるので、ソフトウェアを追加でインストールする必要はありません。
# GRE トンネル
iptunnel_vpn0="mode gre remote 207.170.82.1 key 0xffffffff ttl 255"
# IPIP トンネル
iptunnel_vpn0="mode ipip remote 207.170.82.2 ttl 255"
# インターフェース設定
config_vpn0="192.168.0.2 peer 192.168.1.1"
VLAN (802.1q サポート)
VLAN のサポートのためには、sys-apps/iproute2 がインストールされていることと、(ifconfig ではなく) iproute2 が構成モジュールとして使用されていることを確認してください。
VLAN、あるいは仮想 LAN とは、物理的な実態に関わらず、それぞれ個別のネットワークセグメントに接続されているかのように振る舞うネットワークデバイス群です。VLAN のメンバは、仮に同一の物理ネットワークを共有していたとしても、同一の VLAN の他の参加ノードとのみ通信できます。
VLAN を構成するには、まず次のように /etc/conf.d/net で VLAN 番号を指定してください:
vlans_eth0="1 2"
次に、各 VLAN に対するインターフェースを構成してください:
config_eth0_1="172.16.3.1 netmask 255.255.254.0"
routes_eth0_1="default via 172.16.3.254"
config_eth0_2="172.16.2.1 netmask 255.255.254.0"
routes_eth0_2="default via 172.16.2.254"
VLAN 固有の設定は次のようにすることで、vconfig によって処理されます:
vlan1_name="vlan1"
vlan1_ingress="2:6 3:5"
eth0_vlan1_egress="1:2"
VLAN 構成を使用するために、上の変数名のドキュメントを確認してください。
無線ネットワーキングへの導入
Linuxでの無線ネットワーキングは、多くの場合、極めて簡単です。wifiの設定には3つの方法があり、ひとつはグラフィカルクライアント、ひとつはテキストモードインターフェース、そしてもうひとつはコマンドラインインターフェースです。
もう既にデスクトップ環境をインストールしたなら、もっとも簡単な方法は、グラフィカルクライアントを使うことです。NetworkManager などの、ほとんどのグラフィカルクライアントは、極めて直感的であり、これらの提供するマウスによる便利なインターフェースを使えば、ユーザーは数秒でネットワークに接続できます。
NetworkManager はメインのグラフィカルインターフェースに加え、テキストモード、あるいはコマンドラインインターフェースのユーティリティも提供します。net-misc/networkmanager パッケージを、
tools
USE フラグつきで emerge しましょう。nmtui ユーティリティは特に、X や Wayland ベースのデスクトップ環境は使っていないけれど、設定ファイルを手書きしなくて済む簡単に使えるコマンドラインツールが欲しいという人に便利です。無線は、いくつかの設定ファイルの編集により、コマンドラインから設定することもできます。このやり方ではセットアップに多少時間がかかりますが、ダウンロードしてインストールするパッケージも最も少なくて済みます。グラフィカルクライアントの使い方は(彼らのホームページの親切なスクリーンショットも相まって)ほとんど自明ですから、ここではコマンドラインでの方法に注目することにします。
コマンドラインでの無線の設定をサポートするツールは3つあります。 net-wireless/iw と net-wireless/wireless-tools と net-wireless/wpa_supplicant です。これらの3つの中では、net-wireless/wpa_supplicant が好ましいでしょう。覚えておくべき重要な事柄は、無線ネットワークはグローバルに設定されるのであり、インターフェースごとに設定されるのではないということです。
net-wireless/iw ソフトウェアはほとんど全てのカードとドライバーをサポートしますが、WPA-onlyのアクセスポイントには接続できません。ネットワークがWEPによる暗号化のみを提供するか、もしくは完全にオープンならば、net-wireless/iw はシンプリシティの面で他のパッケージに勝ります。
いくつかの無線カードはデフォルトで無効化されています。有効にするには、ハードウェアの文書を参照してください。これらのうちいくつかは、rfkill アプリケーションを使ってunblockできます。その場合、rfkill list で利用できるカードを確認し、rfkill unblock INDEX で無線機能を有効化してください。そうでない場合、無線カードはラップトップのボタンやスイッチ、特別なキーの組み合わせによってアンロックする必要があるかもしれません。
WPA supplicant
WPA supplicant projectは、WPAが有効なアクセスポイントに接続するためのパッケージを提供しています。
root #
emerge --ask net-wireless/wpa_supplicant
wpa_supplicantを動作させるためには、カーネルでCONFIG_PACKETが有効になっている必要があります。今のカーネルでこれが有効か確かめるには、これを試してみてください:
root #
zgrep CONFIG_PACKET /proc/config.gz
root #
grep CONFIG_PACKET /usr/src/linux/.config
USEフラグによっては、wpa_supplicantはQt5で書かれた、KDEと親和性の高いグラフィカルインターフェースをインストールします。もしこれが欲しければ、net-wireless/wpa_supplicant で
USE="qt5"
を有効にしてください。次に、wpa_supplicantモジュールがwireless-toolsより優先されるように、/etc/conf.d/net の設定をします(両方がインストールされている場合、wireless-toolsがデフォルトになります)。
# wpa_supplicantをwireless-toolsより優先する
modules="wpa_supplicant"
host-apドライバを利用する場合、カードをwpa_supplicantで正しく使えるようにするため、前もってカードを"マネージドモード"にしておく必要があります。このためには、/etc/conf.d/net で
iwconfig_eth0="mode managed"
と設定します。次に、wpa_supplicant自体の設定をします(アクセスポイントのセキュアさによっては、ややトリッキーになってきます)。下の例は、wpa_supplicantに付属する /usr/share/doc/wpa_supplicant-<version>/wpa_supplicant.conf.gz を抜き出し、簡単にしたものです。
# この行は変更しないこと。さもないと、wpa_supplicantは仕事をしません
ctrl_interface=/var/run/wpa_supplicant
# 確実にrootのみがWPAの設定を読めるようにする
ctrl_interface_group=0
# wpa_supplicantがスキャンとAP選択の面倒をみるようにする
ap_scan=1
# シンプルなケース: WPA-PSK、ASCIIパスフレーズのPSK、有効な暗号化方式を全て許可
network={
ssid="simple"
psk="very secret passphrase"
# priorityが高いほど早くマッチする
priority=5
}
# 上と同じ、但しSSIDを明確にしたスキャンを要求
# (ブロードキャストSSIDを拒否するAP向け)
network={
ssid="second ssid"
scan_ssid=1
psk="very secret passphrase"
priority=2
}
# WPA-PSKのみを使用。有効な暗号化方式の組み合わせを全て許可
network={
ssid="example"
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
priority=2
}
# 平文での接続(WPAなし、IEEE 802.1Xなし)
network={
ssid="plaintext-test"
key_mgmt=NONE
}
# 共有WEPキー接続(WPAなし、IEEE 802.1Xなし)
network={
ssid="static-wep-test"
key_mgmt=NONE
# 引用符で囲われたキーはASCIIキー
wep_key0="abcde"
# 引用符なしで指定されたキーは16進キー
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
}
# 共有キーによる共有WEPキー接続(WPAなし、IEEE 802.1Xなし)
# IEEE 802.11認証
network={
ssid="static-wep-test2"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
priority=5
auth_alg=SHARED
}
# WPA-None/TKIPを使ったIBSS/ad-hocネットワーク
network={
ssid="test adhoc"
mode=1
proto=WPA
key_mgmt=WPA-NONE
pairwise=NONE
group=TKIP
psk="secret passphrase"
}
Wireless tools
初期セットアップと managed モード
wireless tools project はWEPセキュリティーレベルまでの基本的な無線インターフェースを設定する一般的な方法を提供します。WEPは脆弱なセキュリティ手法ですが、いまだ世界中で広く使われています。
wireless toolsの設定はいくつかの主要な変数によって制御されます。以下の設定ファイルのサンプルで必要なものすべてが説明されているはずです。設定がないことは"もっとも強い暗号化されていないアクセスポイントへ接続せよ"という意味になることを心に留めておいてください - wireless toolsは常にシステムを何かに接続させようとします。
root #
emerge --ask net-wireless/wireless-tools
net-wireless/iw は無線スタック用の現行のツールですが、バージョン 0.6.0 より前の net-misc/netifrc はこの新しいコマンドとの組み合わせでは動作しません。以前のバージョンの netifrc は net-wireless/wireless-tools とともに使用する必要があります。詳細については変数名についてのドキュメントを参照してください。
# iwconfigをwpa_supplicantより優先する
modules="iwconfig"
# ESSID1とESSID2というアクセスポイントのWEPキーを設定する
# 最大4つのWEPキーを設定できますが、同時に有効になるのは1つだけなので
# デフォルトのインデックスとして[1]を指定してキー[1]を設定し、
# それから再度アクティブなキーを[1]に変更します
# 1以外のWEPキーを使用する他のESSIDを定義する場合に備えてこのようにします
#
# キーの前に s: と付けることでASCIIキーとして扱われ、それ以外はHEXキーになります
#
# enc open とするとオープンセキュリティ(もっとも安全性が高い)が指定されます
# enc restricted とすると制限セキュリティ(もっとも安全性が低い)が指定されます
key_ESSID1="[1] s:yourkeyhere key [1] enc open"
key_ESSID2="[1] aaaa-bbbb-cccc-dd key [1] enc restricted"
# 以下の部分は利用可能なアクセスポイントをスキャンするときのみ有効です
# 複数のアクセスポイントが見える場合があるので、
# 接続先の優先順位を定義する必要があります
preferred_aps="'ESSID1' 'ESSID2'"
AP の選択を微調整する
いくつかのオプションを追加してAPの選択を微調整することができますが、これらは必須ではありません。
1つの方法は、選択したAPのみに接続するようシステムを設定することです。デフォルトでは、すべての設定済みのものに失敗し、かつwireless-toolsが暗号化されていないアクセスポイントに接続できる場合、それに接続します。associate_order 変数でこの振る舞いを変更できます。値とどのように変更されるかを示した表は以下のとおりです。
Value | Description |
---|---|
any | デフォルトの動作。 |
preferredonly | 選択したAPリストの中の見えるAPのみに接続します。 |
forcepreferred | 選択したリストの中にあるAPがスキャンで見つからない場合、順番に強制的にそれらに接続します。 |
forcepreferredonly | APをスキャンしません - 代わりに順番に各APへの接続を試します。 |
forceany | forcepreferredと同様にし、さらに利用可能な他のAPに接続します。 |
blacklist_apsとunique_apという選択もあります。blacklist_apsはpreferred_apsと似た動作をします。unique_apはyesまたはnoの値で、2つめの無線インターフェースが1つめのインターフェースと同じアクセスポイントに接続できるかを表します。
# あるアクセスポイントに絶対に接続したくない場合もあります
blacklist_aps="'ESSID3' 'ESSID4'"
# 複数の無線カードがある場合、各カードに
# 同じアクセスポイントへの接続を許すかどうか指定できます
# 値は"yes"か"no"です
# デフォルトは"yes"です
unique_ap="yes"
Ad-hoc および master モード
managedモードですべてのアクセスポイントへの接続が失敗した場合、フォールバックとしてシステムをad-hocノードに設定するには以下を使います:
adhoc_essid_eth0="This Adhoc Node"
ad-hocネットワークに接続したり、システムをmasterモードにしてそれ自体をアクセスポイントにすることもできます。
# モードの設定 - managed (default), ad-hoc または master に設定できます
# すべてのドライバーがすべてのモードをサポートしているとは限りません
mode_eth0="ad-hoc"
# インターフェースのESSIDを設定します
# managedモードでは、インターフェースは指定されたESSIDのみを試行、接続します
essid_eth0="This Adhoc Node"
# 指定されていない場合、チャンネル3が使用されます
channel_eth0="9"
チャンネルの選択についての重要な資料がNetBSDの文書の BSD wavelan documentation にあります。14のチャンネルが使用可能です; 北米ではチャンネル1-11、欧州の大部分ではチャンネル1-13、フランスではチャンネル10-13、日本ではチャンネル14のみが合法であるとのことです。疑問があれば、カードやアクセスポイントの付属文書を参照してください。選択したチャンネルがアクセスポイント(またはad-hocネットワークの他のカード)があるチャンネルと同じになっていることを確認してください。北米で売られているカードのデフォルトは3、フランスで売られているカードのデフォルトは11、日本で売られているカードのデフォルトは14です。
wireless tools のトラブルシューティング
ドライバーや環境の問題によっては無線を立ち上げ維持する上で役に立つさらにいくつかの変数があります。
変数名 | デフォルト値 | 説明 |
---|---|---|
iwconfig_eth0 | iwconfigの送信内容の詳細については iwconfigのman pageを参照してください。 | |
iwpriv_eth0 | iwprivの送信内容の詳細についてはiwprivのman pageを参照してください。 | |
sleep_scan_eth0 | 0 | スキャンを試みる前にスリープする秒数。ドライバー/ファームウェアが使用可能になるまでにより時間がかかる場合に必要になります。 |
sleep_associate_eth0 | 5 | 次のアクセスポイントに移る前に、アクセスポイントに接続しようとしているインターフェースを待機する秒数。 |
associate_test_eth0 | MAC | いくつかのドライバーは接続が失われたり接続を試行した際に不正なMACアドレスをリセットしません。あるドライバーは接続が失われたり接続を試行した際にクオリティレベルをリセットしません。有効な設定は MAC、quality、そして all です。 |
scan_mode_eth0 | いくつかのドライバーはad-hocモードでスキャンする必要があります。スキャンが失敗する場合はここで ad-hoc の設定を試してみてください。 | |
iwpriv_scan_pre_eth0 | スキャンの前にいくつかのiwprivコマンドをインターフェースに送信します。詳細についてはiwprivのman pageを参照してください。 | |
iwpriv_scan_post_eth0 | スキャンの後にいくつかのiwprivコマンドをインターフェースに送信します。詳細についてはiwprivのman pageを参照してください。 |
ESSID ごとにネットワーク設定を定義する
この節では、ESSIDベースでネットワークを設定する方法を説明します。例として、ESSIDが ESSID1 の無線ネットワークには静的IPアドレスを設定し、ESSIDが ESSID2 のものにはDHCPを使用します。
この設定はwpa_supplicantとwireless-toolsのいずれでも動作します。
変数名についてのドキュメントを参照してください。
config_ESSID1="192.168.0.3/24 brd 192.168.0.255"
routes_ESSID1="default via 192.168.0.1"
config_ESSID2="dhcp"
fallback_ESSID2="192.168.3.4/24"
fallback_route_ESSID2="default via 192.168.3.1"
# ネームサーバーその他についても定義できます
# 注意: 特に設定しない限り、DHCPはこれらを上書きします
dns_servers_ESSID1="192.168.0.1 192.168.0.2"
dns_domain_ESSID1="some.domain"
dns_search_domains_ESSID1="search.this.domain search.that.domain"
# アクセスポイントのMACアドレスによって上書きします
# これは同じESSIDを持つ別の場所に行く場合に便利です
config_001122334455="dhcp"
dhcpcd_001122334455="-t 10"
dns_servers_001122334455="192.168.0.1 192.168.0.2"
標準関数フック
/etc/conf.d/net 内では 4 つの関数を定義することができます:
preup()
、インターフェースが up にされる前に呼ばれます;predown()
、インターフェースが down にされる前に呼ばれます;postup()
、インターフェースが up にされた後に呼ばれます;postdown()
、インターフェースが down にされた後に呼ばれます。
これらの関数はすべてインターフェース名を指定して呼び出されます。関数内ではインターフェース名は IFACE 変数を通じて利用でき、関数は複数のインターフェースを制御できるようになっています。
preup()
および predown()
関数の戻り値は以下の通りであるべきです:
- 成功し、インターフェースの構成または構成の解除を続行できることを表す、0。
- それ以外の場合は 0 以外の値。
preup()
が 0 以外の値を返すと、インターフェースの構成は中止されるでしょう。predown()
が 0 以外の値を返すと、インターフェースの構成解除を続行することは許可されないでしょう。
postup()
および postdown()
関数が失敗を示していたとしても、することは何もないので、これらの関数の戻り値は無視されます。
${IFACE} は、接続/切断されようとしているインターフェースに設定されます。${IFVAR} は bash が使用できる変数名に変換された ${IFACE} です。
preup() {
# 有効化する前にインターフェースのリンク状態をテストします。これは
# 一部のネットワークアダプタでのみ機能し、ethtool パッケージが
# インストールされている必要があります。
if ethtool ${IFACE} | grep -q 'Link detected: no'; then
ewarn "No link on ${IFACE}, aborting configuration"
return 1
fi
# 成功時には 0 を忘れずに返します
return 0
}
predown() {
# スクリプトのデフォルトでは NFS ルートであるかを確認し、その場合は
# インターフェースの無効化を拒否します。predown() 関数を指定した場合、
# このロジックが上書きされることに注意してください。このロジックを以下に
# 示します。残したい場合は使ってください……。
if is_net_fs /; then
eerror "root filesystem is network mounted -- can't stop ${IFACE}"
return 1
fi
# 成功時には 0 を忘れずに返します
return 0
}
postup() {
# この関数は例えば、動的 DNS サービスに登録するために使えます。
# 他の可能性としては、インターフェースが有効化したときにメールを
# 送受信することがあるでしょう。
return 0
}
postdown() {
# この関数はほぼ完全性のためだけにここに書いています……。何か気の利いた
# ことをすることはまだ思い付きません ;-)
return 0
}
関数を書くためのさらなる情報いついては、/usr/share/doc/netifrc-*/net.example.bz2 をお読みください。
無線関数フック
これは WPA サプリカントとともには動作しないでしょう - しかし ${ESSID} および ${ESSIDVAR} 変数は
postup()
関数で利用することができます。/etc/conf.d/net 内では 2 つの関数を定義することができます:
preassociate()
、アソシエーションの前に呼ばれます。postassociate()
、アソシエーションの後に呼ばれます。
これらの関数はすべてインターフェース名を指定して呼び出されます。関数内ではインターフェース名は IFACE 変数を通じて利用でき、関数は複数のインターフェースを制御できるようになっています。
preassociate() 関数の戻り値は以下の通りであるべきです:
- 成功し、構成を続行することを表す、0。
- それ以外の場合は 0 以外の値。
preassociate()
が 0 以外の値を返すと、インターフェースの構成は中止されるでしょう。
postassociate()
関数の戻り値は、それが失敗を示してもすることが何も無いので、無視されます。
各関数内では、システムが接続しようとしている AP の完全な ESSID は ESSID 変数を介して利用できます。${ESSIDVAR} は bash が使用できる変数名に変換された ${ESSID} です。
preassociate() {
# 下のコードは leap_user_ESSID と leap_pass_ESSID の 2 個の変数を
# 追加します。接続しようとしている ESSID に対してこれらの両方を設定して
# CISCO LEAP スクリプトを実行します
local user pass
eval user=\"\$\{leap_user_${ESSIDVAR}\}\"
eval pass=\"\$\{leap_pass_${ESSIDVAR}\}\"
if [[ -n ${user} && -n ${pass} ]]; then
if [[ ! -x /opt/cisco/bin/leapscript ]]; then
eend "For LEAP support, please emerge net-misc/cisco-aironet-client-utils"
return 1
fi
einfo "Waiting for LEAP Authentication on \"${ESSID//\\\\//}\""
if /opt/cisco/bin/leapscript ${user} ${pass} | grep -q 'Login incorrect'; then
ewarn "Login Failed for ${user}"
return 1
fi
fi
return 0
}
postassociate() {
# この関数はほぼ完全性のためだけにここに書いています……。何か気の利いた
# ことをすることはまだ思い付きません ;-)
return 0
}
${ESSID} および ${ESSIDVAR} は
predown()
および postdown()
関数では利用できません。カスタム関数を書くためのさらなる情報いついては、/usr/share/doc/netifrc-*/net.example.bz2 をお読みください。
ネットワーク管理
ノートパソコンでは、システムはいつも物理的に動いている状態にあります。結果、システムは常にはイーサネットケーブルに接続されていなかったり、利用できるアクセスポイントがない場合があります。また、ユーザはイーサネットケーブルが接続された時、あるいはアクセスポイントが検出された場合に、自動的にネットワークを機能させたいでしょう。
この章では、これをどのように行うかについてカバーしています。
この文書はifplugdについてのみ言及していますが、例えばnetplugのような、代用できるツールがあります。netplugは軽量なifplugdの代用ツールですが、netplugはカーネルのネットワークドライバが正しく機能することを前提としています、そして多くのドライバはそうではありません。
ifplugd
ifplugdは、イーサネットケーブルが挿入されたあるいは取り外された時に、インターフェースを開始あるいは終了させるデーモンです。またこれは、既存のアクセスポイントや、新しいアクセスポイントが範囲内に存在する時、アクセスポイントへの接続の検出も管理します。
root #
emerge --ask sys-apps/ifplugd
ifplugdの設定はかなり簡単です。設定は/etc/conf.d/netに存在します。利用できる変数の詳細についてはman ifplugdを実行してください。また、他の例については/usr/share/doc/netifrc-*/net.example.bz2を参照してください。
# モニタリングするために、eth0をインターフェースに取り替える
ifplugd_eth0="..."
# ワイヤレスインターフェイスをモニタリングする
ifplugd_eth0="--api-mode=wlan"
複数のネットワーク接続を管理することに加えて、複数のDNSサーバや設定との連携を簡単にするツールが欲しいかもしれません。これはシステムがDHCPを経由してIPアドレスを受け取る時に非常に便利です。
root #
emerge --ask net-dns/openresolv
機能について更に学びたいのであれば、man resolvconfを参照してください。