标题：代理ARP
proxy ARP
什么是proxy ARPproxy ARP就是通过使用一个主机（通常为router），来作为指定的设备对另一设备的ARP请求作出应答。
proxy ARP是如何工作的设备需求：
Cisco 2500系列的router
Cisco IOS Release 12.2（10b)
此主题相关图片如下：
假设在如上图的一个环境中，位于子网A的主机A（172.16.10.100）需要发送packet到位于子网B的主机D（172.16.20.200）上去.于是主机A将发送ARP请求给D.当然，为了能够达到主机D，就需要知道主机D的MAC地址.因此，主机A在它位于的那个子网A上广播ARP请求。
当然router的e0口也接收到该广播，但是router默认不会转发广播的，所以该ARP请求仍然到达不了主机D.但是router却知道主机D位于另外一个子网B.于是router应答自己的MAC地址给主机A，在应答的ARP报文中源IP地址为主机D的IP地址，但是源MAC地址是router e0口的MAC地址.这就是发送给主机A的proxy ARP应答（代理人，中间人).这样的proxy ARP应答一般是作为unicast发送给请求者（主机A)
主机A收到这个proxy ARP应答以后，开始更新自己的ARP table。
于是从现在开始，主机A将要前往主机D的packet通过router e0口（00-00-0c-94-36-ab）转发，因为router知道如何到达主机D，它会把packet转发给主机D
另外，位于子网A的主机的ARP cache，如下图：
此主题相关图片如下：
注意上图，3个IP地址映射到1个MAC地址（router e0口的MAC地址）上，这就说明正在使用proxy ARP
Cisco的router的接口应该配置成能够接收和应答proxy ARP，当然这个默认是启用的，不过可以使用一些命令来关闭这个功能，命令如下：
Router# config t
Enter configuration commands,one per line. End with CNTL/Z.
Router(config)#int e 0
Router(config-if)#no ip proxy-arp
Router(config-if)#^Z
Router#
要再次启用的话，在接口配置模式下使用ip proxy-arp命令即可
proxy ARP有哪些优点最主要的一个优点就是能够在不影响其他router的路由表的情况下在网络上添加一个新的router，这样使得子网的变化对主机是透明的
proxy ARP应该使用在主机没有配置默认网关或没有任何路由策略的网络上
proxy ARP带来的哪些负面影响⒈增加了某一网段上ARP流量
⒉主机需要更大的ARP table来处理IP地址到MAC地址的映射
⒊安全问题，比如ARP欺骗（spoofing)
⒋不会为不使用ARP来解析地址的网络工作
⒌不能够概括和推广网络拓扑
ARP与代理ARP
ARP报文是主机发送出来的，在该主机只知道对方的IP地址且想知道对方的MAC地址时，它以广播的方式将ARP请求发送到自己所在网段的各个节点。当有主机响应时，回发的报文是单播发送。
代理ARP是当主机知道一个IP地址且它想知道该IP地址对应的MAC地址时，主机广播发送ARP请求，但是如果有同一网段的部分主机在另一个物理网络时（比如两个192.168.1.0的网段，中间夹着一个192.168.2.0的网段），就需要中间设备（路由器）进行代理ARP。因为路由器默认是不转发广播报文的，所以当路由器收到ARP请求时，它将启动代理ARP服务，将发送广播ARP报文。[1]
FAQ
1） 什么是ARP代理？
路由器收到ARP Request时，若发现查询的目的IP地址在不同子网，路由器会扮演代理的ARP的角色，代为回答，告诉查询者它所要做的MAC地址 （用的是之间接口的MAC地址） 
2）为什么要有ARP代理？ 路由器的一个重要功能是把局域网广播包限制在该网内，不让扩散，否则会造成网络风暴。ARP Request是个广播包，它询问的对象若在同一个局域网内，就会回答。但如果查询对象不在同一个局域网，那怎么办呢？为了解决这个问题，路由器就提供一个服务：代理ARP.
3） 还有什么方法来解决跨局域网的地址查询？ 若主机配置了默认网关，在查询MAC地址的对象位于局域网之外的时候，可以把查询任务交给默认网关。
4） 什么情况下用ARP代理？ 网络中主机、路由器都有ARP cache. 主机通常配置了默认网关，它们会用默认网关查询局域网外的MAC地址。路由器在需要查询远程网段里的MAC地址时，与其相连接的路由器，在收到ARP Request时就会扮演代理ARP的角色。
常见疑问
验证一些疑问：
⒈ARP请求到底什么时候会发
⒉代理ARP（proxy arp）会自动响应到哪些网段的ARP请求
⒊代理ARP到底适用什么样的环境
下面一个一个说：
⒈首先ARP是Ethernet环境下的一个机制，刚开始的时候有点犯晕，居然在s0口上配了一下，然后去sh arp，还在想怎么没东西出来
然后，并不是每一个出外网的包都会产生arp请求（这里不讨论arp cache的问题，默认cache里都是空的），一个接口，只会向ip地址在本接口配置的子网内的地址发arp请求，而对于ip地址不在接口配置的子网的，就要去查路由表发送了
比如：打开debug arp，e0 ip add 172.16.1.1 255.255.255.128
本地ping 172.16.1.1-1.126都会产生arp请求（arp-cache里没有的情况下），
但是ping 172.16.1.128以上都不会了
⒉代理ARP只响应那些在自己的路由表里能找到的网段，而不是象我以前想的那样会用自己的mac响应主机所有的arp请求
比如：PC--Route
PC Ether:ip address 172.16.12.2 255.255.0.0
Router:
interface Ethernet0/0:
ip address 172.16.12.1 255.255.255.0
interface Loopback0
ip address 172.16.14.1 255.255.255.0
这样，在pc上ping 172.16.14.1的时候，可以看到，pc产生了一个arp request，路由器用自己的E0/0 Mac地址回复了这个请求，也就是做了ARP代理，如果我们ping 172.16.15.1，arp包也被发到路由上，但是路由器不响应这个arp包。
适用环境
代理ARP到底适用什么样的环境
这个问题说实在的我也没有想的很明白，有的书上说，代理ARP起到了一个提供网关的作用，其实通过上面第一个验证，很明显这个说法是完全不正确的，因为只有请求本网段的ip的时候才会产生arp请求，代理arp最多也只能代理对于产生这个arp请求的主机是“同一个子网”的ip，这算什么网关呢？
***************这个作者显然是错的，当主机未配置默认路由时，ping非本网段地址，会向网络发送此非本网段地址的ARP请求，并且开启了代理ARP的设备接口有该非本网段路由时，会将自己的MAC进行ARP答复，实现ARP代理功能。本网段内的访问仅仅是简单的广播寻址，不涉及代理ARP，当主机配置默认路由时，该ARP请求直接请求的就是网关的ARP，也不涉及代理ARP，所以所谓的代理ARP相当于网关是有道理的。在配置了网关的设备上是不会出现代理ARP的问题********************************[2]
那代理ARP到底有什么用呢？
下面这个图也许比较能说明问题
看到了吧，注意主机上的子网位数的配置，似乎只有在这种“怪异”的场合才会用到代理arp，AC通信，A以为C在自己的子网内，直接发arp，路由e0接到这个arp请求，然后发现请求的ip地址在自己直连的网段中（在路由表中能找到），这样，就用e0口响应了这个arp请求，完成了代理ARP
实例配置
代理ARP （proxy ARP），又叫杂错ARP（promiscuous ARP），它是一种IP网络地址复用技术。在企业网中有些用户会用到此技术。
代理ARP的原理如图1：
主网络
。
运行ARP
隐藏网络
。
隐藏主机 
图中的主网络和隐藏网络共享一个网络地址，也就是说主网络和隐藏网络在一个地址段上。代理ARP要求在主网络采用ARP协议进行IP地址à物理地址映射，当主网络上各台主机调用ARP解析隐藏网络上主机的物理地址时，网关G代替主机响应，给出的物理地址是G本身的物理地址，由G来应答。而网关G要求对隐藏网络的各主机了如指掌，这样所有进入隐藏网络的数据报文都先送到网关G，网关G在将报文送往应该到达的主机，同样网关G也掌握主网络上的主机，以便对外出的数据进行合适的操作。
代理ARP技术涉及到IP 地址和物理地址两个方面，一方面代理ARP要用IP寻径，因为它要判断对那些ARP请求作出响应；另一方面代理ARP又要在网关G建立一张IP-物理地址映射表，它是直接参与物理传输的。说它是一种网络地址复用技术，是因为在代理ARP技术中，一个物理地址对应于若干个IP地址，二者不是一一对应的，这在协议上来说是不合法的 ，因为这样会引起安全问题，如果某计算机声称自己是另外一台计算机，就是对不属于自己的ARP请求回答自己的物理地址，然后非法接受分组，为了避免这种不安全的因素，有些ARP实现引入了专门的应付机制，一旦发现两个IP地址映射到同一物理地址，立即发出警告，提醒管理员采取措施。在代理ARP技术中，它不允许产生警告，否则警告报文太多，引起不必要的麻烦。在代理ARP技术中一个重要的概念是“信用”（trust），它的基本思想就是：所有参与ARP的机器要互相协作，不能有欺骗行为，因此所有ARP响应都是合法的。
目前这种技术广泛应用在路由器上，在中心局域网路由器的局域网端口设置代理ARP，一些拨号用户就可以使用中心局域网网段来和中心通信，如果路由器还支持动态IP地址池，那么整个网络配置就相当简单了。上海博达数据通信有限公司生产的BDCOM3000系列路由器就支持这种用法，典型的应用如下：
在这个网络中，路由器作为拨号访问服务器使用，主要的配置工作集中到中心路由器BDC0M3161上面，在E0端口使用代理ARP技术，路由器上配置动态IP地址池，这样远程拨号计算机只需要配置拨号网络中的电话号码就能和中心通信了。BDCOM3161相当于 cisco的2511，具有16个异步端口，还有3个同步端口，每个端口最高速率（同步）都是2M，这3个端口也支持异步（根据需要在路由器端口配置同步/异步）。如果全用成异步，可以提供19个异步口。在青海省某银行就有这种用法。路由器配置如下：
nodename BDCOM3161 设置路由器名字
ippool add remoteip 192.168.1.100 16 设置IP地址池，名字为remoteip 从 192.168.1.100 开始分配，共有16个地址可供分配
e0 进入以太网端口
arpproxy-arp enable 将ARP代理打开
ip add 192.168.1.254 255.255.255.0 设置以太网IP地址
quit 退出E0端口
a0 进入A0端口
encapsulate ppp 将A0端口封装成PPP协议
ip add 192.168.1.254 255.255.255.0 设置IP地址 （此IP地址和E0端口地址相同）
line dial 将此端口改成拨号线
idletime 300 设置挂机时间（当300秒没有 业务流量时路由器将MODEM挂断） 
ppp auth pap 在此端口进行PAP认证
ppp ipcp pool remoteip 指定此端口使用地址池remoteip 
给远程计算机分配地址
quit 退出A0端口
a1
encapsulate ppp
ip add 192.168.1.254 255.255.255.0
line dial
idletime 300
ppp auth pap
ppp ipcp pool remoteip 指定此端口使用地址池remoteip 给远程计算机分配地址
quit
a2
encapsulate ppp
ip add 192.168.1.254 255.255.255.0
line dial
idletime 300
ppp auth pap
ppp ipcp pool remoteip 
quit
a3
encapsulate ppp
ip add 192.168.1.254 255.255.255.0
line dial
idletime 300
ppp auth pap
ppp ipcp pool remoteip
quit
……
a15
encapsulate ppp
ip add 192.168.1.254 255.255.255.0
line dial
idletime 300
ppp auth pap
ppp ipcp pool remoteip
quit
user add bdcom abcd 为PAP认证加用户帐号（bdcom）和口令（abcd)
user add bdcom1 dcba 同上此帐号可以根据需要添加多个 
icmp redirect disable 将internet控制报文协议的重定向信息禁止 远程拨号计算机只需配置拨号网络的电话号码，从管理员处得到帐号和密码，IP地址由路由器自动分配即可。
实例配置：
  如图，交换机连接两台PC（A和B），最初的时候他们都在一个vlan1内，分别配置IP地址 172.16.1.2/16和172.16.2.2/16 ，均未配置网关，此时可以Ping同对方。
将A加入vlan1 ，vlanif配IP：172.16.1.1/24
将B加入vlan2 ，vlanif配IP：172.16.2.1/24
此时ApingB是ping不通的。
原因猜想：没有配置网关也没有配置代理ARP，所以ping不通
当我配置上两个端口的代理ARP，此时发现还是Ping不同。
此时查看了A的ARP表，发现表中记录172.16.2.2的MAC地址是B的地址。
此时A发出去的包中封装的MAC地址是B的，当vlanif收到该帧时，会丢弃该报文
将A的ARP表清空（arp –d），此时再pingB，发现可以Ping通了，A中记录的关于172.16.2.2的MAC地址已经是vlanif1 的MAC了。