Desert Crystal Solutions


DHCP Mini HowTo

Saturday, 24 September 2005 13:27

This mini-HOWTO covers both the DHCP _SERVER_ daemon as well as DHCP _CLIENT_ daemon. Most people need the client daemon which is used by workstations to obtain network information from a remote server. The server daemon is used by system administrators to distribute network information to clients so if you are just a regular user you need the _CLIENT_ daemon.

1.1 Standard Disclaimer

No liability for the contents of this documents can be accepted. Use the concepts, examples and other content at your own risk. As this is a new edition of this document, there may be errors and inaccuracies, that may of course be damaging to your system. Proceed with caution, and although this is highly unlikely, I don't take any responsibility for that.

Also bear in mind that this is NOT official information. Much content in this document are assumptions, which appear to work for people. Use the information at your own risk.

1.2 New Versions of this Document

New versions of this document will be periodically posted to comp.os.linux.answers. They will also be added to the various anonymous FTP sites who archive such information, including:

In addition, you should generally be able to find this document on the Linux Documentation Project page via:

Following translations of the DHCP mini-HOWTO are available:

Permission is hereby granted to all individuals who want to translate the document into their own language. I would only ask that you provide a link back to this document and inform me of a URL to your translation so I can include a link to it.

1.3 Feedback

Feedback is most certaintly welcome for this document. Without your submissions and input, this document wouldn't exist. So, please post your additions, comments and criticisms to [email protected]

1.4 Contributors

This document has been modified from the original version by Paul Makeev.

The following people have contributed to this mini-HOWTO.

  • Heiko Schlittermann
  • Jonathan Smith
  • Dan Khabaza
  • Hal Sadofsky
  • Henrik Stoerner
  • Paul Rossington

1.5 Copyright Information

This document is copyrighted (c)1998 Vladimir Vuksan and distributed under the following terms:

  • Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions.
  • All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.
  • If you have questions, please contact the Linux HOWTO coordinator at
[email protected]


2. DHCP protocol

DHCP is Dynamic Host Configuration Protocol. It is used to control vital networking parameters of hosts (running clients) with the help of a server. DHCP is backward compatible with BOOTP. For more information see RFC 2131 (old RFC 1531) and other. (See Internet Resources section at the end of the document). You can also read DHCP FAQ.

This mini-HOWTO covers both the DHCP _SERVER_ daemon as well as DHCP _CLIENT_ daemon. Most people need the client daemon which is used by workstations to obtain network information from a remote server. The server daemon is used by system administrators to distribute network information to clients so if you are just a regular user you need the _CLIENT_ daemon.


3. Client Setup

Currently there are three different DHCP client programs for Linux, dhcpcd, pump and dhclient. This mini-HOWTO deals with dhcpcd.

3.1 Downloading the client daemon (dhcpcd)

2.0.x kernels

No matter what distribution you are using you will need to download the DHCP client daemon for Linux. The package you need to download is called dhcpcd and the current version is 0.70. You can read the description of the package here.

2.2.x kernels

Due to changes in ipv4 network package in 2.1.x and 2.2.x kernels (e.g. way it sets the defaults for several fields) dhcpcd doesn't work properly. Unless you are using RedHat 6.x (which comes with dhcpcd 1.3.x and 2.2.x kernel) you will need to download an alternative version of dhcpcd (1.3.x) which is a modified version that has been written by Sergei Viznyuk [email protected] in order to avoid mentioned problems. dhcpcd 1.3.x should work under 2.0.x kernels as well. You can download it at:

Then follow the instructions below. They should be the same.

3.2 Slackware

You can download the latest copy of the DHCPcd from any Metalab mirror or following:

Download the latest version of dhcpcd.tar.gz

  • Unpack it

    tar -zxvf dhcpcd-0.70.tar.gz

  • cd into the directory and make dhcpcd

    cd dhcpcd-0.70


  • Install it (you have to run the following command as root)

    make install

This will create the directory /etc/dhcpc where DHCPcd will store the DHCP information and dhcpcd file will be copied into /usr/sbin.

In order to make the system initialize using DHCP during boot type:

cd /etc/rc.d

