Man Linux: Main Page and Category List

NAME

       dhcp_probe  -  locate  DCHP  and  BootP  servers on a directly-attached
       network

SYNOPSIS

       dhcp_probe [ -c config_file ] [ -d debuglevel ] [ -f ]  [  -h  ]  [  -l
       log_file  ]  [  -o  capture_file  ] [ -p pid_file ] [ -Q vlan_id ] [ -s
       capture_bufsize ] [ -T ] [ -v ] [ -w cwd ] interface_name

DESCRIPTION

       dhcp_probe attempts to discover DHCP and BootP servers on  a  directly-
       attached  Ethernet  network.  A network administrator can use this tool
       to locate unauthorized DHCP and BootP servers.

       The program must be run with root privilege.

       The program periodically broadcasts a number of DHCP and BootP  request
       packets  out  a  single physical interface.  Several different kinds of
       request packets are sent, as a DHCP or BootP server may only respond to
       certain    requests,   depending   on   the   server’s   configuration.
       Essentially, dhcp_probe mimics a BootP or DHCP client in a  variety  of
       possible states, attempting to provoke responses from servers.

       After  sending  each  request packet, dhcp_probe listens for responses.
       After filtering out responses that do not appear to be in  response  to
       the  probe, and responses from known DHCP and BootP servers (identified
       by their IP source addresses and optionally by  their  Ethernet  source
       addresses), it logs any responses from unknown servers.

       Optionally,  responses  from  unknown  servers may also be written to a
       packet capture file.

       Optionally, an external program may be called each time a response from
       an unknown server is received.

       dhcp_probe  may  not  be able to locate all DHCP and BootP servers; see
       LIMITATIONS below.

       As DHCP broadcasts do not ordinarily cross IP routers, dhcp_probe  will
       locate  only  servers that are attached to the same physical network as
       the interface specified on the  command  line.   Although  BootP  Relay
       Agents  running  on  this  network  may  help  the  broadcasts cross IP
       routers,  these  agents  typically  are  configured  to   convert   the
       broadcasts  to  unicasts  directed to only the well-known DHCP or BootP
       servers located on other physical networks.  As a result,  BootP  Relay
       Agents  will  allow  your the servers to receive the requests issued by
       dhcp_probe, but will not cause remote unknown  servers  to  hear  these
       requests.   Therefore,  if you have multiple physical networks, you may
       wish to run dhcp_probe on each of these networks  to  discover  unknown
       DHCP and BootP servers on each of them.

       dhcp_probe  functions  on  a single Ethernet interface specified on the
       command line; it does not listen on multiple interfaces.   However,  if
       the  host  has multiple physical interfaces, you may run an instance of
       dhcp_probe on each interface.   If  your  physical  interface  supports
       802.1Q,  you  can  use that to create a logical interface on each VLAN,
       then run an instance of dhcp_probe on each logical interface.

       dhcp_probe is intended for use  by  a  network  administrator.   Before
       running  dhcp_probe  on  any  network  other than one for which you are
       responsible, contact that network’s administrator to  learn  if  it  is
       acceptable  for you to run this software on that network.  Running this
       software may violate on a network where you don’t have permission to do
       so may violate that network’s acceptable use policy.

AVAILABILITY

       dhcp_probe  is  a  product  of  the  Network Systems Group at Princeton
       University’s Office of Information Technology, and  is  available  from
       http://www.net.princeton.edu/software/dhcp_probe/

       Presently  the  product builds and runs on Solaris 9 on SPARC with gcc.
       The program relies on the pcap(3) and libnet(3) libraries.

