第5章 ネットワークの設定

目次

5.1. 基本的ネットワークインフラ
5.1.1. ホスト名の解決
5.1.2. ネットワークインターフェース名
5.1.3. LAN のためのネットワークアドレス範囲
5.1.4. ネットワークデバイスサポート
5.2. デスクトップのための現代的なネットワーク設定
5.2.1. GUI のネットワーク設定ツール
5.3. GUI無しの現代的なネットワーク設定
5.4. クラウドのための現代的なネットワーク設定
5.4.1. クラウドのための現代的なネットワーク設定
5.4.2. クラウドのための静的IPを使う現代的なネットワーク設定
5.4.3. クラウドのための Network Manger を使う現代的なネットワーク設定
5.5. 低水準ネットワーク設定
5.5.1. Iproute2 コマンド
5.5.2. 安全な低レベルネットワーク操作
5.6. ネットワークの最適化
5.6.1. 最適 MTU の発見
5.6.2. WAN TCP の最適化
5.7. Netfilter インフラ
[ヒント] ヒント

現代的な Debian に特化したネットワーク設定のガイドは The Debian Administrator's Handbook — Configuring the Network を参照下さい。

[ヒント] ヒント

systemd の下では、networkd がネットワーク管理に使えます。systemd-networkd(8)y> を参照下さい。

現代的な Debian システムの基本的ネットワークインフラをレビューします。

表5.1 GUI のネットワーク設定ツール

パッケージ ポプコン サイズ タイプ 説明
network-manager V:392, I:459 15542 設定::NM NetworkManager (デーモン): ネットワークを自動管理
network-manager-gnome V:121, I:369 5583 設定::NM NetworkManager (GNOME フロントエンド)
netplan.io V:1, I:5 319 設定::NM+networkd Netplan (生成器): NetworkManager と systemd-networkd バックエンド用の統一的で宣言的なインターフェース
ifupdown V:608, I:979 199 設定::ifupdown ネットワークを接続したり切断したりする標準化されたツール (Debian 特定)
isc-dhcp-client V:217, I:981 2875 設定::低レベル DHCP クライアント
pppoeconf V:0, I:5 186 設定::ヘルパー PPPoE コネクションの設定ヘルパー
wpasupplicant V:353, I:513 3862 設定::ヘルパー WPA と WPA2 (IEEE 802.11i) のためのクライアントサポート
wpagui V:0, I:1 774 設定::ヘルパー wpa_supplicant の Qt GUI クライアント
wireless-tools V:179, I:244 292 設定::ヘルパー Linux のワイヤレス拡張を操作するツール
iw V:34, I:475 302 設定::ヘルパー Linux のワイヤレスデバイスを設定するツール
iproute2 V:736, I:972 3606 設定::iproute2 iproute2、IPv6 や他の高度なネットワーク設定: ip(8) や tc(8) 等
iptables V:319, I:718 2414 設定::Netfilter パケットフィルターと NAT のための管理ツール (Netfilter)
nftables V:106, I:701 182 設定::Netfilter パケットフィルターと NAT のための管理ツール (Netfilter) ({ip,ip6,arp,eb}tables の後継)
iputils-ping V:194, I:997 122 テスト ホスト名IP アドレスによってリモートホストのネットワークからの到達性をテスト (旧来、GNU)
iputils-arping V:3, I:36 50 テスト ARP アドレスによって特定されるリモートホストのネットワークからの到達性をテスト
iputils-tracepath V:2, I:30 47 テスト リモートホストへのネットワークパスを追跡
ethtool V:95, I:267 739 テスト Ethernet デバイス設定の表示と変更
mtr-tiny V:5, I:46 156 テスト::低レベル リモートホストへのネットワークパスを追跡するツール (curses)
mtr V:4, I:41 209 テスト::低レベル リモートホストへのネットワークパスを追跡するツール (curses と GTK)
gnome-nettool V:0, I:17 2492 テスト::低レベル 共通のネットワーク情報操作のためのツール (GNOME)
nmap V:25, I:199 4498 テスト::低レベル ネットワークマッパー / ポートスキャナー (Nmap、コンソール)
tcpdump V:17, I:175 1340 テスト::低レベル ネットワークトラフィックアナライザー (Tcpdump、コンソール)
wireshark I:45 10417 テスト::低レベル ネットワークトラフィックアナライザー (Wireshark、GTK)
tshark V:2, I:25 400 テスト::低レベル ネットワークトラフィックアナライザー (コンソール)
tcptrace V:0, I:2 401 テスト::低レベル tcpdump の出力から接続状況のまとめを作成
snort V:0, I:0 2203 テスト::低レベル 柔軟なネットワーク侵入検知システム (Snort)
ntopng V:0, I:1 15904 テスト::低レベル ネットワークの使用状況をウェッブブラウザーで表示
dnsutils V:16, I:280 276 テスト::低レベル BIND によって提供されるネットワーククライアント: nslookup(8) と nsupdate(8) と dig(8)
dlint V:0, I:3 53 テスト::低レベル ネームサーバーの閲覧で DNS のゾーン情報をチェック
dnstracer V:0, I:1 59 テスト::低レベル DNS サーバーをその源流まで追跡