mv rc.inet1 rc.inet1.OLD

This will move the old network initialization script into rc.inet1.OLD. You now need to create the new rc.inet1 script. Following code is all you need:

# rc.inet1 This shell script boots up the base INET system.

HOSTNAME=`cat /etc/HOSTNAME` #This is probably not necessary but I
#will leave it in anyways

# Attach the loopback device.
/sbin/ifconfig lo
/sbin/route add -net netmask lo

# IF YOU HAVE AN ETHERNET CONNECTION, use these lines below to configure the
# eth0 interface. If you're only using loopback or SLIP, don't include the
# rest of the lines in this file.


Save it and reboot your computer.

When you are finished go the last step

3.3 RedHat 6.x and Mandrake 6.x

DHCPcd configuration under RedHat 6.0+ is really easy. All you need to do is start the Control Panel by typing


  • Select "Network Configuration"
  • Click on Interfaces
  • Click Add
  • Select Ethernet
  • In the Edit Ethernet/Bus Interface select "Activate interface at boot time" as well as select DHCP as Interface configuration protocol

Please note that in RedHat 6.x Redhat as default includes a DHCP client called pump instead of above mentioned dhcpcd. CD-ROM does include dhcpcd RPM so if you have no luck with pump install dhcpcd and then try to follow installation instructions for Redhat 5.x

Additional notes from Alexander Stevenson mailto:[email protected]:

I had no luck with DHCPcd. What finally worked for me was "pump", which comes with Linux Mandrake 6.0 (and so I assume it is included with RedHat as well). The command I used was:

pump -i eth0 -h hostname

It didn't matter what "hostname" was, but without it the server would not respond.

I then changed the line in my /sbin/ifup script to reflect the change; the default version does not have the -h switch, and so didn't work for me.

Basically, if you're using linuxconf, and after setting the adapter to "DHCP" it still doesn't work, try adding a "-h hostname" to the pump line in the /sbin/ifup script. My script now looks like this:

if [ -n "$PUMP" ]; then
echo -n "Determining IP information for $DEVICE..."
if /sbin/pump -i $DEVICE -h hostname; then
echo " done."
echo " failed."
exit 1
else ...

That is it. Reboot your machine or type

/sbin/ifup eth0

On the command line.

3.4 RedHat 5.x

DHCPcd configuration under RedHat 5.0+ is really easy. All you need to do is start the Control Panel by typing


  • Select "Network Configuration"
  • Click on Interfaces
  • Click Add
  • Select Ethernet
  • In the Edit Ethernet/Bus Interface select "Activate interface at boot time" as well as select DHCP as Interface configuration protocol

When you are finished go the last step

3.5 RedHat 4.x and Caldera OpenLinux 1.1/1.2

DHCPcd is included in the standard RedHat distribution as an RPM and you can find it on your distribution's CD-ROM in RPMS directory or you can download it from:

and install it with

rpm -i dhcpcd-0.6-2.i386.rpm

Alternatively you can compile your own version by following the steps outlined in the Slackware.

This information was provided to me by nothing [email protected]

