dhclientが「SIOCSIFADDR:Permission denied」と言っているのはなぜですか?


9

ubuntu-server(8.04)で非常に奇妙なエラーが発生しました。dhclientがネットワーク設定を許可されていない理由がわかりません!私はそもそもサーバーをインストールした人ではないので、セットアップについてはあまり知りません。サーバーはファイアウォール/ゲートウェイ(カスタムiptablesスクリプト)としてのみ使用され、インターネット用、LAN用、DMZ用の3つのNICがあります。現在、ISPは静的IPからdhcpを介して割り当てられた「静的」IPに設定を変更しており、実際には使用できません。

悲しいことに、DHCPリースが終了するとISPが接続を閉じるため、IPを静的に設定することはできません。

これは私が得るエラーです:(そして、それはそこでハングします。)

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 eth21時間ごとに実行し、インターフェイスの静的IP設定を行うことで修正しました。これで、接続を維持できます。しかし、それは私の見解ではかなり醜いハックです。


1
strace -o /tmp/dhc$$ dhclient -d eth2どのコールが失敗しているかについての貴重な情報をもたらすはずです。はい、私はそれらすべてを知っていますが、議論を見ることは役立つかもしれません。私はeth2ドライバーに何らかの変則があると思います。おそらく、モジュールがカーネルと同期していません。
msw


btw:nicは、via_rhineカーネルモジュールを使用する「VT6102 [Rhine-II]」です。
LassePoulsen

良い部分に到達する直前に、トレースが中断されました。ctrl-cを押す前に、しばらく実行するか、-1オプションを追加して、それ自体が終了するのを待ちます。
カールビーレフェルト

1
私はここ.. AppArmorのか、SELinuxを使用していないとのstraceされる-fオプションがオン:silenzio.dk/pi/dhc.strace
LassePoulsen

回答:


5

http://silenzio.dk/pi/dhc.straceのスタックトレースに基づいて、最初のSIOCSIFADDR: Permission deniedエラーはプロセス26092の実行中に735行目で 発生します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/.

私の推測では、call-dhclient-scriptそのset-UIDビットが失われているため、本来のroot権限で実行されていません。(debian/dhcp3-client.postinstソース内のファイルによると、それはroot:dhcpとモードによって所有されている必要があります4754


そのような複雑なエラーとそのような簡単な解決策!chmod u+s /lib/dhcp3-client/call-dhclient-scriptトリックをした!
LassePoulsen

2

dhclientを実行すると、「dmesg」出力には何が表示されますか?

Hardyを実行している場合、AppArmorはデフォルトのインストールの一部です。dhclientプロファイルがおかしくなっている可能性があります。「sudo aa-status」をチェックして、そこで何が起こっているかを確認してください。

さらに、/ etc / network / interfacesファイルはどのように読み込まれますか?おそらく、dhclientが操作したくない競合するアドレスやルートなどがあるでしょうか?


マシンにapp-armorがインストールされていません。また、NICは/ etc / network / interfacesファイルで静的IPを使用して設定されます。dhclientが呼び出されたときに上書きしても問題はありません。しかし、/ etc / network / interfacesファイルでdhcpとして設定しても違いはないので、問題ではありません。私が行う場合、インターフェースは「未構成」のままです。
LassePoulsen、

可能であれば、「sudo aa-status」と「cat / etc / network / interfaces」のペーストビンへのリンクを送信してください
Kees Cook

1

そのパッケージが欠落している場合はnscdをインストールしてみます。これで機能しない場合は、libnss-dbもインストールしてください。

それで問題が解決するかどうかはわかりませんが、それらはトレースが見つけようとしているものであり、失敗します。


nscdとlibnss-dbをインストールしても役に立たない。
LassePoulsen


1

これは実際にはUbuntu 8.04のバグです。いくつかの使用例では、nscdをインストールする必要がある(openvpnを使用する場合など)か、dhclientが機能しません。これは新しいUbuntuリリースでは発生しません。


これは違いはありません!それにdhclientには差がネットマスクなど、IPアドレスを設定しないでnscdを行いインストールしない
LassePoulsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.