Java プログラムで Linux 上のネットワーク構成を自動化:スクリプト+Socket APIで作る管理ツール

はじめに

Linux サーバのネットワーク構成を手動で設定するのは、運用負荷が高く、人的ミスを招きやすい作業です。
特に複数のサーバを管理する場合、ifconfigip コマンドを毎回実行して設定を反映するのは効率的ではありません。

本記事では、Java から Linux のネットワーク構成を自動化する方法を解説します。
具体的には、次の2つのアプローチを組み合わせた ハイブリッド管理ツール を作ります。

  • ① スクリプト連携:Java から Bash / Shell スクリプトを実行
  • ② Socket API 操作:Java 標準 API を使ってネットワーク設定を検証

これにより、「設定 → 検証 → ログ収集」までを自動化できます。


1. Linux ネットワーク設定の基本

Linux では以下のようなコマンドを使ってネットワーク設定を行います。

# IP アドレスの設定
sudo ip addr add 192.168.1.10/24 dev eth0

# ゲートウェイの設定
sudo ip route add default via 192.168.1.1

# DNS の設定
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

これらを Java プログラムから実行 すれば、自動化が実現します。


2. Java からシェルスクリプトを実行する方法

Java では ProcessBuilder クラスを使うことで、外部コマンドを呼び出せます。

以下はネットワーク設定スクリプトを実行する例です。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class NetworkConfigurator {

    public static void main(String[] args) {
        try {
            // 実行したいスクリプト
            String script = "/usr/local/bin/config_network.sh";

            ProcessBuilder pb = new ProcessBuilder("bash", script);
            pb.redirectErrorStream(true);
            Process process = pb.start();

            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            }

            int exitCode = process.waitFor();
            System.out.println("終了コード: " + exitCode);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ポイント

  • ProcessBuilder は標準出力とエラー出力をマージ可能
  • waitFor() でスクリプト完了を待機
  • sudo コマンドを使う場合、パスワード入力が必要なので、
    運用環境では NOPASSWD 設定(sudoers)を検討します。

3. Socket APIでネットワーク接続を検証する

設定変更後に 通信が有効か確認する仕組み を組み込むことで、
信頼性の高い自動化が実現します。

以下は、設定したネットワークが正しく通信できるかを確認する Java コード例です。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class NetworkVerifier {

    public static void main(String[] args) {
        String host = "8.8.8.8";  // Google DNS
        int port = 53;            // DNS port
        int timeout = 3000;       // 3秒タイムアウト

        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(host, port), timeout);
            System.out.println("ネットワーク接続成功!");
        } catch (IOException e) {
            System.out.println("接続に失敗しました: " + e.getMessage());
        }
    }
}

この検証で確認できること

  • ルーティング設定が正しいか
  • DNSサーバまで到達できるか
  • 外部通信ポートが開いているか

4. スクリプト+Socketの統合自動化

ここまでの機能を組み合わせて、ネットワーク設定から検証までを自動で行うツールを構築します。

public class NetworkManager {

    public static void main(String[] args) {
        NetworkConfigurator configurator = new NetworkConfigurator();
        NetworkVerifier verifier = new NetworkVerifier();

        // スクリプト実行
        configurator.runConfigScript("/usr/local/bin/config_network.sh");

        // 検証
        verifier.checkConnection("8.8.8.8", 53);
    }
}

class NetworkConfigurator {
    public void runConfigScript(String scriptPath) {
        try {
            ProcessBuilder pb = new ProcessBuilder("bash", scriptPath);
            pb.redirectErrorStream(true);
            Process process = pb.start();
            process.waitFor();
            System.out.println("ネットワーク設定完了。");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class NetworkVerifier {
    public void checkConnection(String host, int port) {
        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(host, port), 3000);
            System.out.println("通信テスト成功: " + host + ":" + port);
        } catch (IOException e) {
            System.out.println("通信テスト失敗: " + e.getMessage());
        }
    }
}

これで、1本の Java プログラムで以下を自動化できます

✅ IP 設定・ルート追加などのスクリプト実行
✅ 通信可能性の確認(Socket)
✅ 結果のログ出力


5. 応用:ログ解析と再設定ループ

ネットワークが不安定な場合は、自動再設定ループを組み込むと便利です。

for (int i = 0; i < 3; i++) {
    if (verifier.checkConnection("8.8.8.8", 53)) {
        break;
    } else {
        configurator.runConfigScript("/usr/local/bin/retry_network.sh");
    }
}

これにより、障害検知時に自動でリトライ処理を行えます。


6. セキュリティと運用上の注意

  • sudo コマンドの権限を最小化/etc/sudoers に限定的な権限を設定)
  • 実行ログを syslog へ転送logger コマンドや Logback 連携)
  • 設定ファイルの暗号化(Jasypt・Vault などを使用)

まとめ

この記事では、Java × Linux の連携によるネットワーク構成自動化を紹介しました。

項目技術要素
設定Bash スクリプト実行(ProcessBuilder)
検証Socket API による通信確認
拡張再設定ループ・ログ解析

これらを組み合わせれば、インフラ運用に強い Javaベースのネットワーク管理ツールを構築できます。
特に、Spring Boot + Linux コマンド実行を組み合わせることで、GUI付きの管理システムへ発展させることも可能です。

タイトルとURLをコピーしました