2

ルートとして実行せずにポート68でDHCPオファーとAcksを受信できるJavaでDHCPクライアントアプリケーションを開発しようとしています。1024未満のポートへのバインドに関するLinuxの制限を認識しています。どのようなオプションが利用できますか?

[編集]アプリケーションはDHCP検出と要求を送信できます。カスタムDHCPオプションを使用するDHCPサーバーからDHCPオファーとAcksを受信できる必要があります。DHCPプロセスが完了すると、アプリケーションはシステム情報を変更しませんが、「カスタム」アクションを実行します。

[編集]SNMPデーモンを設定する方法のように、受信したパケットをアプリケーションに転送するようにDHCPデーモンを設定する方法はありますか?

4

2 に答える 2

2

さて、あなたはあなたの場合の選択肢に少し制限があります。

RFCによると、クライアントとサーバーの両方が特権ポートでリッスンする必要があります。

その他のこと-DHCPクライアントは通常、IPアドレス、ドメイン名、ホスト名などのシステム情報を変更するため、クライアントがrootとして実行されない場合、達成できるのはオファーを受け取ることとその情報を使って何もしません。

[編集]

そしてもう1つ、DHCPサーバーはそれだけではオファーを送信しません。通常、クライアントはDHCP要求を送信し、サーバーはそのMACアドレスを構成済みのホストやホストグループに一致させようとしてから、オファーを送信します。

非特権ユーザー向けのDHCP実装を見つけました:http ://code.google.com/p/ndhcp/wiki/ClientREADME

特権を削除するために次のCコードを使用します。

void drop_root(uid_t uid, gid_t gid)
{
    if (uid == 0 || gid == 0) {
        log_line("FATAL - drop_root: attempt to drop root to root?\n");
        exit(EXIT_FAILURE);
    }

    if (getgid() == 0) {
        if (setregid(gid, gid) == -1) {
            log_line("FATAL - drop_root: failed to drop real gid == root!\n");
            exit(EXIT_FAILURE);
        }
    }

    if (getuid() == 0) {
        if (setreuid(uid, uid) == -1) {
            log_line("FATAL - drop_root: failed to drop real uid == root!\n");
            exit(EXIT_FAILURE);
        }
    }

    /* be absolutely sure */
    if (getgid() == 0 || getuid() == 0) {
        log_line("FATAL - drop_root: tried to drop root, but still have root!\n");
        exit(EXIT_FAILURE);
    }
}

この場合、JonLinの提案が機能するはずです。1つの注意点-rootとして開始する必要があり、後で非特権ユーザーに自動切り替えされると思います。したがって、rootアクセスがまったくない場合は、運が悪いと思います。

于 2012-09-11T20:30:29.777 に答える
1

あなたを助けるかもしれないApacheCommonsDaemonサービスがあります。これにより、ポート68にバインドするなどの特権のある操作を実行してから、非特権ユーザーに切り替えることができます。

于 2012-09-11T20:30:34.073 に答える