OPTIONS

       -c config_file
              Specifies  the  configuration  file.   If  not  specified,  this
              defaults  to /etc/dhcp_probe.cf.  The configuration file is read
              at startup, and is re-read whenever a SIGHUP is  received.   See
              dhcp_probe.cf(5).

       -d debuglevel
              Sets  the  debuglevel  variable  that  controls  the  amount  of
              debugging messages generated.  If not specified,  this  defaults
              to  0  (no  debugging).   For a summary of the types of messages
              produced at each debug level, see DEBUG LEVELS below.

       -f     Specifies that the program should not fork, but  instead  remain
              in  the  foreground.   Only  use  this when you are starting the
              program manually for testing purposes.  When in the  foreground,
              any  messages  produced  by  the  program  are written to stderr
              instead of to syslog(3) or any log_file you might  specify  with
              the -l option.

       -h     Display a brief usage summary, then exit.

       -l log_file
              Log  messages  to  the  specified  file instead of to syslog(3).
              (This option is ignored if you also specify the  -f  option,  as
              that  directs  messages  to  stderr.)   The  log  file is opened
              shortly after the program starts.  It is  closed  and  re-opened
              when the program receives a SIGUSR1 signal.

       -o capture_file
              When  a  response  packet is received from an unexpected server,
              write the packet to the specified file.  The file is opened  and
              truncated  shortly  after  the program starts.  It is closed and
              re-opened (and truncated) when the program  receives  a  SIGUSR2
              signal.   The  file  is a pcap(3) savefile, and may be read with
              any program that understands  the  pcap  savefile  format;  e.g.
              tcpdump(1).

       -p pid_file
              Specifies  the  file  that will contain the program’s processid.
              If not specified, this defaults to /var/run/dhcp_probe.pid.  The
              pid_file  is  written  shortly  after the program starts, and is
              removed when the program exits under its own control.

       -Q vlan_id
              Specifies that the packets we send  should  be  tagged  with  an
              802.1Q  VLAN ID vlan_id.  Valid values range from 0 to 4095.  If
              not specified, the packets we send  do  not  contain  an  802.1Q
              header.

       -s capture_bufsize
              Specifies  the  size  of the buffer that will be used to capture
              all the responses (Ethernet frames) to a single request  packet;
              responses  which  do not fit are silently dropped.  The value is
              specified in bytes, and must fit into your host’s range  for  an
              int;  values  outside  that  range  may  result in unpredictable
              results.  If not specified, this defaults  to  30280,  which  is
              enough   for  twenty  maximum-size  Ethernet  frames  (1514*20).
              Typical responses  are  Ethernet  frames  ranging  from  342-590
              bytes, so the default capture buffer size should hold over 50 of
              them.

       -T     Enables  the  ’socket  receive  timeout’   feature.    On   some
              platforms,   dhcp_probe   may   ignore   the  response_wait_time
              (described in dhcp_probe.cf(5)), instead waiting forever  for  a
              response after it sends a probe packet.  As per pcap(3), this is
              because the read timeout we  pass  to  pcap_open_live()  is  not
              supported  on  all  platforms.  If you encounter this issue, try
              enabling our ’socket receive timeout’ feature;  it  might  help.
              Enabling  this  feature  causes the program to also set a socket
              receive timeout on the socket underlying the  pcap  capture;  we
              set  this timeout to the response_wait_time.  On some platforms,
              the program’s socket receive  timeout  feature  does  not  work;
              instead  the  program will report that it cannot set the receive
              timeout, and will exit.

       -v     Display the program’s version number, then exit.

       -w cwd Specifies the working  directory;  shortly  after  starting  the
              program  changes  its current working directory to this.  If not
              specified, this defaults to /.

       interface_name
              Specifies the name of the interface the program should use; this
              argument  is required.  This must be an Ethernet interface which
              is up and has been assigned an IP address.

