为什么 dhclient 说:“SIOCSIFADDR:权限被拒绝”?

为什么 dhclient 说:“SIOCSIFADDR:权限被拒绝”?

我在 ubuntu-server (8.04) 上遇到了一个非常奇怪的错误,我不知道为什么不允许 dhclient 设置网络设置!我不是第一个安装服务器的人,所以我对设置不太了解。该服务器仅用作防火墙/网关(自定义 iptables 脚本),它有三个网卡,一个用于互联网,一个用于 LAN,一个用于 DMZ。现在 ISP 已将设置从静态 ip 更改为通过 dhcp 分配的“静态”ip,我真的无法使用它。

遗憾的是,我无法静态设置 IP,因为 ISP 会在 dhcp 租约结束时关闭我的连接 :o

这是我收到的错误:(然后它就挂在那里..)

root@fw:~# dhclient eth2
Internet Systems Consortium DHCP Client V3.0.6
Copyright 2004-2007 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

SIOCSIFADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCSIFFLAGS: Permission denied
Listening on LPF/eth2/00:50:52:c1:a1:32
Sending on   LPF/eth2/00:50:52:c1:a1:32
Sending on   Socket/fallback
DHCPDISCOVER on eth2 to 255.255.255.255 port 67 interval 8
DHCPOFFER of 2.10.56.19 from 93.87.36.42
DHCPREQUEST of 2.10.56.19 on eth2 to 255.255.255.255 port 67
DHCPACK of 2.10.56.19 from 93.87.36.42
SIOCSIFADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCSIFNETMASK: Permission denied
SIOCSIFBRDADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCADDRT: Operation not permitted

现在我已经通过killall dhclient; dhclient eth2每小时运行一次然后为接口设置静态 IP 设置来修复它,这足以保持连接处于活动状态!但在我看来,这是一个相当丑陋的黑客行为。

答案1

根据堆栈跟踪http://silenzio.dk/pi/dhc.strace第一个 SIOCSIFADDR: Permission denied错误发生在第 735 行,执行进程 26092 期间:ifconfig eth2 inet 0 up。现在只能 root出点问题了,所以让我们跟踪/ifconfig的链 并查找 UID 更改。结果是:fork()exec()

  1. 进程 26092 是 26090 的子进程(第 689 行)
  2. 进程 26090 以 UID 101 和 GID 102 运行(第 355-358 行)
  3. 进程 26090 尝试将其 UID/GID 重新设置为 0,但失败(第 310 行)
  4. 进程 26090 是 26089 的子进程(第 286 行)
  5. 进程 26089 将其 UID:GID 切换为 101:102 (第 282-283 行)

因此,发生错误是因为正在执行的子进程没有必要的 root 权限。为什么会发生这种情况? debian/changelog源文件中dhcp3-3.0.6.dfsg说:

dhcp3 (3.0.1-2ubuntu4) breezy; urgency=low

  Derooted the DHCP client:
  * Added debian/patches/deroot-client.patch:
    - client/dhclient.c: After initialization, dro privileges to dhcp:dhcp and
      only keep CAP_NET_RAW and CAP_NET_BIND_SERVICE.
    - Add a setuid wrapper call-dhclient-script to call
      /etc/dhcp3/dhclient-script as root.
    - Install call-dhclient-script into /lib/dhcp3-client/.

我猜是它call-dhclient-script丢失了它的 set-UID 位,因此无法以 root 权限执行。(根据debian/dhcp3-client.postinst源代码中的文件,它应该由root:dhcp和 模式拥有4754

答案2

当您运行 dhclient 时,“dmesg”输出显示什么?

如果您正在运行 Hardy,AppArmor 是默认安装的一部分。dhclient 配置文件可能出现问题。检查“sudo aa-status”以查看那里发生了什么。

另外,您的 /etc/network/interfaces 文件如何读取?也许您有冲突的地址、路由等,而 dhclient 不想处理这些?

答案3

如果缺少该软件包,我会尝试安装 nscd,如果它不适用于此,则还安装 libnss-db。

不确定这是否能解决您的问题,然而,这些都是您的跟踪试图找到的东西,但失败了。

答案4

这实际上是 Ubuntu 8.04 中的一个错误。对于某些用例,您需要安装 nscd(例如使用 openvpn 时),否则 dhclient 将无法工作。在较新的 Ubuntu 版本中不会发生这种情况。

相关内容