ホスト名の解決もまた、現在 NSS (ネームサービススイッチ、Name Service Switch) メカニズムによってサポートされています。この解決の流れは次です。

  1. "hosts: files dns" のようなスタンザのある "/etc/nsswitch.conf" ファイルがホスト名の解消の順序を規定します。(これは、"/etc/host.conf" ファイル中の "order" スタンザの機能を置換します。)

  2. files メソッドが最初に呼び出されます。ホスト名が "/etc/hosts" ファイルに見つかると、それに対応する全ての有効アドレスを返し終了します。("/etc/host.conf" ファイルは "multi on" を含みます。)

  3. dns メソッドが発動されます。"/etc/resolv.conf" ファイルで識別されるインターネットドメイン名システム (DNS) への問い合わせでホスト名が見つかれば、それに関する全ての有効アドレスを返します。

典型的なワークステーションでは、ホスト名は例えば "host_name" と設定され、オプショナルなドメイン名は空文字列に設定されてインストールされているかもしてません。その場合、"/etc/hosts" は以下のようになります。

127.0.0.1 localhost
127.0.1.1 host_name

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

各行は IP アドレス で始まり、関連する ホスト名がそれに続きます。

本例の2行目の IP アドレス 127.0.1.1 は他の Unix 系システムでは見かけないかもしれません。bug #719621 に記録されているように、Debian インストーラー は恒久的 IP アドレスのないシステムのために一部ソフトウェアー (GNOME等) のための回避策としてこの項目を作成します。

host_name は、"/etc/hostname" の中に定義されたホスト名と一致します(「ホスト名」参照)。

恒久的 IP アドレスを持つシステムでは 127.0.1.1 の代えてその恒久的 IP アドレスがここにあるべきです。

恒久的 IP アドレスと Domain 名システム (DNS)が提供する完全修飾ドメイン名 (FQDN) を持つシステムでは、その標準的な host_name(ホスト名).domain_name(ドメイン名)host_name(ホスト名) のみに代えて使われるべきです。

resolvconf パッケージがインストールされなかったら、"/etc/resolv.conf" は静的なファイルです。インストールされると、それはシンボリックリンクになります。いずれにせよ、解決機構を初期化する情報を含んでいます。もし DNS が IP="192.168.11.1" に見つかるなら、それは以下の内容です。

nameserver 192.168.11.1

resolvconf パッケージはこの "/etc/resolv.conf" をシンボリックリンクにし、フックスクリプトで自動的にその内容を管理します。