OPERATION

       After initialization, the program enters its main event loop, in  which
       it remains until you signal the program to exit with a SIGINT, SIGTERM,
       or SIGQUIT.

       The main  event  loop  (a.k.a.  the  "probe  cycle")  consists  of  the
       following  actions,  repeated  until  the program receives a request to
       quit:

            1.     Handle any signals that have been received.

            2.     Install a pcap(3) filter to listen for UDP packets destined
                   to the BootP client port (UDP port 68).

            3.     Broadcast  a DHCP or BootP request packet out the specified
                   interface.

            4.     Listen  for   response_wait_time   milliseconds   for   any
                   responses   received   by   the   pcap(3)   filter.    (The
                   response_wait_time  defaults  to   5000   milliseconds   (5
                   seconds), and may be changed in the dhcp_probe.cf(5) file.)

                   Any responses that contains a bootp_chaddr field not  equal
                   to the chaddr used in the probe is ignored, as are any that
                   have incorrect bootp_htype or bootp_hlen fields.  These are
                   not responses to our probe.

                   Any  responses  from  known  DHCP  and  BootP  servers  are
                   ignored.  The IP source address  for  responses  from  each
                   known  server is declared using a legal_server statement in
                   the dhcp_probe.cf(5) file.  Any response with an IP  source
                   address that does not appear in a legal_server statement is
                   treated as an unknown server.

                   The Ethernet source address for responses from  each  known
                   server    is    also    optionaly    declared    using    a
                   legal_server_ethersrc  statement  in  the  dhcp_probe.cf(5)
                   file.   If at least one legal_server_ethersrc is specified,
                   then any response with an Ethernet source address that does
                   not  appear in a legal_server_ethersrc statement is treated
                   as  an  unknown  server.    If   no   legal_server_ethersrc
                   statements  appear,  then  the  response’s  Ethernet source
                   address  is  not   checked.    (The   legal_server_ethersrc
                   statement  is  considered experimental in version 1.3.0, as
                   it has received only limited testing.)

                   For each response from an unknown server:

            a)        If the reponse packet contains a non-zero yiaddr  field,
                      and one or more lease_network_of_concern statements were
                      specified, determine if the yiaddr  value  falls  within
                      any of the "Lease Networks of Concern".

            a)        Log  a  message  showing the response packet’s source IP
                      and Ethernet addresses.  If the response packet’s yiaddr
                      is  non-zero  and  falls  within  a  "Lease  Networks of
                      Concern", the log message also reports that.

            b)        If the -o option  was  specified,  the  packet  is  also
                      written to a packet capture file.

            c)        If   an   alert_program_name   was   specified   in  the
                      dhcp_probe.cf(5) file, that program  is  executed,  with
                      the  following  arguments  in  order:  the  name  of the
                      calling program (e.g.   dhcp_probe),  the  name  of  the
                      interface  on  which  the unexpected response packet was
                      received, the IP source address of the packet,  and  the
                      Ethernet  source address of the packet.  (We do not wait
                      for the alert_program_name to complete;  it  runs  in  a
                      child process.)

            d)        If   an   alert_program_name2   was   specified  in  the
                      dhcp_probe.cf(5) file, that program  is  executed,  with
                      the following required options:
                         -p the name of the calling program (e.g. dhcp_probe)
                         -I the name of the interface on which the unexpected response packet was received
                         -i the IP source address of the packet
                         -m and the Ethernet source address of the packet
                      If  the  response  packet’s yiaddr is non-zero and falls
                      within a "Lease  Networks  of  Concern",  the  following
                      optional options are also passed:
                         -y the non-zero yiaddr value
                      (We do not wait for the alert_program_name2 to complete;
                      it runs in a child process.)

            5.        Remove the pcap(3) filter installed earlier.

            6.        If any signals have arrived  requesting  that  we  quit,
                      exit gracefully.

            7.        Repeat  steps  2-6   for  each  flavor of DHCP and BootP
                      request packet the program supports (see PACKET  FLAVORS
                      below).

            8.        Handle any signals that have been received.

            9.        Sleep  for cycle_time seconds.  (The cycle_time defaults
                      to  300  seconds,  and  and  may  be  changed   in   the
                      dhcp_probe.cf(5) file.)

       The  pcap(3) filter the program installs normally does not specify that
       the interface should be placed into promiscuous mode  (although  it  is
       possible  the  interface  is already in promiscuous mode for some other
       reason).  However, if in the dhcp_probe.cf(5) file you specify a chaddr
       or  ether_src value other than the interface’s actual hardware address,
       then the pcap filter will specify that the interface should  be  placed
       into promiscuous mode.

       Although  the  filter  used  with  pcap(3)  specifies  only UDP packets
       destined to port bootpc should be collected, on systems where bpf isn’t
       part  of  the  kernel,  pcap(3)  must  implement  bpf  as  part  of the
       application.  This can increase the number  of  packets  that  must  be
       passed  from  the  kernel  to  user  space to be filtered.  The program
       attempts to minimize the side-effects of this by removing  the  pcap(3)
       filter  when it isn’t actually listening for responses.  In particular,
       the filter is not installed during the time the program sleeps  between
       each probe cycle (the cycle_time).

       If you do specify an alert_program_name, take care that the program you
       specify is safe for a privileged user to run; it is executed  with  the
       same (i.e. root) privileges as the calling program.

