Почему клиент говорит: «SIOCSIFADDR: в доступе отказано»?

9

Я столкнулся с очень странной ошибкой на ubuntu-server (8.04), я понятия не имею, почему dhclient не разрешено устанавливать настройки сети! Я не тот, кто установил сервер в первую очередь, поэтому я не знаю много о настройке. Сервер используется только в качестве брандмауэра / шлюза (пользовательский скрипт iptables), у него есть три никеля, один для Интернета, один для локальной сети и один для DMZ. Теперь провайдер изменил настройки со статического ip на «статический», назначенный через dhcp, и я не могу его использовать.

К сожалению, я не могу просто установить IP-адрес статически, так как провайдер закрывает мое соединение, когда заканчивается аренда 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 для интерфейса, этого достаточно, чтобы поддерживать соединение! но это довольно уродливый хак на мой взгляд ..

LassePoulsen
источник
1
strace -o /tmp/dhc$$ dhclient -d eth2должен дать ценную информацию о том, что звонки не удается. Да, я знаю их все, но, видя аргументы, может помочь. Я подозреваю некоторую причину в драйвере eth2, возможно, модуль не синхронизирован с ядром.
2010 г. в четверг
strace: paste.ubuntu.com/506269
LassePoulsen
Кстати: ник это "VT6102 [Рейн-II]", использующий модуль ядра via_rhine.
LassePoulsen
Ваша страсть была прервана прямо перед тем, как перейти к хорошей части. Дайте ему поработать немного дольше, прежде чем нажимать ctrl-c, или, возможно, добавьте -1опцию и подождите, пока он не завершится сам по себе.
Карл Билефельдт
1
я не использую apparmor или selinux. Вот строчка с включенной -fопцией: silenzio.dk/pi/dhc.strace
LassePoulsen

Ответы:

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)

Таким образом, ошибки возникают из-за того, что выполняющийся дочерний процесс не имеет необходимых корневых привилегий. Почему это происходит? 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)

Риккардо Мурри
источник
Такая сложная ошибка и такое простое решение! chmod u+s /lib/dhcp3-client/call-dhclient-scriptсделал трюк!
LassePoulsen
2

Что показывает ваш вывод "dmesg" при запуске dhclient?

Если вы используете Hardy, AppArmor является частью установки по умолчанию. Возможно, что профиль dhclient стал бесполезным. Проверьте «sudo aa-status», чтобы увидеть, что там происходит.

Кроме того, как читает ваш файл / etc / network / interfaces? Возможно, у вас есть конфликтующие адреса, маршруты и т. Д., С которыми dhclient не хочет играть?

Кис Кук
источник
На машине не установлено app-armor. И сетевая карта настроена со статическим IP в файле / etc / network / interfaces. Это не должно быть проблемой для перезаписи dhclient при вызове. Но это не имеет значения, потому что не имеет значения, если я установлю его как dhcp в файле / etc / network / interfaces. Если я делаю, интерфейс просто продолжает быть «ненастроенным».
LassePoulsen
Если можете, отправьте ссылки на каталоги "sudo aa-status" и "cat / etc / network / interfaces"
Kees Cook
1

Я хотел бы попробовать установить nscd, если этот пакет отсутствует, и если он не работает с этим, установите также libnss-db.

Не уверен, что это решит вашу проблему, однако, это то, что ваша трассировка пытается найти, и она терпит неудачу.

txwikinger
источник
установка nscd и libnss-db не помогает.
LassePoulsen
1

На самом деле это ошибка в Ubuntu 8.04. В некоторых случаях вам НУЖНО установить nscd (например, при использовании openvpn), иначе dhclient не будет работать. Этого не происходит в новых версиях Ubuntu.

mniess
источник
Это не имеет значения! установка nscd не имеет значения, поскольку dhclient не устанавливает IP-адрес, маску сети и т. д.
LassePoulsen