FreeBSD-代理ARP

来源:岁月联盟 编辑:zhu 时间:2008-01-18
FreeBSD-代理ARP内容简介:【FreeBSD教程】当一台 FreeBSD用作路由器的时候,其他路由器其实能够意识到这个路由器的存在。反过来讲,当设置一个路由器的时候,通常不仅仅需要设置这一个路由器的配置,还需要改动其他相关的路由器的设置,设置相关路由数

【FreeBSD教程】当一台 FreeBSD用作路由器的时候,其他路由器其实能够意识到这个路由器的存在。反过来讲,当设置一个路由器的时候,通常不仅仅需要设置这一个路由器的配置,还需要改动其他相关的路由器的设置,设置相关路由数据。虽然,动态路由协议能够简化甚至省略这些设置,但原则上设置路由器是一个整个网络相关的问题。

  然而,有些时候作为一个网络内部的治理员,需要在网络内部进行一些简单的调整,但不打算调整网络划分的分式,不打算改变其他的路由器设置或没有权限更改其他路由器设置。这个时候就需要对外部隐藏内部网络拓扑的改变,这个时候就需要设置一个秘密路由器,或者说一个透明的网关。

  秘密路由器的要害是代理 ARP,ARP协议是最基本的TCP/IP协议之一,它对于计算机之间进行通信至关重要。通过ARP协议,计算机能够获得对方的MAC地址,以便进行通信。然而,某些时候一些计算机并不能直接回应ARP请求,为了解决这些问题,可以通过其他的计算机帮助回应这些ARP请求。这就称为代理ARP。

  这种情况在拨号访问的时候十分常见,对外界来讲,拨号连接的对端计算机好象直接连接在内部网络上,因为拨号服务器用自己的 MAC地址回应了相应的ARP请求,并将对方发送来的数据包通过拨号连接转发给对端计算机。这种情况下,拨号服务器就起到路由器的作用,但外界并不能感觉到。

  其他情况下,也可以采用这种代理 ARP的方式,将内部网络拓扑隐藏起来。

  1) 设置代理 ARP
  除了使用 ifconfig命令直接控制网络界面是否支持ARP协议之外,控制ARP协议的工具就是arp命令。arp命令可以用来查看当前IP地址与MAC地址的对应关系,进一步可以清除、设置这个对应关系,改变ARP协议的行为。


$ arp -a

$ arp 192.168.100.1


  改变 arp中的MAC地址对应关系需要root权限,这可以用来设置静态的IP地址与MAC地址的对应关系,而不需要依靠于ARP协议。当网络界面不支持arp协议的时候,就需要将所有计算机的IP地址与MAC地址对应关系进行手工设置。


# arp 192.168.100.1 0:1:2:3:4:5

  这样设置的 MAC地址对应关系,假如系统支持ARP协议,那么新得到的数据将代替这个手工设置值。为了避免这种现象,可以指定perme?????


# arp 192.168.100.1 0:1:2:3:4:5 perm????

  然而,为了控制代理 ARP,需要设置非凡的选项publish,这个选项就指定本机用指定的MAC地址回应对针对的IP地址请求。


# arp 192.168.100.1 0:1:2:3:4:5 pub

  大部分情况下,这个值并不需要手工设置,因为一般只使用本机对应网卡的 MAC地址回应ARP请求,以便让对方将数据发送给本机。


# arp 192.168.100.1 -auto pub

  参数 -auto就指出,使用接受到ARP请求的网络界面本身的MAC地址回应该请求。

  对于更普遍的情况下,需要采用更轻易的做法,即:代理所有的 ARP请求。这就需要改变内核变量了。


# sysctl -w net.link.ether.inet.proxyall=1

  这个设置有更非凡的功能来维护 ARP请求的唯一回应关系。虽然,arpproxyall使得FreeBSD系统能回应所有ARP请求,但是它只回应一部分请求,假如FreeBSD系统在一个网络界面上通过侦听ARP回应,得到了一个IP地址与MAC地址的ARP表项,那么FreeBSD就在除这个网络界面的其他网络界面上代理这个IP地址的ARP请求,而不在该地址存在的网络中代理这个IP地址,以免发送地址冲突。

  2) 秘密路由器
  为了演示代理 ARP的用法,考虑这个案例。假如在网络192.168.100.0/24中有部分计算机打算单独组成一个子网,为了不调整整个网络的划分和其他路由器的设置,这个子网只能使用192.168.100.0/24中的地址,例如给该子网划分为192.168.100.128/26,地址范围为192.168.100.128-192.168.100.191,通过采用代理ARP的方法,就可以对192.168.100.0/24隐藏内部子网划分的事实。


# ifconfig xl0 192.168.100.129 netmask 255.255.255.0

# ifconfig xl1 192.168.100.129 netmask 255.255.255.192

# sysctl -w net.link.ether.inet.proxyall=1


  这里对两个网卡指定了同一个 IP地址,由于这个地址同时属于两个子网192.168.100.0/24和     192.168.100.128/26,这并不影响网络的正常运转。

  假如和 route指令相结合,可以直接隐藏某些IP地址。


# ifconfig xl0 192.168.100.1 netmask 255.255.255.0

# ifconfig xl1 192.168.100.1 netmask 255.255.255.255

# route add -host 192.168.100.129 -iface -link xl1:0:1:2:3:4:5

# arp 192.168.100.129 -auto pub

# sysctl -w net.link.ether.inet.proxyall=1


  前两个指令说明了网络划分的情况,网络界面 xl0用于192.168.100/24这个网络,而网络界面xl1只用于内部的秘密网络,指定了子网掩码使得它没有任何网络路由数据,因此就需要route指令用于设置对需要代理ARP的主机的直接路由,这里指出了直接路由是通过网络界面xl1来完成,否则即使数据包发送给FreeBSD系统,而无法投递给目的计算机。而arp指令用于设置代理ARP。

  但是,秘密路由器并不是不可被检测到的,因为数据包被路由器转发的时候,那么数据包本身的 TTL值将降低1,那么比如traceroute这样的工具就能发现异常。当然,在FreeBSD下,也可以通过ipfilter的fastroute特征,不降低TTL值。


图片内容