PACKET FLAVORS

       No  single  request  packet  is likely to provoke a response from every
       possible BootP and DHCP server.  Some  servers  may  only  response  to
       either BootP, or DHCP, but not both.  Some servers may be configured to
       only respond to a small set of known clients.  Some DHCP  servers  will
       only provide leases to a small set of known clients, but may be willing
       to respond (negatively) to unknown clients that request a lease renewal
       on  an  inappropriate IP address.  Therefore, dhcp_probe actually sends
       not one, but five different flavor request packets,  in  the  hopes  of
       provoking responses from a wider variety of unknown servers.

       The packet flavors are:

       BOOTPREQUEST
              This  packet  is  typical  of  a  BootP  client requesting an IP
              address.

              It will typically provoke  a  BOOTPREPLY  from  a  BootP  server
              willing   to  respond  to  any  BootP  client.   (BootP  servers
              configured to only respond to a set of  known  clients  may  not
              respond.)

       DHCPDISOVER (INIT)
              This packet is typical of a DHCP client in the INIT state.

              The  options  field  contains  a  DHCP  Message  Type specifying
              DHCPDISCOVER.

              The options field contains a DHCP Client  Identifier,  which  is
              computed  by  prepending  0x’01’  to  the value of chaddr.  (The
              value  chaddr  is  specified  in  the   dhcp_probe.cf(5)   file,
              otherwise it defaults to the interface’s Ethernet address.)

              This  packet  will  typically  provoke  a  DHCPOFFER from a DHCP
              server willing to respond to any  DHCP  client.   (DHCP  servers
              configured  to  only  offer leases to a set of known clients may
              not respond.)

       DHCPREQUEST (SELECTING):
              This packet is typical of a DHCP client in the SELECTING  state;
              i.e.  a  client which has previously issued a DHCPDISCOVER, then
              received a DHCPOFFER from some DHCP server.

              The options  field  contains  a  DHCP  Message  Type  specifying
              DHCPREQUEST.

              The  options  field  contains a DHCP Client Identifier, which is
              computed by prepending 0x’01’ to  the  value  of  chaddr.   (The
              value   chaddr   is  specified  in  the  dhcp_probe.cf(5)  file,
              otherwise it defaults to the interface’s Ethernet address.)

              The options field contains a DHCP Server  Identifier  specifying
              server_id,   which  should  be  an  IP  address  that  does  not
              correspond to any valid DHCP Server Identifier on your  network.
              (The  value server_id is specified in the dhcp_probe.cf(5) file,
              otherwise it defaults to 10.254.254.254.)

              The  options  field  contains  a  DHCP  Requested   IP   Address
              specifying client_ip_address, which should be an IP address that
              does not correspond to any valid IP  address  on  your  network.
              (The    value    client_ip_address    is    specified   in   the
              dhcp_probe.cf(5) file, otherwise it defaults to 172.31.254.254.)

              This packet occassionally provokes a response from a broken DHCP
              server that fails to respect the DHCP Server Identifier  option.

       DHCPREQUEST (INIT-REBOOT):
              This  packet  is  typical  of  a  DHCP client in the INIT-REBOOT
              state; i.e. a client which has obtained  a  DHCP  lease  in  the
              past,  is  bringing  up  its  IP  stack, and hopes to obtain (or
              extend) a DHCP lease on the same IP address as in the past.

              The options  field  contains  a  DHCP  Message  Type  specifying
              DHCPREQUEST.

              The  options  field  contains a DHCP Client Identifier, which is
              computed by prepending 0x’01’ to  the  value  of  chaddr.   (The
              value   chaddr   is  specified  in  the  dhcp_probe.cf(5)  file,
              otherwise it defaults to the interface’s Ethernet address.)

              The  options  field  contains  a  DHCP  Requested   IP   Address
              specifying client_ip_address, which should be an IP address that
              does not correspond to any valid IP  address  on  your  network;
              ideally it should be one that is topologically inappropriate for
              your network.  (The value client_ip_address is specified in  the
              dhcp_probe.cf(5) file, otherwise it defaults to 172.31.254.254.)

              If  the   Requested   IP   Address   option   is   topologically
              inappropriate  for  your  network,  this  packet  may  provoke a
              DHCPNAK from any DHCP server that believes it  is  authoritative
              for the network’s IP topology.

       DHCPREQUEST (REBINDING)
              This  packet is typical of a DHCP client in the REBINDING state;
              i.e. a client which has obtained a DHCP lease which  is  between
              its DHCP T2 and expiration time.

              The  options  field  contains  a  DHCP  Message  Type specifying
              DHCPREQUEST.

              The options field contains a DHCP Client  Identifier,  which  is
              computed  by  prepending  0x’01’  to  the value of chaddr.  (The
              value  chaddr  is  specified  in  the   dhcp_probe.cf(5)   file,
              otherwise it defaults to the interface’s Ethernet address.)

              The  ciaddr field contains client_ip_address, which should be an
              IP address that does not correspond to any valid IP  address  on
              your  network;  ideally  it  should be one that is topologically
              inappropriate for your network.  (The value client_ip_address is
              specified in the dhcp_probe.cf(5) file, otherwise it defaults to
              172.31.254.254.)

              If the value of ciaddr is topologically inappropriate  for  your
              network, this packet will provoke a DHCPNAK from any DHCP server
              that believes it is authoritative for the network’s IP topology.

       All  the request packets sent by the program share the following common
       characteristics:

            Ethernet Header
                 destination: ff:ff:ff:ff:ff:ff
                 source:  ether_src  from  dhcp_probe.cf(5),  else   interface
                 hardware address
                 type: ETHERTYPE_IP (0x0800)

            IP Header
                 version: 4
                 header length: 5
                 tos: 0
                 total  length:  328  (20-byte IP header + 8-byte UDP header +
                 300-byte BootP/DHCP payload)
                 identifier: 1
                 flags: 0
                 fragment offset: 0
                 ttl: 60
                 protocol: IPPROTO_UDP (17)
                 header checksum: (computed)
                 source address: 0.0.0.0
                 destination address: 255.255.255.255
                 options: (none)

            UDP Header
                 source port: PORT_BOOTPC (68)
                 dest port:  PORT_BOOTPS (67)
                 checksum: (computed)

            BootP/DHCP Payload
                 op: BOOTREQUEST (1)
                 htype: HTYPE_ETHER (1)
                 hlen: HLEN_ETHER (6)
                 hops: 0
                 xid: 1
                 secs: 0
                 flags: 0
                 ciaddr: 0.0.0.0 (except for DHCPREQUEST  (REBINDING)  packets
                 it   is   client_ip_address   from   dhcp_probe.cf(5),   else
                 172.31.254.254)
                 siaddr: 0.0.0.0
                 giaddr: 0.0.0.0
                 chaddr: chaddr from dhcp_probe.cf(5), else interface hardware
                 address
                 sname: (all 0’s)
                 file: (all 0’s)
                 options:  RFC1048  cookie  (0x63825363), possibly followed by
                 DHCP options, followed by END option (0xFF), followed by  PAD
                 options (0x00) to bring the field to 64 bytes