典型的 adhoc な LAN 環境にある PC ワークステーションの場合、基本的な filesdns 法に加えて Multicast DNS (mDNS) 経由でホスト名を解決する事ができます。

  • Avahi は Debian で Multicast DNS サービスの探索の枠組みを提供します。

  • Apple Bonjour / Apple Rendezvous と同等です。

  • libnss-mdns プラグインパッケージが GNU C ライブラリー (glibc) の GNU Name Service Switch (NSS) 機能に mDNS 経由のホスト名解決を提供します。

  • "/etc/nsswitch.conf" ファイルには "hosts: files mdns4_minimal [NOTFOUND=return] dns" のようなスタンザがあるべきです(他の設定は/usr/share/doc/libnss-mdns/README.Debianを参照下さい)。

  • ".local" で終わる 擬似-top-level domain が末尾についたホスト名は、IPv4 アドレス "224.0.0.251" か IPv6 アドレス "FF02::FB" から、マルチキャスト UDP パケット中の mDNS クエリーメッセージ送ることで解決されます。

[注記] 注記

ドメイン名システムにおける ジェネリックトップレベルドメイン (gTLD) の拡張が進行中です。LAN内のみで使うドメイン名を選ぶ際に名前衝突に注意が必要です。

[注記] 注記

systemd-resolved と合わせての libnss-resolve や、libnss-myhostname や、libnss-mymachine のようなパッケージを"/etc/nsswitch.conf" ファイル中の "hosts" 行上に対応するリスト項目を挙げて使用すると、上記で述べた伝統的なネットワーク設定はオーバーライドされるかもしれません。詳しくは、nss-resolve(8) や、systemd-resolved(8) や、nss-myhostname(8) や、nss-mymachines(8) を参照下さい。

systemd下の現代的な Debian デスクトップ環境では、ネットワークインターフェースは、lo が "networking.service" で、他のインターフェースが "NetworkManager.service" で典型的には初期化されます。

Debian では、NetworkManager (NM) (network-manager と関連パッケージ) 等の管理デーモン経由でネットワーク接続の管理ができます。

  • それらは洒落た GUI やコマンドラインのユーザーインターフェースが同梱されています。

  • それらにはバックエンドシステムとして、自前のデーモンが同梱されています。

  • それらによりあなたのシステムをインターネットへ容易に接続できます。

  • それらによりインターネットへの有線や無線のネットワークの管理が容易にできます。

  • それらにより旧来の "ifupdown" パッケージと独立にネットワークを設定できます。

[注記] 注記

サーバーにはこの様な自動ネットワーク設定を使わないで下さい。これらはラップトップ上のモービルデスクトップを主対象としています。

これらの現代的なネットワーク設定ツールは旧来の "ifupdown" パッケージやその "/etc/network/interfaces" 設定ファイルとの競合を避けるように適正に設定する必要があります。

Debian における NM の公式のドキュメンテーションは "/usr/share/doc/network-manager/README.Debian" にあります。

デスクトップのための現代的ネットワーク設定の要点は以下です。

  1. 以下のようにして、例えば foo というデスクトップユーザーを "netdev" グループに属するようにします。(GNOME や KDE のような現代的デスクトップ環境の下では D-bus 経由でそれを自動的にするのも一つの方法です。)

    $ sudo usermod -a -G foo netdev
  2. "/etc/network/interfaces" の設定を以下のようにできるだけ簡単にします。

    auto lo
    iface lo inet loopback
  3. 以下のようにして NM を再起動します。

    $ sudo systemctl restart network-manager
  4. GUI 経由でネットワークを設定します。

[注記] 注記

ifupdown との干渉を避けるために、NM は "/etc/network/interfaces" にリストされてないインターフェースのみを管理します。

[ヒント] ヒント

NM のネットワーク設定能力を拡張したい場合には、network-manager-openconnectnetwork-manager-openvpn-gnomenetwork-manager-pptp-gnomemobile-broadband-provider-infognome-bluetooth 等の適当なプラグインモジュールや補足パッケージを探して下さい。

