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;