MULTIPLE INTERFACES

       Although   dhcp_probe   only  supports  monitoring  a  single  physical
       interface, you may run an instance of  the  program  on  each  physical
       interface; each monitors a different physical network.

       When  running  multiple  copies  of  dhcp_probe,  be  sure to specify a
       different pid_file for each instance.

       If you specify a log_file and/or a capture_file, be sure to  specify  a
       different one for each instance.

       You  may  specify  a  different  config_file for each instance.  If you
       don’t need to customize the settings in that file  for  each  instance,
       you may use the same configuration file for all instances.

       If you have multiple logical interfaces on the same physical interface,
       or multiple logical IP networks running on a single  physical  network,
       there  is  no  need  to run multiple instances of dhcp_probe to monitor
       each logical interfaces or logical network.  A single instance  of  the
       program  running  on  a physical interface is sufficient to provoke any
       servers on that physical network that might be willing to respond.

       If your physical interface  supports  802.1Q,  you  can  use  a  single
       physical  interface  to  monitor  multiple  VLANs.   Use your operating
       system to create a logical interface on each VLAN, then run an instance
       of  the  program  on  each  logical  interface.   Since  the program is
       responsible for constructing Ethernet frame headers, you will  probably
       need  to specify the -Q option to instruct it to add to outgoing frames
       an 802.1Q VLAN header with the appropriate VLAN ID.

