diff --git a/CHANGELOG b/CHANGELOG index f00bbc719..d3be39bd8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,13 @@ # Nmap Changelog ($Id$); -*-text-*- + +o Added a new --disable-arp-ping option. This option prevents Nmap + from implicitly using ARP or ND host discovery for directly + connected Ethernet targets. This is useful in networks using proxy + ARP, which make all addresses appear to be up using ARP scan. The + previously recommended workaround for this situation, --send-ip, + didn't work on Windows because there are not raw sockets on Windows. + [David Fifield] + o [NSE] Added support for decoding OSPF Hello packets to broadcast-listener. [Hani Benhabiles] diff --git a/docs/refguide.xml b/docs/refguide.xml index 8598013f1..ef1fb317f 100644 --- a/docs/refguide.xml +++ b/docs/refguide.xml @@ -508,7 +508,7 @@ you would expect. For machines on a local ethernet network, ARP scanning will still be performed (unless - is specified) because Nmap needs + or is specified) because Nmap needs MAC addresses to further scan target hosts. In previous versions of Nmap, was @@ -865,7 +865,7 @@ you would expect. ) are specified, Nmap uses ARP instead for any of the targets which are on the same LAN. If you absolutely don't want to do an ARP scan, specify - . + . For IPv6 (-6 option), uses ICMPv6 Neighbor Discovery instead of ARP. Neighbor Discovery, defined @@ -874,6 +874,28 @@ you would expect. + + + (No ARP or ND Ping) + + + + + Nmap normally does ARP or IPv6 Neighbor Discovery (ND) + discovery of locally connected ethernet hosts, even if other + host discovery options such as or + are used. To disable this implicit + behavior, use the + option. + + The default behavior is normally faster, but this option + is useful on networks using proxy ARP, in which a router + speculatively replies to all ARP requests, making every target + appear to be up according to ARP scan. + + + + (Trace path to host) diff --git a/nmap.cc b/nmap.cc index 4e97b35c3..44634239d 100644 --- a/nmap.cc +++ b/nmap.cc @@ -665,6 +665,8 @@ void parse_options(int argc, char **argv) { {"adler32", no_argument, 0, 0}, {"stats_every", required_argument, 0, 0}, {"stats-every", required_argument, 0, 0}, + {"disable_arp_ping", no_argument, 0, 0}, + {"disable-arp-ping", no_argument, 0, 0}, {"route_dst", required_argument, 0, 0}, {"route-dst", required_argument, 0, 0}, {0, 0, 0, 0} @@ -935,6 +937,8 @@ void parse_options(int argc, char **argv) { if (d < 0) fatal("Argument to --stats-every cannot be negative."); o.stats_interval = d; + } else if (optcmp(long_options[option_index].name, "disable-arp-ping") == 0) { + o.implicitARPPing = false; } else if (optcmp(long_options[option_index].name, "route-dst") == 0) { struct sockaddr_storage ss; struct route_nfo rnfo;