Removed my static ip and name from /etc/resolv.conf. However, I
did leave in the search line and my two nameserver lines (for some reason my
dhcpcd never creates a /etc/dhcpc/resolv.conf, so I have to use a static

In /etc/sysconfig/network I removed the HOSTNAME and GATEWAY
entries. I left the other entries as is

In /etc/sysconfig/network-scripts/ifcfg-eth0 I removed the IPADDR,
NETMASK, NETWORK, and BROADCAST entries. I left DEVICE and ONBOOT as is.
I changed the BOOTPROTO line to BOOTPROTO=dhcp.

Save the file. Reboot your computer.

When you are finished go the last step

3.6 Debian

There is a deb package of DHCPcd at

or you can follow the Slackware installation instructions. To unpack the deb package type

dpkg -i /where/ever/your/debian/packages/are/dhcpd*deb

It appears that there isn't a need for any DHCPcd configuration because:

From: Heiko Schlittermann ([email protected])

The dhcpcd package installs it's startup script as usual for debian packages in /etc/init.d/<package_name>, here as /etc/init.d/dhcpcd, and links this to the various /etc/rc?.d/ directories.

The contents of the /etc/rc?.d/ dirs is then executed at boot time.

If you don't reboot after installing you should consider starting the daemon manually:

/etc/init.d/dhcpcd start

When you are finished go the last step

3.7 LinuxPPC and MkLinux

Following section has been written by R. Shapiro

As of the "1999" (R5) release, Linuxppc is now almost completely compatible with Redhat 6, with one caveat (see below). In general the instructions are exactly the same as for the current release of Redhat 6.x.

The remaining problem is that Redhat 6 uses the 'pump' client for dhcp by default, and 'pump' doesn't work reliably in Linuxppc. To get around this, you should install the latest dhcpcd from Sergei Viznyuk, and then edit /sbin/ifup to use dhcpcd instead of pump. Change

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then

if [ -n "$PUMP" ]; then


 if [  "$BOOTPROTO" = bootp ]; then
echo " done."
echo " failed."
exit 1
elif [ "$BOOTPROTO" = dhcp ]; then
echo -n "Determining IP information for $DEVICE..."
if /sbin/dhcpcd -d $DEVICE ; then
if [ -f /etc/dhcpc/dhcpcd-${DEVICE}.exe ]; then

and a coresponding changes for ifdown. Change

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then


if [ "$BOOTPROTO" = bootp ]; then

if [ "$BOOTPROTO" = dhcp ]; then
if [ -f /var/run/dhcpcd-${DEVICE}.pid ]; then
kill `cat /var/run/dhcpcd-${DEVICE}.pid`
rm -f /var/run/dhcpcd-${DEVICE}.pid

A working ppc rpm for dhcpcd is included on the Linuxppc 1999 cd; a slightly later rpm is available in the contrib directory on Sources, which compile out of the box in Linuxppc 1999, are available from

If you want a precompiled dhcpcd for linuxppc, send mail to

3.8 Tying it all together

After your machine reboots your network interface should be configured. Type:


You should get something like this

lo        Link encap:Local Loopback  
inet addr: Bcast: Mask:
RX packets:302 errors:0 dropped:0 overruns:0 frame:0
TX packets:302 errors:0 dropped:0 overruns:0 carrier:0 coll:0

eth0 Link encap:Ethernet HWaddr 00:20:AF:EE:05:45
inet addr: Bcast: Mask:
RX packets:24783 errors:1 dropped:1 overruns:0 frame:1
TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0 coll:96
Interrupt:10 Base address:0x300

If you have some normal number under inet. addr you are set. If you see don't despair, it is a temporary setting before dhcpcd acquires the IP address. If even after few minutes you are seeing please check out troubleshooting. DHCPcd is a daemon and will stay running as long as you have your machine on. Every three hours it will contact the DHCP server and try to renew the IP address lease. It will log all the messages in the syslog (on Slackware /var/adm/syslog, RedHat/OpenLinux /var/log/syslog).

One final thing. You need to specify your nameservers. There are two ways to do it, you can either ask your provider to provide you with the addresses of your name server and then put those in the /etc/resolv.conf or DHCPcd will obtain the list from the DHCP server and will build a resolv.conf in /etc/dhcpc. I decided to use DHCPcds resolv.conf by doing the following:

Back up your old /etc/resolv.conf

mv /etc/resolv.conf /etc/resolv.conf.OLD

If directory /etc/dhcpc doesn't exist create it

mkdir /etc/dhcpc

Make a link from /etc/dhcpc/resolv.conf to /etc/resolv.conf

ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf

If that doesn't work try this (fix suggested by [email protected] with a little amendment by Henrik Stoerner)

This last step I had to perform only because my dhcpcd doesn't create an /etc/dhcpc/resolv.conf. In /etc/sysconfig/network-scripts/ifup I made the following changes (which are a very poor hack, but they work for me):

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
echo -n "Using DHCP for ${DEVICE}... "
/sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done ${DEVICE}
echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

if [ -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
echo "failed."
exit 1

I changed to:

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
echo -n "Using DHCP for ${DEVICE}... "
echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
echo "failed."
exit 1

Notice the ! (bang) in if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ];

Now sit back and enjoy :-).