SIGNALS

       The program will respond to a number of signals:

       SIGUSR1
              If logging to a file, close and re-open it.  If the  program  is
              in  the middle of a probe cycle, handling the signal is deferred
              until the end of the  cycle.   (Has  no  effect  if  logging  to
              syslog(3) or if the -f option was specified.)

       SIGUSR2
              If capturing to a file, close and re-open it.  If the program is
              in the middle of a probe cycle, handling the signal is  deferred
              until the end of the cycle.  (Has no effect if the -o option was
              not specified.)

              Because re-opening the  capture  file  causes  the  file  to  be
              truncated  and  a new pcap(3) header to be written to it, if you
              want to save the prior contents of the capture  file,  move  the
              existing capture file aside before sending the signal.

       SIGHUP Reread  the configuration file.  If the program is in the middle
              of a probe cycle, handling the signal is deferred until the  end
              of the cycle.

       SIGTERM, SIGINT, SIGQUIT
              Exit  gracefully.   If  the  program is in the middle of a probe
              cycle,  handling  the  signal  is  deferred  until  the  program
              finishes  sending and receiving responses for the current flavor
              request packet.

LEASE NETWORKS OF CONCERN

       Most rogue  BootP/DHCP  servers  distribute  private  IP  addresses  to
       clients,  or  send  DHCPNAK  messages to legitimate clients.  Some even
       more disruptive rogue BootP/DHCP servers may  distribute  IP  addresses
       that  fall within your own networks’ IP ranges.  The "Lease Networks of
       Concern" feature is intended to help you  identify  these  particularly
       disruptive servers.

       You may activate the feature by specifying the lease_network_of_concern
       statement in your configuration file.  Use the statement multiple times
       to specify all your legitimate network ranges.

       When  a  rogue  BootP/DHCP  server is detected, if the rogue’s response
       packet contains a non-zero yiaddr value, the value is compared  to  the
       "Lease  Networks  of Concern" you specified.  If the value falls within
       any of those network  ranges,  the  message  logged  by  dhcp_probe  is
       extended  to  make  note  of  this,  and  to  report  the yiaddr value.
       Furthermore, if you are  using  the  alert_program_name2  feature,  the
       alert  program  is  called with an extra -y yiaddr option so that alert
       program can take any additional action desired.

DEBUG LEVELS

       The program produces increasingly detailed  output  as  the  debuglevel
       increases.   Under  normal  circumstances, you can run at debuglevel 0.
       Here’s roughly what messages are added at each debuglevel.

       0     Display the IP source (and Ethernet source)  of  each  unexpected
             DHCP or BootP response packet.

             Startup and shutdown notice.

             Non-fatal errors in the configuration file.

             Fatal errors.

       1     At   startup,   show   some   information   about  the  program’s
             configuration.

       2     Show each time we start and finish (re-)reading the configuration
             file.

             Show  each time we close and re-open the logfile or capture file.

             Report on  response  packets  that  could  not  be  parsed  (e.g.
             truncated).

       3     Each   time   we  (re-)read  the  configuration  file,  echo  the
             information we obtain from it.

       7     For each parsable response packet, show the Ethernet  source  and
             destination, the IP source and destination, and indicate when the
             IP source is a legal (known) server.

       11    For each probe cycle, show when the cycle begins and  ends,  when
             we  write  a  packet,  and  when  we  begin and end listening for
             response packets.

AUTHOR

       The program was written by Irwin Tillman of Princeton University’s  OIT
       Network  Systems  Group.   It was written to run on Solaris, relying on
       the generally-available pcap(3) and libnet(3) libraries.

