下一页 上一页 目录

3. 桥接

3.1 软件

从 Alan Cox 的主页获取桥接配置实用程序。这与 Chris 文档中的参考相同。我只是没有意识到它是一个 ftp URL 而不是 http URL ...

3.2 先前阅读。

阅读多以太网 HOWTO,了解有关识别和配置多个网卡的一些建议。

您可能需要的更多启动魔法的详细信息在启动提示 HOWTO中。

您也许可以不用阅读NET-2 HOWTO。这是一篇很长的读物,您将不得不从中挑选您需要的详细信息。

3.3 启动配置

上面的阅读材料会告诉您,您需要准备内核以在启动时识别第二个以太网设备,方法是将此行添加到您的 /etc/lilo.conf 中,然后重新运行 lilo

append = "ether=0,0,eth1" 

请注意 “eth1”。“eth0” 是第一张网卡。“eth1” 是第二张网卡。您始终可以在 lilo 提供给您的行中添加启动参数。 这适用于三张网卡

linux ether=0,0,eth1 ether=0,0,eth2 

我使用 loadlin 从 DOS 启动我的内核

loadlin.exe c:\vmlinuz root=/dev/hda3 ro ether=0,0,eth1 ether=0,0,eth2 

请注意,此技巧使内核在启动时进行探测。如果您将以太网驱动程序作为模块加载(为了安全起见,因为无法确定探测顺序),则不会发生这种情况,因此如果您使用模块,则必须在您的 /etc/conf.modules 中为驱动程序添加相应的 IRQ 和端口参数。我至少有

alias eth0 3c509
alias eth1 de620
options 3c509 irq=5 io=0x210
options de620 irq=7 bnc=1

您可以通过使用 ``ps -aux'' 查看 kerneld 是否正在运行,并检查您的 /lib/modules 目录的子目录中是否有 .o 文件来判断您是否使用了模块。您需要使用 `uname -r` 告诉您的目录名称。如果您有 kerneld 和/或 您有 foo.o,则编辑 /etc/conf.modules 并仔细阅读 depmod 的手册页。

另请注意,直到最近(内核 2.0.25),如果 3c509 驱动程序用作模块,则不能用于多个网卡。我见过一个修复此疏忽的补丁在流传。当您阅读本文时,它可能已在内核中。

3.4 内核配置

重新编译内核并启用桥接。

CONFIG_BRIDGE=y 

我还编译了防火墙、IP 转发和 -masquerading 以及其余启用的功能。仅当您也想要防火墙时...

CONFIG_FIREWALL=y           
CONFIG_NET_ALIAS=y          
CONFIG_INET=y               
CONFIG_IP_FORWARD=y         
CONFIG_IP_MULTICAST=y       
CONFIG_IP_FIREWALL=y        
CONFIG_IP_FIREWALL_VERBOSE=y
CONFIG_IP_MASQUERADE=y      

您不需要所有这些。除了这些之外,您真正需要的是标准的网络配置

CONFIG_NET=y 

我认为您无需担心任何其他网络选项。我通过内核模块提供了我实际上没有编译到内核中的任何选项,我可以在以后添加这些模块。

将新内核安装到位,重新运行 lilo 并使用新内核重新启动。此时不应该有任何改变!

3.5 网络地址

Chris 说桥接器不应该有 IP 地址,但这不是这里要描述的设置。

您将要使用这台机器连接到网络,因此您需要一个地址,并且您需要确保您以正常方式配置了环回设备,以便您的软件可以与他们期望能够对话的地方进行对话。如果环回关闭,名称解析器或其他网络服务可能会失败。请参阅 NET-2-HOWTO,但您的标准配置应该已经完成了这一点

ifconfig lo 127.0.0.1 route add -net 127.0.0.0 

您将必须为您的网卡分配地址。我修改了我的 slackware (3.x) 中的 /etc/rc.d/rc.inet1 文件来设置两张网卡,您也应该基本上只查找您的网络配置文件,并将其中的指令数量增加一倍或两倍。假设您已经有一个地址在

192.168.2.100 

(那是在私有网络保留地址空间中,但没关系 - 如果您错误地使用此地址,不会伤害任何人),那么您可能已经有一行像

ifconfig eth0 192.168.2.100 netmask 255.255.255.0 metric 1 

在您的配置中。您可能要做的第一件事是将此网卡可访问的地址空间减半,以便您最终可以桥接或防火墙这两个半区。因此,添加一行来缩小掩码,以寻址更少数量的机器

ifconfig eth0 netmask 255.255.255.128 

也尝试一下。这将网卡限制为最多 .0 到 .127 之间的地址空间。

现在您可以在本地地址空间的另一半中设置您的第二张网卡。确保没有人已经拥有该地址。为了对称,我在这里将其设置为 228=128+100。任何地址都可以,只要它不在另一张网卡的掩码中,即使那样,也可能没问题。避免使用像 .0、.1、.128 等特殊地址,除非您真的知道自己在做什么。

ifconfig eth1 192.168.2.228 netmask 255.255.255.128 metric 1 

这会将第二张网卡限制为 .128 到 .255 之间的地址。