上記とは異なり、systemd の下では、ネットワークは /etc/systemd/network/ を使って設定されているかもしれません。systemd-resolved(8) や resolved.conf(5) や systemd-networkd(8) を参照下さい。

これによりGUI無しの現代的なネットワーク設定ができます。

DHCP クライアントの設定は "/etc/systemd/network/dhcp.network" を作成することで設定できます。例えば:

[Match]
Name=en*

[Network]
DHCP=yes

静的ネットワーク設定は "/etc/systemd/network/static.network" を作成することで設定できます。例えば:

[Match]
Name=en*

[Network]
Address=192.168.0.15/24
Gateway=192.168.0.1

クラウドのための現代的なネットワーク設定は cloud-initnetplan.io パッケージを使っているかもしれません (「クラウドシステムの初期化」を参照下さい)。

netplan.io パッケージは ネットワーク設定バックエンドとして systemd-networkdNetworkManager をサポートし、宣言的な YAML データーを使ったネットワーク設定を可能にします。 YAMLを変更する時は:

  • "netplan generate" コマンドを実行して、YAMLからすべての必要なバックエンド設定を生成します。

  • "netplan apply" コマンドを実行して、生成される設定をバックエンドに適用します。

"Netplan ドキュメンテーション"netplan(5) と netplan-generate(8) と netplan-apply(8) を参照下さい。

更に、cloud-init がどのようにしてnetplan.io の設定を代替データーソースを使って一体化するのかは "Cloud-init ドキュメンテーション" (特に "設定ソース""Netplan パススルー") を参照下さい。

Linux における低水準のネットワークを設定するには iproute2 プログラム (ip(8)、…) を用います。

以下の低レベルネットワークコマンドは、ネットワーク設定を変更しないので安全に使えます。


[ヒント] ヒント

これらの低レベルネットワーク設定ツールは "/usr/sbin/" 中にあります。"/usr/sbin/ifconfig" 等のような完全コマンドパスを使うか、 "~/.bashrc" 中の "$PATH" リストに "/usr/sbin" を追加する必要があるかもしれません。

一般的なネットワークの最適化は本書の射程外です。ここでは消費者用の接続に関する課題にのみ触れます。


NM は普通最適の 最大送信単位 (MTU: Maximum Transmission Unit) を自動的に設定します。

場合によっては、ping(8) を "-M do" オプションとともに用いて多くのデーターパケットサイズの ICMP パケットを送る実験後 MTU を手動で設定したいと考えるかもしれません。MTU は IP フラグメンテーションを起こさずおくれる最大のデーターパケットサイズに IPv4 の場合は 28 バイト IPv6 の場合は 48 バイト足したものです。例えば以下では IPv4 接続の場合は 1460 と IPv6 接続の場合は 1500 と突き止めます。

$ ping -4 -c 1 -s $((1500-28)) -M do www.debian.org
PING  (149.20.4.15) 1472(1500) bytes of data.
ping: local error: message too long, mtu=1460

---  ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

$ ping -4 -c 1 -s $((1460-28)) -M do www.debian.org
PING  (130.89.148.77) 1432(1460) bytes of data.
1440 bytes from klecker-misc.debian.org (130.89.148.77): icmp_seq=1 ttl=50 time=325 ms

---  ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 325.318/325.318/325.318/0.000 ms
$ ping -6 -c 1 -s $((1500-48)) -M do www.debian.org
PING www.debian.org(mirror-csail.debian.org (2603:400a:ffff:bb8::801f:3e)) 1452 data bytes
1460 bytes from mirror-csail.debian.org (2603:400a:ffff:bb8::801f:3e): icmp_seq=1 ttl=47 time=191 ms

--- www.debian.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 191.332/191.332/191.332/0.000 ms