FILES

       /etc/dhcp_probe.cf
              Configuration file read by the program.   See  dhcp_probe.cf(5).
              The  name  of  this  file  can  be  overridden by a command-line
              option.

       /etc/dhcp_probe.pid
              Contains the program’s processid.  The name of this file can  be
              overridden by a command-line option.

LIMITATIONS

       dhcp_probe  is  not  guaranteed  to  locate  all unknown DHCP and BootP
       servers attached to a network.  If a BootP server is configured  so  it
       only  responds  to  certain  clients  (e.g. those with certain hardware
       addresses), it will not respond to the BOOTPREQUEST packet we sent.  If
       a  DHCP  server  is  configured  so it only responds to certain clients
       (e.g.  those  with  certain   hardware   addresses   or   DHCP   Client
       Identifiers),  it  will  not  respond to the packets we send that mimic
       DHCP clients in the INIT state.  If a DHCP server is configured  so  it
       does  not  send  DHCPNAK  packets  to clients requesting topologically-
       inappropriate IP addresses, it will not respond  the  packets  we  send
       that mimic DHCP clients in the INIT-REBOOT and REBINDING states.

       The  upshot  is  that  it is possible that dhcp_probe will be unable to
       provoke some BootP and DHCP servers into responding at all.

       Flushing out such servers can be extremely difficult.  One approach  is
       to  capture  all  UDP/IP packet destined to the BootP client port which
       cross your network; since most of these packets are unicast at Layer 2,
       capturing  is  only  effective  if  all  such packets must pass by your
       capture device’s Ethernet interface (e.g. the capture device is located
       at  a  network choke point, or the network does not involve any Layer 2
       switching).  Another approach is  to  do  UDP  port  scanning  for  all
       devices listening on the BootP server port, and assume that those which
       are listening on that port are running a BootP or DHCP server.

       Malicious BootP or DHCP servers that forge the IP source  address  (and
       possibly  the  Ethernet source address) of their responses to match the
       values specified by legal_server and  legal_server_ethersrc  statements
       will not be detected.

BUGS

       The  packet  capture buffer size is limited; if a single request packet
       provokes more responses than will fit into the buffer,  those  that  do
       not  fit  are  silently dropped, without any diagnostic indicating that
       the buffer was too small.  You  can  adjust  the  size  of  the  packet
       capture buffer size using the -s capture_bufsize option.

       We do not support non-Ethernet interfaces.

       Because (re-)opening a packet capture file causes the file to be opened
       for writing (not  appending),  the  contents  of  any  existing  packet
       capture  file  of  the  same  name  is  lost when the program starts or
       receives a SIGUSR2 signal.  If the file’s previous contents  should  be
       preserved,  move  the  old  file  aside  before starting the program or
       sending it a SIGUSR2 signal.  (This "feature" exists because opening  a
       pcap(3)  savefile  always  involves writing a pcap header record to the
       start of the file, so pcap always opens the file using mode "w".)

       Because pcap(3) opens the packet capture file with  a  simple  fopen(3)
       without  checking  to see if the file already exists, dhcp_probe may be
       tricked into overwriting or corrupting an existing file.  As dhcp_probe
       is  run with root privileges, this is a serious concern.  To avoid this
       problem, if you use the -o option, ensure that the directory that  will
       contain the capture file is writable only by root.

       The  packet capture file that is written is unparseable after the first
       packet.  E.g. if read with tcpdump(8), it reports: tcpdump:  pcap_loop:
       truncated dump file.

       On platforms where pcap(3) is unable to support the timeout argument to
       pcap_open_live, the program may not reliably detect responses from DHCP
       and BootP servers, or may not function at all.

SEE ALSO

       dhcp_probe.cf(5)

       pcap(3)   (a.k.a.  libpcap,  a  packet capture library), available from
                 http://www.tcpdump.org.  (An older version is available  from
                 ftp://ftp.ee.lbl.gov/libpcap.tar.Z.)

       libnet(3) (a.k.a  libwrite,  a  packet writing library), available from
                 http://www.packetfactory.net/libnet