AlmaLinux 9 総合ガイド 第7章

第7章: ネットワーク設定と管理


7.1 NetworkManager の基本と操作(nmcli/nmtui)

AlmaLinux 9 ではネットワーク設定を一元管理するために NetworkManager が標準で導入されています。nmcli(コマンドラインインターフェース)と nmtui(テキストベースUI)を使い分けることで、サーバ環境から対話的な設定まで柔軟に対応可能です。本節ではそのしくみから基本操作、スクリプト自動化、トラブルシューティングまでを詳しく解説します。

7.1.1 NetworkManager の概要とアーキテクチャ

NetworkManager は D-Bus 経由で動作し、以下のコンポーネントで構成されます:

  • デーモン(NetworkManager):設定読み込みと管理を担当
  • プラグイン:keyfile(/etc/NetworkManager/system-connections/*.nmconnection)や ifcfg-rh などで既存設定と互換
  • コマンドラインツール:nmcli
  • テキストUI :nmtui

主設定ファイルは /etc/NetworkManager/NetworkManager.conf にあり、接続プロファイルは /etc/NetworkManager/system-connections/ 配下の各ファイルで定義されます。

7.1.2 設定ファイルの確認・編集

以下はデフォルト設定の一例です。変更後は systemctl restart NetworkManager を実行してください。

# 実行ユーザー:root または sudo
# /etc/NetworkManager/NetworkManager.conf の一部例

[main]                       # メイン設定セクションを開始
plugins=keyfile,ifcfg-rh     # keyfile と ifcfg-rh プラグインを有効化
dns=default                  # デフォルトの DNS 解決方法を使用

[logging]                    # ログ出力設定セクション
level=INFO                   # ログレベルを INFO に設定

7.1.3 nmcli を使った CLI 操作

自動化やリモート操作に適した nmcli の基本コマンドを紹介します。以下の操作には root または sudo 権限が必要です。実行後、指定した接続プロファイルが適用されます。

# デーモンの稼働状況を確認
nmcli general status                     # NetworkManager 全体のステータスを表示

# ネットワークデバイスの状態一覧
nmcli device status                      # デバイス名・タイプ・接続状態を一覧表示

# 既存接続プロファイルの一覧
nmcli connection show                    # 保存済みプロファイルを表示

# DHCP(動的IP)で接続を有効化
nmcli connection modify enp0s3 ipv4.method auto      # DHCP を有効化
nmcli connection up enp0s3                           # インターフェースを起動

# 静的IP の設定例
nmcli connection modify enp0s3 \
  ipv4.method manual \
  ipv4.addresses 192.168.10.50/24 \
  ipv4.gateway 192.168.10.1 \
  ipv4.dns "8.8.8.8 1.1.1.1"             # DNS サーバを指定
nmcli connection up enp0s3               # 設定を適用

# 新規接続プロファイルの作成(VLAN の例)
nmcli connection add type vlan con-name vlan100 dev enp0s3 id 100 \
  ipv4.method manual \
  ipv4.addresses 192.168.100.10/24          # VLAN 100 を設定
nmcli connection up vlan100                 # VLAN インターフェースを起動

7.1.4 nmtui を使った対話的操作

テキストUI nmtui は対話形式で簡単に設定できます。サーバを操作する際もキーボードだけで完結します。

# 実行ユーザー:root または sudo
dnf install -y NetworkManager-tui     # nmtui を含むパッケージをインストール
nmtui                                 # テキストベースのUIを起動
  • ✅ Edit a connection:接続プロファイルの作成・編集
  • ✅ Activate a connection:接続の有効化・無効化
  • ✅ Set system hostname:ホスト名の変更

7.1.5 nmcli スクリプトによる自動フェイルオーバー例

ネットワーク疎通を監視し、プライマリがダウンしたらバックアップへ切り替えるサンプルスクリプトです。

#!/usr/bin/env bash               # スクリプトを bash で実行
# 実行ユーザー:root または sudo
PRIMARY_CONN="enp0s3"             # プライマリ接続名を設定
BACKUP_CONN="enp0s8"              # バックアップ接続名を設定
PING_TARGET="8.8.8.8"             # 疎通チェック先を設定

# 疎通チェックを2回実行し、結果を無視なく判定
if ! ping -c 2 "$PING_TARGET" &>/dev/null; then
  nmcli connection up "$BACKUP_CONN"       # プライマリがダウン時にバックアップ接続を起動
else
  nmcli connection up "$PRIMARY_CONN"      # プライマリが正常時にプライマリ接続を起動
fi

7.1.6 トラブルシューティング

NetworkManager に関する代表的な問題と対処法をまとめます。

  • ログ確認:journalctl -u NetworkManager で詳細なエラーを確認
  • 権限エラー:sudo で実行しているか、D-Bus パーミッションを確認
  • SELinux 制約:setenforce 0 一時無効化後に再テスト(恒久的変更は非推奨)
  • D-Bus 応答なし:systemctl restart dbus 実行後に systemctl restart NetworkManager

7.2 IPアドレスとDNS設定

この節では、AlmaLinux 9環境でのIPv4/IPv6アドレス設定とDNS構成について、nmcliを用いたダイナミック・スタティック設定、/etc/hostsによるローカル名解決、さらにDNSキャッシュ構築までを詳しく解説します。

7.2.1 IPv4アドレス設定

サーバ用途では安定性重視の静的IP、クライアント用途ではDHCPによる動的IPが一般的です。

# 実行ユーザー:root または sudo
# インターフェース名を確認して、後続コマンドで使用する
nmcli device status               # デバイス名・タイプ・状態を一覧表示

# 【動的IP設定】DHCPでアドレスを自動取得
nmcli connection modify enp0s3 ipv4.method auto      # DHCPを有効化
nmcli connection up enp0s3                           # インターフェースを起動

# 【静的IP設定】例:192.168.10.50/24 を割当
nmcli connection modify enp0s3 \
  ipv4.method manual \                             # 手動設定モードに切替
  ipv4.addresses 192.168.10.50/24 \                # IPアドレスとネットマスク指定
  ipv4.gateway 192.168.10.1 \                      # デフォルトゲートウェイ設定
  ipv4.dns "8.8.8.8 1.1.1.1"                       # DNSサーバをスペース区切りで指定
nmcli connection up enp0s3                         # 設定を反映して再起動

7.2.2 IPv6アドレス設定

IPv6はSLAAC・手動・DHCPv6の3方式があります。用途に応じて使い分けましょう。

# 実行ユーザー:root または sudo
# 【SLAAC】自動アドレス割当を有効化
nmcli connection modify enp0s3 ipv6.method auto     # SLAACを有効化
nmcli connection up enp0s3                          # インターフェースを再起動

# 【手動設定】例:2001:db8:1::5/64 を割当
nmcli connection modify enp0s3 \
  ipv6.method manual \                            # 手動設定モードに切替
  ipv6.addresses 2001:db8:1::5/64 \               # IPv6アドレスとプレフィックス指定
  ipv6.gateway 2001:db8:1::1                      # IPv6デフォルトゲートウェイ設定
nmcli connection up enp0s3                        # 設定を反映して再起動

# 【DHCPv6】動的にアドレス取得を有効化
nmcli connection modify enp0s3 ipv6.method dhcp     # DHCPv6を有効化
nmcli connection up enp0s3                          # インターフェースを再起動

7.2.3 DNS設定(nmcli経由)

NetworkManagerはデフォルトで/etc/resolv.conf/run/NetworkManager/resolv.confへリンクします。直接編集せず、必ずnmcli経由で設定しましょう。

# 実行ユーザー:root または sudo
# 現在のDNS設定を確認
nmcli connection show enp0s3 | grep dns       # DNS関連設定のみ表示

# 【IPv4用DNS設定】カスタムDNSを指定してDHCP提供のDNSを無視
nmcli connection modify enp0s3 \
  ipv4.dns "8.8.4.4 9.9.9.9" \                # DNSサーバをスペース区切りで指定
  ipv4.ignore-auto-dns yes                    # DHCP配布のDNS設定を無視
nmcli connection up enp0s3                    # 設定を反映して再起動

# 【IPv6用DNS設定】IPv6 DNSを指定してDHCPv6配布のDNSを無視
nmcli connection modify enp0s3 \
  ipv6.dns "2001:4860:4860::8888" \           # IPv6 DNSサーバを指定
  ipv6.ignore-auto-dns yes                    # DHCPv6配布のDNS設定を無視
nmcli connection up enp0s3                    # 設定を反映して再起動

7.2.4 /etc/hosts を使ったローカル名解決

小規模ネットワークや開発環境では/etc/hostsに静的エントリを追加して、簡易的に名前解決を行えます。

# 実行ユーザー:root
# ホストエントリをファイル末尾に追記
echo "10.0.0.10  web01.localdomain  web01" >> /etc/hosts     # IPとFQDN、エイリアスを指定
# 追記内容を即座に確認
getent hosts web01.localdomain     # getentで名前解決結果を表示

7.2.5 dnsmasqプラグインによるDNSキャッシュ構築

大量の名前解決が必要な環境では、dnsmasqを用いたキャッシュDNSサーバをNetworkManager経由で簡単に構築できます。

# 実行ユーザー:root または sudo
# NetworkManager.confにdnsmasqプラグインを有効化
echo -e "[main]\ndns=dnsmasq" >> /etc/NetworkManager/NetworkManager.conf     # dnsmasqを指定

# dnsmasq用の詳細設定ファイルを作成
cat << 'EOF' > /etc/NetworkManager/dnsmasq.d/nm-dns.conf     # dnsmasq設定を記述
cache-size=1000               # キャッシュエントリ数を1000に設定
listen-address=127.0.0.1      # ローカル127.0.0.1でリッスン
EOF                           # ヒアドキュメントの終了を示す

# NetworkManagerを再起動してプラグインを読み込み
systemctl restart NetworkManager     # NetworkManagerを再起動して設定を反映

最後に systemctl status NetworkManagerresolvectl status で、設定が正しく反映されているか確認してください。

  • ✅ DHCP/静的IPv4の切替方法
  • ✅ SLAAC/手動/DHCPv6によるIPv6設定
  • nmcli経由でのDNSカスタマイズ
  • /etc/hostsによる手軽な名前解決
  • ✅ dnsmasqプラグインでのDNSキャッシュ構築

7.3 firewalld によるセキュリティ設定

AlmaLinux 9 では、iptables のフロントエンドとして firewalld が標準採用されています。ゾーンベースで動的にファイアウォールを管理でき、サービス単位や IP アドレス単位、リッチルールでの細かな制御が可能です。本節では firewalld のアーキテクチャからゾーン管理、リッチルール、NAT/ポートフォワーディング、SELinux 連携までを網羅的に解説します。

7.3.1 firewalld の基本とアーキテクチャ

firewalld は D-Bus 経由で操作できるデーモンで、iptables(または nftables)ルールを自動生成します。以下の特徴を持ちます:

  • ゾーン(zone)ごとの許可設定でインターフェースを論理的に分類
  • サービス(service)定義により、複数ポート/プロトコルをひとまとめに管理
  • リッチルール(rich rule)で、条件付き許可やログ出力、帯域制限など高度制御が可能
  • ランタイム(–permanent なし)と永続(–permanent 指定)設定の切り替え
# 実行ユーザー:root または sudo
# firewalld サービスの稼働状況を確認
systemctl status firewalld              # firewalld の状態を表示

# firewalld が有効でなければ開始&有効化
systemctl enable --now firewalld       # 起動&ブート時自動起動を設定

7.3.2 ゾーン管理とサービス許可

ゾーンは trust、public、internal、dmz など目的別に予め用意されています。各インターフェースを適切なゾーンに割り当て、サービス単位で許可設定を行います。

# 利用可能なゾーン一覧を表示
firewall-cmd --get-zones               # 全ゾーン名を一覧表示

# 現在のデフォルトゾーンを確認
firewall-cmd --get-default-zone        # デフォルトゾーン名を表示

# インターフェース enp0s3 を public ゾーンに割り当て(永続設定)
firewall-cmd --permanent \
  --zone=public \
  --change-interface=enp0s3            # enp0s3 を public ゾーンに設定

# public ゾーンで HTTP/HTTPS サービスを許可(永続設定)
firewall-cmd --permanent \
  --zone=public \
  --add-service=http                  # HTTP(ポート 80)を許可
firewall-cmd --permanent \
  --zone=public \
  --add-service=https                 # HTTPS(ポート 443)を許可

# 設定を反映
firewall-cmd --reload                 # 永続設定を適用して再読み込み

# ゾーンごとの詳細設定を確認
firewall-cmd --zone=public --list-all # public ゾーンの許可情報を表示

7.3.3 リッチルールによる高度制御

サービス単位の許可では対応できない条件付き制御やログ出力は、リッチルールで実現します。

# 特定サブネットからのみ SSH(ポート22)を許可(永続設定)
firewall-cmd --permanent \
  --add-rich-rule='rule family="ipv4" \
    source address="192.168.1.0/24" \
    service name="ssh" accept'          # 192.168.1.0/24 からの SSH を許可

# SSH アクセス失敗時にログを出力するルールを追加
firewall-cmd --permanent \
  --add-rich-rule='rule family="ipv4" \
    service name="ssh" log prefix="SSH-DROP: " level="warning" \
    drop'                               # SSH ドロップを警告レベルでログ

# 帯域制限(フィルタリング)例:ポート 80 へのアクセスを制限
firewall-cmd --permanent \
  --add-rich-rule='rule family="ipv4" \
    protocol value="tcp" port port="80" protocol="tcp" \
    limit value="10/m" accept'         # HTTP へのリクエストを毎分 10 回に制限

# 設定を反映
firewall-cmd --reload                  # 永続設定を適用して再読み込み

# 動作確認:リッチルール一覧を表示
firewall-cmd --list-rich-rules          # 設定済みリッチルールを表示

7.3.4 NAT/ポートフォワーディング

外部ネットワークと内部ネットワーク間で NAT(マスカレード)やポートフォワーディングを設定し、セキュアなアクセス環境を構築します。

# マスカレード(SNAT)を有効化(永続設定)
firewall-cmd --permanent \
  --zone=external \
  --add-masquerade                  # external ゾーンでマスカレードを有効化

# ポートフォワーディング:外部ポート 8080 → 内部ホスト 10.0.0.10:80
firewall-cmd --permanent \
  --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=10.0.0.10

# 設定を反映
firewall-cmd --reload                # 永続設定を適用して再読み込み

# 確認:フォワード設定を表示
firewall-cmd --zone=external --list-forward-ports  # ポート転送設定を表示

7.3.5 SELinux 連携とトラブルシューティング

注意:firewalld 側で許可していても、SELinux ポリシーが原因で通信が拒否される場合があります。audit2allowsemanage port コマンドで適切にポートラベルを設定してください。
# SELinux の一時無効化(テスト用。恒久的変更は非推奨)
setenforce 0                           # SELinux を Permissive モードに設定

# audit.log から今後必要な許可ルールを抽出
ausearch -m avc -ts recent | audit2allow -M mypol    # audit2allow でモジュール作成
semodule -i mypol.pp                                 # ポリシーモジュールを導入

# カスタムポート利用時のラベル付与例(非標準 HTTP ポート 8080)
semanage port -a -t http_port_t -p tcp 8080          # ポート8080を http_port_t に設定

# SELinux モードを Enforcing に戻す
setenforce 1                                         # SELinux を Enforcing モードに設定
💡 補足:最終的な設定確認には firewall-cmd --list-all-zonessemanage port -l コマンドを活用し、意図した通りにファイアウォールと SELinux が連携しているかチェックしましょう。

7.4 VPN構築(OpenVPN/WireGuard)

この節では、代表的なVPNソリューションであるOpenVPNWireGuardを、AlmaLinux 9環境でゼロから構築する手順を詳しく解説します。認証方式や暗号化設定、ネットワーク設定、サービス起動まで、公式ドキュメントの推奨設定を踏まえつつ、初心者~中級者にもわかりやすくまとめています。

7.4.1 OpenVPN

OpenVPNは成熟したTLSベースのVPNで、証明書による認証と強力な暗号化を特徴とします。本手順ではEasy-RSA v3を用いてPKIを構築し、サーバ・クライアント設定を行います。

この操作はrootまたはsudo権限で実行してください。Easy-RSAおよびopenvpnパッケージがインストール済みであることが前提です。実行後、TLS認証とAES-256-GCM暗号化を用いたOpenVPNサーバが起動し、クライアント接続を受け付けます。

# Easy-RSA と OpenVPN をインストール
dnf install -y epel-release openvpn easy-rsa    # EPELリポジトリ追加とOpenVPN、Easy-RSAを導入

# PKIディレクトリの初期化
make-cadir /etc/openvpn/easy-rsa                # Easy-RSAワークディレクトリを作成
cd /etc/openvpn/easy-rsa                        # 作業ディレクトリに移動

# 変数設定(CA名や有効期限など)
cat << 'EOF' > vars                             # varsファイルに設定を記述
set_var EASYRSA_REQ_CN      "OpenVPN-CA"        # CAの共通名を設定
set_var EASYRSA_KEY_SIZE    2048                # RSA鍵長を2048bitに設定
set_var EASYRSA_ALGO        rsa                 # アルゴリズムをRSAに設定
set_var EASYRSA_CA_EXPIRE   3650                # CA証明書の有効期限(10年)を設定
set_var EASYRSA_CERT_EXPIRE 825                 # サーバ証明書の有効期限(約2.25年)を設定
EOF                                             # varsファイル書き込み終了

# PKIの構築とCAの生成
./easyrsa init-pki                             # PKIディレクトリを初期化
./easyrsa build-ca nopass                      # パスフレーズなしでCAを発行

# サーバ証明書・鍵とDiffie-Hellmanパラメータを生成
./easyrsa gen-req server nopass                # サーバ用CSRと秘密鍵を生成
./easyrsa sign-req server server               # CSRに自己署名してサーバ証明書を作成
./easyrsa gen-dh                               # Diffie-Hellmanパラメータを生成
openvpn --genkey --secret ta.key               # TLS認証用の静的キー(HMAC)を生成

# サーバ設定ファイルの作成
cat << 'EOF' > /etc/openvpn/server.conf         # server.confを作成・編集
port 1194                                       # OpenVPNの待ち受けポート
proto udp                                       # UDPプロトコルを使用
dev tun                                         # TUNデバイスを利用
ca   /etc/openvpn/easy-rsa/pki/ca.crt           # CA証明書のパス
cert /etc/openvpn/easy-rsa/pki/issued/server.crt     # サーバ証明書のパス
key  /etc/openvpn/easy-rsa/pki/private/server.key    # サーバ秘密鍵のパス
dh   /etc/openvpn/easy-rsa/pki/dh.pem           # DHパラメータのパス
tls-auth /etc/openvpn/ta.key 0                  # HMACによるTLS認証を有効化
cipher AES-256-GCM                              # 暗号化方式にAES-256-GCMを指定
auth SHA256                                     # HMAC認証にSHA256を指定
server 10.8.0.0 255.255.255.0                   # クライアント用仮想ネットワークを定義
ifconfig-pool-persist ipp.txt                   # クライアントIP割当の永続化
push "redirect-gateway def1 bypass-dhcp"        # 全トラフィックをVPN経由にルーティング
push "dhcp-option DNS 8.8.8.8"                  # クライアントにDNSを通知
keepalive 10 120                                # 生存確認インターバルを設定
user nobody                                     # セキュリティ向上のためnobodyユーザーで動作
group nogroup                                   # セキュリティ向上のためnogroupグループで動作
persist-key                                     # サーバ鍵の再読み込みを抑制
persist-tun                                     # TUNインターフェースの再生成を抑制
status /var/log/openvpn/status.log              # 状態ログの保存先
log    /var/log/openvpn/server.log              # メインログの保存先
verb   3                                        # ログの冗長度を設定(3:情報量中程度)
EOF                                             # server.conf作成終了

# IPフォワードとファイアウォール設定
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-openvpn.conf  # IPフォワードを有効化
sysctl --system                                            # sysctl設定を反映
firewall-cmd --permanent --add-service=openvpn             # firewalldでOpenVPNサービスを許可
firewall-cmd --permanent --add-masquerade                  # マスカレード(SNAT)を有効化
firewall-cmd --reload                                      # 設定を再読み込み

# サーバ起動と自動起動設定
systemctl enable --now openvpn-server@server               # サービスを開始&ブート時自動起動設定

# クライアント証明書の生成例(client1)
cd /etc/openvpn/easy-rsa                                   # Easy-RSAディレクトリに移動
./easyrsa gen-req client1 nopass                           # クライアントCSRと秘密鍵を生成
./easyrsa sign-req client client1                          # CSRに署名してクライアント証明書を作成

# クライアント設定ファイルの雛形作成
cat << 'EOF' > /etc/openvpn/client1.ovpn                   # クライアント用設定ファイルを作成
client                                                     # クライアントモードを指定
dev tun                                                    # TUNデバイスを利用
proto udp                                                  # UDPプロトコルを使用
remote your.server.domain 1194                             # サーバアドレスとポートを指定
resolv-retry infinite                                      # DNS解決のリトライ設定
nobind                                                     # 任意のローカルポートを使用
persist-key                                                # 鍵の再読み込みを抑制
persist-tun                                                # TUNインターフェースの再生成を抑制
                                                       # 以下にCA証明書を埋め込む
$(cat /etc/openvpn/easy-rsa/pki/ca.crt)

                                                     # 以下にクライアント証明書を埋め込む
$(cat /etc/openvpn/easy-rsa/pki/issued/client1.crt)

                                                      # 以下にクライアント鍵を埋め込む
$(cat /etc/openvpn/easy-rsa/pki/private/client1.key)

                                                 # 以下にta.keyを埋め込む
$(cat /etc/openvpn/ta.key)

key-direction 1                                            # ta.keyの方向を指定
cipher AES-256-GCM                                         # 暗号化方式をクライアント側でも指定
auth SHA256                                                # 認証方式をクライアント側でも指定
verb 3                                                     # ログの冗長度を指定(3:情報量中程度)
EOF                                                        # client1.ovpn作成終了

7.4.2 WireGuard

WireGuardはシンプルで高速なカーネルベースVPNです。公式ドキュメント推奨のwg-quickを利用し、最小構成でセキュアなVPNを構築します。

この操作はrootまたはsudo権限で実行してください。wireguard-toolsがインストール済みである必要があります。実行後、wg0インターフェースが立ち上がり、クライアントとの秘密鍵ベースのピア認証が動作します。

# WireGuard ツールをインストール
dnf install -y epel-release wireguard-tools    # EPELリポジトリとWireGuardツールを導入

# サーバ鍵・クライアント鍵の生成
umask 077                                      # 秘密鍵を安全に生成するためパーミッションを制限
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key  # サーバ用の鍵ペアを生成

wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key  # クライアント用の鍵ペアを生成

# WireGuard設定ファイルの作成
cat << 'EOF' > /etc/wireguard/wg0.conf           # wg0インターフェース設定を作成
[Interface]
Address = 10.10.0.1/24                           # サーバ側VPNネットワークのアドレスを指定
ListenPort = 51820                               # WireGuardの待ち受けポートを指定
PrivateKey = $(cat /etc/wireguard/server_private.key)  # サーバ秘密鍵を読み込み

PostUp = sysctl -w net.ipv4.ip_forward=1 && \
         firewall-cmd --add-masquerade --zone=public    # インターフェース起動時にIPフォワードとマスカレードを有効化
PostDown = firewall-cmd --remove-masquerade --zone=public && \
           sysctl -w net.ipv4.ip_forward=0             # インターフェース停止時に設定を元に戻す

[Peer]
PublicKey = $(cat /etc/wireguard/client_public.key)     # クライアント公開鍵を読み込み
AllowedIPs = 10.10.0.2/32                              # クライアントに割り当てるIPを指定
EOF                                                   # wg0.conf作成終了

# サーバ設定の起動と自動起動設定
chmod 600 /etc/wireguard/wg0.conf                     # 設定ファイルのパーミッションを制限
systemctl enable --now wg-quick@wg0                   # wg-quickサービスを開始&自動起動設定

# クライアント設定ファイルの雛形作成
cat << 'EOF' > ~/client-wg0.conf                       # クライアント用設定ファイルを作成
[Interface]
PrivateKey = $(cat /etc/wireguard/client_private.key)  # クライアント秘密鍵を読み込み
Address = 10.10.0.2/32                                 # クライアント側VPNアドレスを指定
DNS = 8.8.8.8                                          # クライアントが利用するDNSを指定

[Peer]
PublicKey = $(cat /etc/wireguard/server_public.key)    # サーバ公開鍵を読み込み
Endpoint = your.server.domain:51820                   # サーバアドレスとポートを指定
AllowedIPs = 0.0.0.0/0                                # 全トラフィックをVPN経由にルーティング
PersistentKeepalive = 25                             # NAT環境下でのキープアライブ間隔を設定
EOF                                                   # client-wg0.conf作成終了
💡 補足:WireGuardはシンプルな構成ながら、高速かつ低レイテンシを実現します。クライアント追加時は鍵ペアとAllowedIPsの設定をサーバのwg0.confに追記し、wg syncconf wg0 <(wg-quick strip wg0)で動的反映が可能です。

7.5 ブリッジ・ボンディング・VLAN 設定

この節では、物理インターフェースを論理的に組み合わせる ブリッジボンディング、および VLAN タグ付けによる仮想ネットワーク化を、nmcli を使って AlmaLinux 9 上で構築する手順を詳しく解説します。

7.5.1 ブリッジ設定

ブリッジは複数インターフェースを L2 スイッチのように振る舞わせ、仮想マシンやコンテナ間で同一ネットワークを共有するときに有効です。


# 実行ユーザー:root または sudo
# ブリッジインターフェース br0 を作成
nmcli connection add type bridge \
  con-name br0 \
  ifname br0                              # br0 という名前で bridge を作成

# 物理インターフェース enp0s3 をブリッジのスレーブとして追加
nmcli connection add type bridge-slave \
  con-name br-slave-enp0s3 \
  ifname enp0s3 \
  master br0                              # enp0s3 を br0 に参加

# ブリッジを起動して動作を確認
nmcli connection up br0                   # br0 インターフェースを有効化
nmcli connection up br-slave-enp0s3       # スレーブインターフェースを有効化

7.5.2 ボンディング設定

ボンディング(リンクアグリゲーション)は、複数の物理回線を束ねて冗長性・帯域幅向上を実現します。代表的なモードは active-backup(冗長化)と 802.3ad(LACP)です。

# 実行ユーザー:root または sudo
# ボンディングインターフェース bond0 を active-backup モードで作成
nmcli connection add type bond \
  con-name bond0 \
  ifname bond0 \
  mode active-backup                    # アクティブ/バックアップ冗長化モードを指定

# スレーブインターフェースを bond0 に追加(例:enp0s3, enp0s4)
nmcli connection add type bond-slave \
  con-name bond-slave-enp0s3 \
  ifname enp0s3 \
  master bond0                           # enp0s3 を bond0 に参加
nmcli connection add type bond-slave \
  con-name bond-slave-enp0s4 \
  ifname enp0s4 \
  master bond0                           # enp0s4 を bond0 に参加

# ボンディングを起動して状態を確認
nmcli connection up bond0                # bond0 インターフェースを有効化

# ※ LACP(802.3ad) を利用する場合は、mode と lacp-rate を指定
nmcli connection modify bond0 \
  bond.options "mode=802.3ad,miimon=100,lacp_rate=fast"  # LACP+ヘルスチェック設定
nmcli connection up bond0                # 設定適用のため再起動

7.5.3 VLAN 設定

VLAN タグ付きインターフェースを作成することで、物理回線上で複数ネットワークを論理的に分離できます。スイッチ側のトランク設定が必要です。

注意:VLAN を利用するには、接続先スイッチで該当ポートをトランクモードに設定し、タグ VLAN ID を許可しておく必要があります。
# 実行ユーザー:root または sudo
# VLAN 100 を bond0 上に作成し、静的IPを割り当てる例
nmcli connection add type vlan \
  con-name vlan100 \
  dev bond0 \
  id 100 \
  ipv4.method manual \
  ipv4.addresses 192.168.100.10/24       # VLAN100 に IP:192.168.100.10/24 を設定

# VLAN インターフェースを起動
nmcli connection up vlan100              # vlan100 インターフェースを有効化

# VLAN 接続状況を確認
nmcli connection show vlan100            # vlan100 の詳細情報を表示
💡 補足:複数 VLAN をまとめて trunk する場合、bondbridgevlan の組み合わせで柔軟にネットワーク設計が可能です。例えば、bond0 上に br0 を作成し、その上で複数の VLAN インターフェースを配置する構成も検討してください。

7.6 ネットワークトラブルシューティング

ネットワークに問題が発生した際、原因を迅速に特定し解決するための代表的な手順とコマンドを紹介します。AlmaLinux 9標準のツールを駆使し、物理層からアプリケーション層まで順を追って診断する方法を詳述します。

7.6.1 基本疎通確認(ICMP)

まずは最も基本となる疎通確認を行います。

# 実行ユーザー:任意(pingは特権不要)
# リモートホストへのICMP疎通を4回試行
ping -c 4 8.8.8.8     # Google DNSサーバまでの往復時間を計測

# ホスト名解決と合わせて疎通確認
ping -c 4 example.com     # DNS解決→ICMP疎通を連続で実行

7.6.2 経路追跡(Traceroute/Tracepath)

通信経路と中継ノードの遅延を確認します。

# 実行ユーザー:root または sudo(特権ポートを使う場合)
# tracerouteで最大ホップ数30、UDPプローブを使用
traceroute -m 30 -U example.com     # 各ホップのIPと遅延を表示

# tracepathでパーミッション不要かつ自動でMTU探査
tracepath example.com               # 経路と最適MTUを表示

7.6.3 インターフェース・ルーティング確認

ネットワークインターフェースとルーティングテーブルの状態を確認します。

# 実行ユーザー:root または sudo
# インターフェース情報とアドレスを一覧表示
ip addr show                # 各インターフェースのIPと状態を表示

# ルーティングテーブルを表示
ip route show               # デフォルトゲートウェイやネットワークルートを表示

# IPv6ルート確認
ip -6 route show            # IPv6のルーティング情報を表示

7.6.4 ポート・サービス確認(ss)

TCP/UDPポートやソケットの状態を調べ、サービスがリスン中かを確認します。

# 実行ユーザー:root または sudo
# TCPリスン中のソケットを一覧表示
ss -tln                      # -t TCP / -l リスン / -n 数値で表示

# UDPリスン中ソケットを確認
ss -uln                      # -u UDP / -l リスン / -n 数値で表示

# 特定ポートのプロセス確認(例:ポート80)
ss -tlnp 'sport = :80'       # ポート80を使うプロセス情報を表示

7.6.5 パケットキャプチャ(tcpdump)

ネットワーク上を流れるパケットをキャプチャし、問題箇所を解析します。

# 実行ユーザー:root または sudo
# インターフェースenp0s3の全パケットをキャプチャしファイル保存
tcpdump -i enp0s3 -w /tmp/capture.pcap     # pcap形式で/​tmpに保存

# キャプチャした内容をリアルタイムで表示
tcpdump -i enp0s3 -nnvv               # -nn 数値表示 / -vv 詳細度高

# フィルタリング例:TCPポート443のみ
tcpdump -i enp0s3 tcp port 443        # ポート443のTLS/SSLパケットを抽出

7.6.6 DNSトラブル診断

DNS解決に問題がある場合、digやhostコマンドで詳細を調べます。

# 実行ユーザー:任意
# 標準DNSサーバへのクエリ
dig @8.8.8.8 example.com A +noall +answer  # Aレコードを簡潔に表示

# MXレコードを確認
dig example.com MX +short                  # MXレコードのホスト名一覧

# hostコマンドによる簡易解決チェック
host example.com                           # デフォルトDNSで名前解決

7.6.7 ログとサービス状況確認

NetworkManagerやfirewalldなどのログを確認し、異常を検出します。

# 実行ユーザー:root または sudo
# NetworkManagerの直近100行ログ
journalctl -u NetworkManager -n 100      # 最新100行を表示

# firewalldのログレベルとステータス確認
journalctl -u firewalld -n 50            # 最新50行を表示

# システム全体のログからエラーを抽出
journalctl -p err -b                     # 起動以降のERRORレベルログを表示

7.6.8 自動診断スクリプト例

上記のチェックをまとめて実行し、ログに出力するスクリプト例です。

#!/usr/bin/env bash                  # スクリプトをbashで実行
# 実行ユーザー:root または sudo
LOGDIR="/var/log/net-troubleshoot"      # ログ格納ディレクトリを設定
mkdir -p "$LOGDIR"                      # ディレクトリを作成

echo "=== ping ===" > "$LOGDIR/ping.log"        # ping結果ログ開始
ping -c 4 8.8.8.8 >> "$LOGDIR/ping.log"         # ICMP疎通をログに追記

echo "=== traceroute ===" > "$LOGDIR/trace.log"        # traceroute結果ログ開始
traceroute -m 20 example.com >> "$LOGDIR/trace.log"    # 経路追跡結果を追記

echo "=== interfaces ===" > "$LOGDIR/ip.log"    # インターフェース情報ログ開始
ip addr show >> "$LOGDIR/ip.log"                # IPアドレス情報を追記
ip route show >> "$LOGDIR/ip.log"               # ルーティング情報を追記

echo "=== services ===" > "$LOGDIR/ss.log"      # ソケット情報ログ開始
ss -tlnp >> "$LOGDIR/ss.log"                    # TCPリスン中プロセスを追記

echo "=== dns ===" > "$LOGDIR/dns.log"          # DNS診断ログ開始
dig @127.0.0.1 example.com +short >> "$LOGDIR/dns.log"    # ローカルDNSで解決を追記

echo "=== logs ===" > "$LOGDIR/journal.log"     # システムログログ開始
journalctl -p err -b | head -n 100 >> "$LOGDIR/journal.log"    # ERRORレベルを追記

echo "ネットワーク診断が完了しました。ログは $LOGDIR 配下を確認してください。"  # 完了メッセージ
💡 補足:定期実行にはcronやsystemdタイマーで本スクリプトをスケジュールすると、自動的にネットワーク異常を検知・ログ化できます。

7.7 学習のまとめ

本章で扱った主要トピックを振り返り、AlmaLinux 9上でのネットワーク設定と管理におけるポイントを整理します。初心者~中級者向けに「何を」「なぜ」「どうやって」の流れを踏まえつつ、確実に理解できるようにまとめました。

  • NetworkManager(nmcli/nmtui)
    • nmcliでスクリプトや自動化が可能。接続一覧、状態確認、静的/動的IP設定、VLAN作成などをCLIで完結
    • nmtuiでTUI形式の対話的操作。接続プロファイル編集やホスト名変更が容易
  • IPアドレスとDNS設定
    • IPv4はDHCP(auto)/静的(manual)をnmcliで切替え
    • IPv6はSLAAC(auto)、手動(manual)、DHCPv6(dhcp)を使い分け
    • DNSはnmcli経由で設定。/etc/resolv.confは直接編集しない
    • /etc/hostsでローカル名解決を補助、dnsmasqプラグインでキャッシュDNS構築も可能
  • firewalldによるセキュリティ設定
    • ゾーン管理(public, internal, dmz等)でインターフェースを分類
    • サービス許可(--add-service)、リッチルールで条件付き制御やログ出力、帯域制限
    • NAT/ポートフォワーディング(--add-masquerade, --add-forward-port)で内部ネットワーク公開
    • SELinux連携時はaudit2allowやsemanageでポートラベルを調整
  • VPN構築(OpenVPN/WireGuard)
    • OpenVPNはEasy-RSAでPKIを構築し、TLS/AES-256-GCMとHMACで強固な認証・暗号化
    • WireGuardはカーネルモジュールベースで高速・シンプル。wg-quickで鍵生成、インターフェース管理
    • 両者ともsysctlでIPフォワード有効化、firewalldでポート許可・マスカレードを設定
  • ブリッジ・ボンディング・VLAN設定
    • bridgeはL2スイッチとして複数インターフェースを統合
    • bondはactive-backupや802.3ad(LACP)で冗長性・帯域拡張を実現
    • VLANで物理ネットワークを論理分割し、trunk設定と組み合わせた柔軟な設計が可能
  • ネットワークトラブルシューティング
    • ping/traceroute/tracepathで疎通と経路を確認
    • ip addr/route、ssでインターフェース・ソケット状態をチェック
    • tcpdumpでパケットキャプチャ、dig/hostでDNS解析
    • journalctlでNetworkManagerやfirewalldのログを分析
    • 診断スクリプトをcronやsystemdタイマーで定期実行し、自動ログ化も可能