2

我正在尝试在 java 中开发一个 DHCP 客户端应用程序,该应用程序可以在端口 68 上接收 DHCP 提供和确认,而无需以 root 身份运行。我知道绑定到端口 <1024 的 linux 限制。有哪些可用选项?

[编辑] 应用程序可以发送 DHCP 发现和请求。它需要能够从使用自定义 DHCP 选项的 DHCP 服务器接收 DHCP 提供和确认。一旦 DHCP 过程完成,应用程序将不会修改任何系统信息,但它会执行“自定义”操作。

[编辑] 有没有办法配置 DHCP 守护程序以将接收到的数据包转发到应用程序,例如如何配置 SNMP 守护程序?

4

2 回答 2

2

好吧,在您的情况下,您的选择有点有限。

根据RFC,客户端和服务器都需要监听特权端口。

另一件事是 - DHCP 客户端通常会更改系统信息,例如 IP 地址、域名、主机名等,因此如果您的客户端不以 root 身份运行,它唯一能够实现的就是接收报价和acks 并且对这些信息无所作为。

[编辑]

还有一件事 - 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);
    }
}

我想 Jon Lin 的建议应该适用于这种情况。一个警告 - 我假设它需要以root 身份启动,然后会自动切换到非特权用户,所以如果你根本没有 root 访问权限,恐怕你不走运。

于 2012-09-11T20:30:29.777 回答
1

有一个Apache Commons Daemon服务可以帮助您。它允许您执行一些特权操作,例如绑定到端口 68,然后切换到非特权用户。

于 2012-09-11T20:30:34.073 回答