3.9 Various notes

Following step(s) are not necessary but might be useful to some people

a) If you need network connectivity only occasionally you can start dhcpcd from the command line (you have to be root to do this) with:


When you need to down (turn off) the network type

/usr/sbin/dhcpcd -k

3.10 Troubleshooting

If you have followed the steps outlined above and you are unable to access the network there are several possible explanations:

I. Your network card is not configured properly.

During the boot up process your Linux will probe your network card and should say something along these lines:

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
3c509.c:1.07 6/15/95 [email protected]

If a message like this doesn't appear your ethernet card might not be recognized by your Linux system. If you have a generic ethernet card (a NE2000 clone) you should have received a disk with DOS utilities that you can use to set up the card. Try playing with IRQs until Linux recognizes your card (IRQ 9,10,12 are usually good).

II. Your DHCP server supports RFC 1541/My DHCP server is Windows NT

Try running dhcpcd by typing

dhcpcd -r

Use ifconfig to check if your network interface is configured (wait few seconds for the configuration process, initally it will say Inet.addr=

If this solves your problem add the "-r" flag to the boot up scripts ie. instead of /sbin/dhcpcd you will have /sbin/dhcpcd -r

For example under RedHat edit script /etc/sysconfig/network-scripts/ifup and change the following

        IFNAME=$[ {DEVICE} \
"/sbin/dhcpcd -r -c /etc/"- etc etc.

III. During bootup I get error message "Using DHCP for eth0 ... failed" but my system works fine.

You are most likely using RedHat and you haven't followed instructions carefully :-). You are missing the ! (bang) in one of the if statements. Jump here and check how to fix it.

IV. My network works for few minutes and then stops responding

There are some reports of gated (gateway daemon) screwing up routing on Linux boxes which results in problem described above. Check if gated is running

ps -auxww | grep gate

If it is try removing it with RedHat's RPM manager or removing the entry in /etc/rc.d/

V. My ethernet card is recognized during boot up but I still get "NO DHCPOFFER" message in my logs. I also happen to have a PCMCIA ethernet card.

You need to make sure that you have the 10BaseT port ("phone" plug) on your network card activated. Best way to verify it is to check what kind of connector your card is configured for during bootup e.g.

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
3c509.c:1.07 6/15/95 [email protected]

I have received reports of laptop users having this kind of problems due to the PCMCIA utilities (specifically ifport) that would set the connector type to 10Base2 (thinnet). You have to make sure you use 10BaseT for your connection. If you are not reconfigure the card and restart the computer.

VI. My DHCP client broadcasts requests but no one answers (Contributed by Peter Amstutz)

On some systems, you need to include some hostname for your machine as part of the request. With dhcpcd, do this with 'dhcpcd -h foohost' Probably the hostname wanted will be your account username on the network.

VII. I have followed all the steps but still my machine is not able to connect

The cable modem will usually memorize the ethernet address of your network card so if you connect a new computer or switch network cards you will somehow have to "teach" your cable modem to recognize the new computer/card. Usually you can turn of the modem and bring it back up while computer is on or you will have to call tech support and tell them that you have changed a network card in the computer.

You have firewall rules (ipfwadm rules) that disallow port 67/68 traffic used by DHCP to distribute configuration info. Check your firewall rules carefully.

VIII. I have MediaOne Express service and I still can't connect.

It appears that MediaOne has been using adding some things to DHCP that shouldn't be there. Supposedly this is not a problem anymore but if you experience outages check for these things. If you are (un)lucky to have Windows NT on your machine if you go into Event Viewer you will see a warning like this.

DHCP received an unknown option 067 of length 005. The raw option data is given below.

0000: 62 61 73 69 63 basic

If this is the problem go to and either download a binary or get the source for the change.


4. DHCP Server Setup

4.1 DHCP server for UNIX

There are several DHCP servers available for U*X-like OSes, both commercial and free. One of the more popular free DHCP servers is Paul Vixie/ISC DHCPd. Currently the latest version is 2.0 (suggested for most users) but 3.0 is in beta testing. You can get them from

Some of the distributions provide binary packages for dhcpd so skip the following section if you got it installed that way.

After you download unpack it. After you do cd into the distribution directory and type:


It will take some time to configure the settings. After it is done type:



make install

4.2 DHCP server configuration

When done with installation type ifconfig -a. You should see something like this:

eth0      Link encap:10Mbps Ethernet  HWaddr 00:C0:4F:D3:C4:62
inet addr: Bcast: Mask:
RX packets:2875542 errors:0 dropped:0 overruns:0
TX packets:218647 errors:0 dropped:0 overruns:0
Interrupt:11 Base address:0x210

If it doesn't say MULTICAST you should reconfigure your kernel and add multicast support. On most systems you will not need to do this.

Next step is to add route for Quoted from DHCPd README:

"In order for dhcpd to work correctly with picky DHCP clients (e.g., Windows 95), it must be able to send packets with an IP destination address of Unfortunately, Linux insists on changing into the local subnet broadcast address (here, that's This results in a DHCP protocol violation, and while many DHCP clients don't notice the problem, some (e.g., all Microsoft DHCP clients) do. Clients that have this problem will appear not to see DHCPOFFER messages from the server."


route add -host dev eth0

If you get a message

" Unknown host"

You should try adding the following entry to your /etc/hosts file: all-ones

Then, try:

route add -host all-ones dev eth0


route add dev eth0

eth0 is of course the name of the network device you are using. If it differs change appropriately.

4.3 Options for DHCPd

Now you need to configure DHCPd. In order to do this you will have to create or edit /etc/dhcpd.conf. There is a graphical interface for dhcpd configuration under KDE ( ) called kcmdhcpd that is very similar to the DHCP configurator on Windows NT. When KDE 2.0 comes out it should come with kcmdhcpd or you could get it directly from:

If you want to configure it by hand follow instructions below.

Most commonly what you want to do is assign IP addresses randomly. This can be done with settings as follows:

# Sample /etc/dhcpd.conf
# (add your comments here)
default-lease-time 600;
max-lease-time 7200;
option subnet-mask;
option broadcast-address;
option routers;
option domain-name-servers,;
option domain-name "";

subnet netmask {

This will result in DHCP server giving a client an IP address from the range or It will lease an IP address for 600 seconds if the client doesn't ask for specific time frame. Otherwise the maximum (allowed) lease will be 7200 seconds. The server will also "advise" the client that it should use as its subnet mask, as its broadcast address, as the router/gateway and and as its DNS servers.

If you need to specify a WINS server for your Windows clients you will need to include the netbios-name-servers option e.g.

option netbios-name-servers;

You can also assign specific IP addresses based on clients ethernet address e.g.

host haagen {
hardware ethernet 08:00:2b:4c:59:23;

This will assign IP address to a client with ethernet address 08:00:2b:4c:59:23.

You can also mix and match e.g. you can have certain clients getting "static" IP addresses (e.g. servers) and others being alloted dynamic IPs (e.g. mobile users with laptops). There are a number of other options e.g. nis server addresses, time server addresses etc., if you need any of those options please read the dhcpd.conf man page.

4.4 Starting the server

There is only one thing to do before starting the server. In most cases DHCP installation doesn't create a dhcpd.leases files. This file is used by DHCPd to store information about current leases. It is in the plain text form so you can view it during the operation of DHCPd. To create dhcpd.leases type

touch /var/state/dhcp/dhcpd.leases

on the command line. This will create an empty file (file size = 0). Some of the older version of dhcpd 2.0 placed the file in /etc/dhcpd.leases. You do not need to make any changes to it it should be empty. If you get a message saying that file exists simply ignore it and go to the next step.

You can now invoke the DHCP server. Simply type (or include in the bootup scripts)


This will invoke dhcpd on eth0 device. If you want to invoke it on another device simply supply it on the command line e.g.

/usr/sbin/dhcpd eth1

To verify that everything is working fine you should first turn on the debugging mode and put the server in foreground. You can do this by typing

/usr/sbin/dhcpd -d -f

Then boot up one of your clients and check out the console of your server. You will see a number of debugging messages come up. If everything works out fine you are done :-).

" type="text/javascript"> --); ?>