Next Previous Contents

17. 以 Proxy ARP 构建桥接器和伪桥接器 (Building bridges, and pseudo-bridges with Proxy ARP)

桥接器(bridges)是一种可以安装在网路中而无须任何重设定(reconfiguration)的设备。一个网路交换器(switch)基本上是一个多埠口桥接器而已。单一的桥接器通常是一个双埠口的交换器。Linux 也支持带多张界面的单一桥接器﹐而成为一台真正的交换器。

桥接器的部署﹐主要是应用于如下情形﹕当面临一个衰弱的(broken)网路﹐需要进行修复﹐但又不能进行任何变更(alterations)。因为桥接器是一个 layer-2 设备﹐在 IP 的下一层﹐路由器和伺服器是感应不到它的存在的。换而言之﹐您可以通透性的封锁或修改特定的封包﹐或是进行引导。

桥接器的另一好处是﹐一个桥接器在挂掉之后﹐可以用一条跳接线(cross cable)或是一个集线器(hub)来代替。

而坏消息是﹐除非它被明晰的写在文件上﹐否则一个桥接器可能会导致非常大的困扰。在 traceroute 中不会显示它﹐但封包却因为某些缘故神奇失踪﹐或从点A 变成点B。另外﹐您还要知道﹐公司是否愿意修改现行状况。

关于 Linux 2.4 桥接器的文件﹐整理于﹕ this page

17.1 桥接和 iptalbe 的说明 (State of bridging and iptables)

对于 Linux 2.4.3﹐桥接器和 iptables 在没有外援的情况下﹐彼此都 '看' 不到对方。如果您将封包从 eth0 桥接到 eth1﹐他们并不能 '通过' iptalbes 哦。换句话说﹐您不能进行过滤﹑或 NAT﹑或重整(mangling)﹑或诸如此类。

目前已有数个计划进行对此问题的修正﹐而最准确的应算是 Linux 2.4 桥接程序的作者 Lennert Buytenhek 了。不过﹐修补程序尚未完成﹐但看来是可行的。它可以从这个地方找到﹕ the experimental bridge patches page

我们期待这个问题可以尽快解决。

17.2 桥接与引导 (Bridging and shaping)

这个正如所其标榜的那样﹐是可以工作的。您要确保设定好每个界面是在哪一端之上﹐否则﹐您可能会将外送的流量引导致内部界面上﹐这显然南辕北辙。必要时请使用 tcpdump 。

17.3 带 Poxy-ARP 的伪桥接器 (Pseudo-bridges with Proxy-ARP)

如果您只想实作一台伪桥接器(Pseudo-bridge)﹐尽可跳过后面数个段落﹐直接到 '把它实作出来' 那里﹐不过﹐看一看实习中它是如何工作的﹐绝对是聪明之举。

一个伪桥接器有所不同。预设上﹐桥接器从一个界面将未修改的封包传递到另外的界面去。它只参考封包的实体位址而判定要送至何方。换而言之﹐您可以桥接 Linux 不了解的流量﹐只要它能抓到实体位址就可以了。

而一个 '伪桥接器' 则略有不同﹐它看起来更像一台隐藏的路由器而非桥接器﹐但却又有桥接器的能力﹐它在网路设计上会构成一些影响。

事实上的一个优点是﹐因为它不是一个桥接器﹐而封包实际上会经过核心﹐因而可以被过滤﹑修改﹑重导向﹑或是重路由。

一台真正的桥接器﹐透过设定也能如法泡制﹐但它需要某些特殊的程序﹐例如 Ethernet Frame Diverter﹐或前面提到的修补。

伪桥接器的另外一个优点是﹐它不会传递它不明白的封包 --- 因此可以清理掉网路中许多流量。假如在您需要这些流量的情况下(例如 SAP 封包﹐或 Netbeui)﹐那就使用真正的桥接器吧。

ARP & Proxy-ARP

当一台主机想要呼叫同一实体网段上的另一台主机的时候﹐它会送出一个 Address Resolution Protocol 封包﹐说显浅一点﹐听起来会像这样﹕“谁有 10.0.0.1 这个位址﹐请告诉 10.0.0.7”。而作为对这个查询的回应﹐10.0.0.1 会回报一个简单的“我在这里”的封包。

然后 10.0.0.7 就将封包送到“我在这里”那个封包所提到的实体位址。同时﹐它也把硬件位址存放在 cache 中﹐保留一段相对较长的时间﹐等到 cache 逾期之后﹐则再重新发问就是了。

当要架设一个伪桥接器的时候﹐我们要让桥接器回应这类的 ARP 封包﹐这样﹐网路上的主机才会将它们的封包送到桥接器这边来。然后桥接器处理这些封包﹐再送到相关界面去。

所以﹐简而言之﹐当一台位于桥接器一端的主机﹐查询另一端主机的时候﹐桥接器就会回应一个封包﹐告之“交给我就好”。

透过这个办法﹐所有数据流量都能够送到正确的地方去﹐而且都会经过该桥接器。

把它实作出来 (Implementing it)

在过去﹐或许会让 Linux 核心对所有 subnet 进行 'proxy-ARP'。然则﹐要架设一台伪桥接器﹐您必须为两端指定正确的路由﹐并且﹐建立匹配的 proxy-ARP 规则。这实在不是十分好玩﹐因为光打字就够累人的了﹐且也极容易出错而导致桥接器为不知道如何路由的网路作出 ARP 回应。

在 Linux 2.4 上面(或许也包括 2.2)﹐这个可能性已经排除﹐并且被一个 /proc 目录中的旗标所取代﹐称为 'proxy_arp'。下面﹐是架设伪桥接器的步骤﹕

  1. 为两端的界面分配一个 IP 位址﹕ '左' 青龙﹑'右' 白虎。
  2. 将路由建立起来﹐让机器知道哪些主机在左边﹐哪些在右边。
  3. 将两端的界面之 prox-ARP 打开﹕ echo 1 >/proc/sys/net/ipv4/conf/ethL/proxy_arp;
    echo 1 > /proc/sys/net/ipv4/conf/ethR/proxy_arp
    其中的 L 和 R 分别为左右两边的界面号码。

然后﹐不要忘记将 ip_forwarding 旗标打开﹗假如从真正桥接器转换过滤﹐您或许会发现这旗标是关闭的﹐因为进行桥接的时候并不需要它。

另外﹐您在进行转换的时候还要注意﹐您需要清空网路中各电脑的 arp cache --- 因为 arp cache 或许仍保留著先前桥接器的实体位址﹐而事实上却已成昨日黄花了。

如在一台 Cisco 上面﹐可以用 'clear arp-cache' 命令来完成﹐在 Linux 上﹐则使用 'arp -d ip.address' 。当然﹐您也可以等 cache 逾时﹐这样需时更久。


Next Previous Contents