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

Las*_*sen 9 server 8.04 networking dhclient dhcp

我在 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
Run Code Online (Sandbox Code Playgroud)

现在我已经通过killall dhclient; dhclient eth2每小时运行一次然后为接口设置静态 IP 设置来修复它,这足以保持连接有效!但在我看来这是一个非常丑陋的黑客攻击..

Ric*_*rri 5

基于在所述堆栈跟踪http://silenzio.dk/pi/dhc.strace第一 SIOCSIFADDR: Permission denied在行735发生错误时,处理26092的执行期间:ifconfig eth2 inet 0 up。现在唯一 root可以ifconfig的东西了,所以让我们跟踪链 fork()/exec()查找UID变化。事实证明:

  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/.
Run Code Online (Sandbox Code Playgroud)

我的猜测是它call-dhclient-script已经丢失了它的 set-UID 位,因此没有像它应该的那样以 root 权限执行。(根据debian/dhcp3-client.postinstsources中的文件,应该归root:dhcp和mode所有4754