【问题标题】:Performing DHCP on linux using Java使用 Java 在 Linux 上执行 DHCP
【发布时间】:2012-09-11 20:24:07
【问题描述】:

我正在尝试在 java 中开发一个 DHCP 客户端应用程序,它可以在端口 68 上接收 DHCP 提供和确认,而无需以 root 身份运行。我知道绑定到端口

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

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

【问题讨论】:

  • 以 root 身份运行?你不能用 Java 绕过操作系统的限制(特别是不能用 Java,被解释等等)。也许Linux提供了一些绑定后“切换用户”的方式,但更多的是操作系统问题。
  • 我在尝试为 SNMP 陷阱绑定到端口 162 时遇到了类似的问题,但我设法找到了解决方法并让 snmpd 将陷阱路由到侦听端口 >1024 的应用程序.这也可以用 dhcpd 完成吗?
  • 是的,可以转发数据包。你可以通过两种方式做到这一点。您可以使用“-p”端口配置 DHCPD,以便它在 68 以外的端口上侦听和传输,或者您可以在两者之间使用dhcrelay。它会在任何端口上侦听和传输,同时让您的 DHCPd 在标准端口上侦听。

标签: java linux dhcp


【解决方案1】:

嗯,你的选择有点有限。

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

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

[编辑]

另外一件事 - 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 访问权限,恐怕你'运气不好。

【讨论】:

  • 那太好了!我不需要能够更改任何系统信息。我只需要能够接收报价和确认并在应用程序中处理它们。
  • 你能详细说明一下“过程”吗?我的意思是,DHCP 服务器不会单独向您发送报价。通常客户端发送一个 DHCP 请求,服务器尝试将其 MAC 地址与配置的主机和/或主机组匹配,然后发送一个提议。
  • 我需要能够执行完整的 DHCP 过程:发现、提供、请求、确认。我的应用程序处理 Discover 和 Request 部分,但如果没有 offer,请求显然无法完成。这就是我所说的“过程”。我与之通信的 DHCP 服务器也使用我还必须“处理”的自定义 DHCP 选项。希望对您有所帮助...
  • 我也在 Windows 上使用 C# 做过类似的事情,在 Windows 中没有端口绑定限制。现在我不得不使用 Java 制作一个 linux 版本。
  • 我仍然认为您“差一点” :) Discover、Request、Ack - 是客户端的事情。报价是服务器端的事情。客户不提供任何东西。 en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol 很好地描述了通信流程。
【解决方案2】:

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

【讨论】:

  • 嘿,酷。我想知道如果您将绑定到特权端口并使用setuid()/setgid(),内核是否会觉得没问题。
  • 还有其他选择吗?我已经编辑了我的问题以进一步澄清。至于切换用户,我不妨说服用户以 root 身份运行,但我宁愿不这样做。
  • @Shar1er80 如果你有类似 iptables 的东西,你可以使用 nat 表做一些路由到另一个端口,但我不知道确切的链是什么,类似于this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多