このプロセスはパス MTU (PMTU) 発見 (RFC1191) で、tracepath(8) コマンドで自動化できます。


これらの基本的なガイドラインに加えて、次を覚えておきます。

  • 何らかのトンネル手法 (VPN等) を使うと、それらのオーバーヘッドのために最適 MTU を更に減らすかもしれません。

  • MTU 値は実験的に決定される PMTU 値を越すべきではありません。

  • もし他の制約条件を満たすなら、MTU 値は一般的に大きい方がいいです。

最大セグメントサイズ (MSS) はパケットサイズの代替尺度として使われます。MSS と MTU の関係は次です。

  • IPv4 ではMSS = MTU - 40

  • IPv6 ではMSS = MTU - 60

[注記] 注記

iptables(8) (「Netfilter インフラ」を参照下さい) を使う最適化は MSS を使ってパッケットサイズを制約できるのでルーターとして有用です。iptables(8) 中の "TCPMSS" を参照下さい。

現代的な高帯域でレイテンシーの大きな WAN では、TCP のスループットは TCP バッファーサイズパラメーターを "TCP tuning" にある手順で調整することで最大化できます。今のところ現在の Debian のデフォールトは高速の 1G bps の FTTP サービスでつながっている私の LAN でも十分機能しています。

NetfilterLinux カーネルのモジュール (「カーネルモジュール初期化」を参照下さい) を利用するステートフルファイアーウォールネットワークアドレス変換 (NAT) のインフラを提供します。

表5.7 ファイアーウォールツールのリスト

パッケージ ポプコン サイズ 説明
nftables V:106, I:701 182 パケットフィルターと NAT のための管理ツール (Netfilter) ({ip,ip6,arp,eb}tables の後継)
iptables V:319, I:718 2414 netfilter の管理ツール(IPv4 用の iptables(8)、IPv6 用の ip6tables(8))
arptables V:0, I:1 100 netfilter の管理ツール(ARP 用の arptables(8))
ebtables V:14, I:29 276 netfilter の管理ツール(Ethernet ブリッジング用の ebtables(8))
iptstate V:0, I:2 119 netfilter の状態を常時モニター (top(1) と類似)
ufw V:55, I:77 859 Uncomplicated Firewall (UFW) netfilter ファイアーウォールの管理プログラム
gufw V:5, I:10 3660 Uncomplicated Firewall (UFW) 用のグラフィカル ユーザーインターフェース
firewalld V:11, I:16 2613 firewalld はネットワークゾーンをサポートする動的管理ファイアーウォールプログラム
firewall-config V:0, I:3 1163 firewalld 用のグラフィカル ユーザーインターフェース
shorewall-init V:0, I:0 88 Shoreline ファイアーウォール初期化
shorewall V:3, I:8 3090 Shoreline ファイアーウォールnetfilter 設定ファイル生成システム
shorewall-lite V:0, I:0 71 Shoreline ファイアーウォールnetfilter 設定ファイル生成システム (軽装備バージョン)
shorewall6 V:0, I:1 1334 Shoreline ファイアーウォールnetfilter 設定ファイル生成システム (IPv6 バージョン)
shorewall6-lite V:0, I:0 71 Shoreline ファイアーウォールnetfilter 設定ファイル生成システム (IPv6 軽装備バージョン)

netfilter のユーザー空間の主プログラムは iptables(8) です。シェルから対話形式で手動で netfilter を設定し、その状態を iptables-save(8) で保存し、iptables-restore(8) を使って init スクリプト経由でシステムのリブート時に回復できます。

shorewall のような設定ヘルパースクリプトはこの過程を簡単にします。

Netfilter Documentation (または "/usr/share/doc/iptables/html/" 中) の文書を参照下さい。

[ヒント] ヒント

これらは Linux 2.4 のために書かれたとはいえ、iptables(8) コマンドも netfilter カーネル機能も現在の Linux 2.63.x カーネルシリーズにもあてはまります。