3.6 网络路由

这里我必须声明桥接 + 防火墙方案中的注意事项:您无法防火墙未路由的数据包。没有路由,就没有防火墙。至少这在 2.0.30 及更高版本的内核中似乎是正确的。防火墙过滤器与 ip 转发代码密切相关。

这并不意味着您不能桥接。您可以在两张网卡之间桥接,并使用第三张网卡对它们进行防火墙保护。您可以只有两张网卡,并针对外部 IP(例如附近的路由器)对它们进行防火墙保护,前提是路由器由您路由到其中一张网卡。

换句话说,由于我将进行防火墙保护,因此我希望精确控制某些数据包的物理目的地。

我的小型机器网络连接到一个集线器,该集线器挂在 eth0 上,因此我在那里配置了一个网络

route add -net 192.168.2.128 netmask 255.255.255.128 dev eth0 

如果我那里有一个完整的 C 类网络,则 128 将为 0。但实际上我没有,因为我只是将地址空间减半。“dev eth0” 在这里不是必需的,因为网卡地址落在掩码内,但对于您来说可能是必需的。可能需要多张网卡来支持此子网(一个网段上有 127 台机器,哦,是的),但这些网卡将在相同的网络掩码下进行桥接,以便它们在路由代码中显示为一个。

在另一张网卡上,我有一条直接连接到我信任的大型路由器的线路。

                                             client 129
         __                                        |    __ 
client 1   \    .0                    .128         |   /   net 1
client 2 --- Hub - eth0 - Kernel - eth1 - Hub - Router --- net 2
client 3 __/       .100            .228         .2 |   \__ net 3
                                                   |
                                             client 254 

我将路由器的地址作为固定(“静态”)路由附加到该网卡,因为否则它将落在第一张网卡的网络掩码内,并且内核会对如何将数据包发送到大型路由器产生错误的思考。我希望对这些数据包进行防火墙保护,这也是想要专门路由它们的另一个原因。

route add 192.168.2.2 dev eth1 

我不需要它,因为在该地址空间的后半部分中我没有任何其他机器,但我也在第二张网卡上声明了一个网络。通过路由将我的接口分成两组将使我最终能够进行非常严格的防火墙保护,但是您可以比这少得多的路由。

route add -net 192.168.2.128 netmask 255.255.255.128 dev eth1 

我还需将所有非本地数据包发送到外部世界,因此我告诉内核将它们发送到大型路由器

route add default gw 192.168.2.2 

3.7 网卡配置

到目前为止都是标准的网络设置,但是我们正在桥接,因此我们还必须侦听两张(?)网卡上并非针对我们的数据包。以下内容应添加到网络配置文件中。

ifconfig promisc eth0 ifconfig promisc eth1 

手册页说 allmulti=promisc,但对我来说不起作用。

3.8 附加路由

我注意到的一件事是,我必须至少将第二张网卡置于一种模式,在这种模式下,它会响应大型路由器关于我隐藏在本地网络中的机器的问题。

ifconfig arp eth1 

为了安全起见,我也对另一张网卡做了同样的事情。

ifconfig arp eth0. 

3.9 桥接配置

启用桥接并将其放入您的配置文件中

brcfg -enable 

当然,您应该一直在实时尝试此操作!桥接配置将显示一些数字。您可以尝试一次打开和关闭端口

brcfg -port 0 -disable/-enable
 brcfg -port 1 -disable/-enable 

您可以通过运行以下命令随时获取状态报告

brcfg 

不带任何参数。您将看到桥接器监听、学习,然后进行转发。(我不明白为什么代码为我的两张网卡重复相同的硬件地址,但这没关系…… Chris 的 howto 说这没问题)

3.10 试用

如果您仍然像现在这样运行,请通过关闭两张网卡然后执行它来真实地试用您的配置文件

ifconfig eth0 down ifconfig eth1 down /etc/rc.d/rc.inet1 

如果运气好的话,各种子系统(nfsypbind 等)不会注意到。除非您坐在键盘前,否则不要尝试这样做!

如果您想比这更小心,则应事先关闭尽可能多的守护程序,并卸载 nfs 目录。可能发生的最坏情况是您必须在单用户模式下重新启动(liloloadlin 的 “single” 参数),并在使用您开始之前的状态重新启动之前删除您的更改。

3.11 检查

验证每个接口上是否有不同的流量

tcpdump -i eth0
(在一个窗口中)
tcpdump -i eth1
(在另一个窗口中)

您应该习惯使用 tcpdump 来查找不应该发生或正在发生但不应该发生的事情。

例如,查找从内部网络通过桥接器到达第二张网卡的数据包。在这里,我正在查找来自地址为 .22 的机器的数据包

tcpdump -i eth1 -e host 192.168.2.22

然后从 .22 主机向路由器发送 ping。您应该看到 tcpdump 报告的数据包。

在此阶段,您应该有一个准备就绪的桥接器,它也具有两个网络地址。测试您是否可以从外部和内部本地网络 ping 它们,以及您是否也可以在内部和外部之间进行 telnet 和 ftp。


下一页 上一页 目录