本使用指南有其他格式。首选下载:文档 tarball。您可以在Linux 文档项目中找到本使用指南。
正在寻找其他语言版本?请查看德语版本!截至 2003 年 3 月,由 Fran�ois Romieu 和 Guillaume Lelarge 友情提供法语版本:法语版本。今天,2005 年 7 月的某一天,我偶然发现了本 HOWTO 的意大利语版本!遗憾的是,文档中没有译者注释,至今仍不清楚是谁友情提供的:意大利语版本。
添加了意大利语版本 HOWTO 的链接(见上文)。外加一个关于使更改重启后持久的章节,一个关于 2.6 内核无法按预期工作的注释以及用户体验章节。包含了最终注释章节。 :)
遗憾的是,linux 文档项目对更新请求没有积极响应。这导致 www.tldp.org 网站上的版本过时。如果您想坚持使用最新版本的 HOWTO,请使用本网站。请责怪 tldp 人员。
Carsten (C DOT Lueth AT fielmann DOT com) 找到了一个适用于 MS Windows (TM) 系统的变体。
更新了使用的内核版本,关于远程管理、netfilter 调试代码的警告。新的翻译版本可用:法语(链接见上文)。已停止提供德语版本。
“相关主题”部分中的 ebtables 链接已更新。添加了关于 “假阳性” br-nf 调试输出的注释。
添加了实际配置章节以及关于在设置路由、Ping it, Jim! 中的路由提示。
以太网桥透明地连接两个或多个不同的以太网段。
以太网桥将从一个端口进入的以太网帧分发到与桥接口关联的其他端口。这是通过大脑完成的:每当网桥知道要将帧传递到的 MAC 地址位于哪个端口时,它就仅将该帧转发到该唯一端口,而不是污染所有端口。
可以将以太网接口添加到现有桥接口,然后成为桥接口的(逻辑)端口。
在桥接口之上放置 netfilter 结构使桥能够提供过滤机制。通过这种方式,可以创建透明的过滤实例。它甚至不需要分配 IP 地址即可工作。当然,您可以为桥接口分配 IP 地址以进行维护(当然,仅限 ssh ;-)。
该系统的优势显而易见。透明性减轻了网络管理员重构网络拓扑结构的痛苦。用户可能不会注意到网桥的存在,但他们的连接会被阻止。此外,用户在工作时不会受到干扰(想想网络连接丢失代价高昂的公司)。
另一种常见情况是客户端通过租用的路由器连接到全球网络。由于提供商很少授予对其租赁硬件的管理权限,因此客户端无法更改互连配置。但是,当然,客户端有一个正在运行的网络,并且希望尽可能少花钱,他不想重新配置他的整个网络。如果他使用桥接设备,则无需这样做。
以太网桥计算机上需要此软件设置。根据我们的测试场地。
使用内核 2.6 还不是一个好主意。是的,这令人惊讶。桥接代码在哪里以及为何中断尚未引起我和其他人的注意,我无法推荐 2.6 系列的内核。您有线索吗?确保自己获得功劳,将解决方案邮寄给我(电子邮件地址在首页)。另请参阅内核注释以获取有关此的更多信息。到目前为止,请使用 2.4 系列内核。
截至内核版本2.4.18,已经内置了对以太网桥接功能的支持。到目前为止,不需要补丁。关于更高版本的内核,必须声明2.4.23可能不太值得推荐,尤其是在与 ebtables 和 netfilter-bridging 结合使用时。更高版本似乎是明智之举。
以下段落现在已过时(2005-07-12),因为我们所需的一切都在内核中。您可以跳过此段落,它仅为遗留目的而保留
但是,如果我们打算使用 netfilter 功能,因为我们想在新的 Linux 路由器/防火墙盒子上运行 iptables,我们仍然需要应用补丁。所需的任何补丁都可以在sourceforge 以太网桥主页上找到并下载。
root@bridge:~> cd /usr/src/
root@bridge:~> wget -c http://bridge.sourceforge.net/devel/bridge-nf/bridge-nf-0.0.7-against-2.4.18.diff
root@bridge:~> cd /usr/src/linux/
root@bridge:~> patch -p1 -i ../bridge-nf/bridge-nf-0.0.7-against-2.4.18.diff
假设我们希望在桥接口上获得 netfilter 支持,并且我们已经修补了 vanilla 内核,我们现在可以激活一些必要的内核配置项。有关如何构建私有内核映像,请参阅CD-Net-Install-HOWTO,工具箱。哦,是的,它仍然只有德语版本。嗯,我应该在某个时候修复这个问题,但是时间不够...有志愿者吗?(死一般的沉默正在蔓延.. ;)
尽管如此,我们现在开始:在
Code maturity level options
我们激活
[*] Prompt for development and/or incomplete code/drivers
以及在
Loadable module support
[*] Enable loadable module support
[*] Set version information on all module symbols
[*] Kernel module loader
好的,到目前为止一切顺利。现在,我们转到
Networking options
并标记
[*] Network packet filtering (replaces ipchains)
[ ] Network packet filtering debugging
以前,已选择上述调试选项。目前,除非您希望您的 /var/log/
分区在短时间内被填满,否则请停用此选项。
如果激活此选项,则类似于以下内容的消息将以数千计数出现在 dmesg 和 /var/log/{kern.log,debug,syslog,messages}
中
skb: pf=2 (unowned) dev=br0 len=52
PROTO=6 156.136.32.121:3709 192.168.101.2:112 L=52 S=0x00 I=35470 F=0x4000 T=51
nf_hook: hook 1 already set.
skb: pf=2 (unowned) dev=br0 len=52
PROTO=6 156.136.32.121:3709 192.168.101.2:112 L=52 S=0x00 I=35470 F=0x4000 T=51
nf_hook: hook 0 already set.
skb: pf=2 (unowned) dev=br0 len=52
PROTO=6 192.168.101.11:2828 192.168.101.2:202 L=52 S=0x10 I=63 F=0x4000 T=64
nf_hook: hook 1 already set.
skb: pf=2 (unowned) dev=br0 len=52
PROTO=6 192.168.101.11:2828 192.168.101.2:202 L=52 S=0x10 I=63 F=0x4000 T=64
nf_hook: hook 3 already set.
skb: pf=7 (owned) dev=eth1 len=1500
此外,在
IP: Netfilter Configuration --->
我们将所需的任何项目标记为模块。现在是期待已久的条目:激活
<M> 802.1d Ethernet Bridging
以及
[*] netfilter (firewalling) support
只有在我们成功修补内核后,上述条目才可用!
最后,我们只需要成功完成
root@bridge:~> make dep clean bzImage modules modules_install
周期,我们就完成了。不要忘记编辑 /etc/lilo.conf
并执行
root@bridge:~> lilo -t
root@bridge:~> lilo
root@bridge:~> reboot
,虽然。
也许我们可以将我们的新内核标记为桥内核?我们 vi
编辑内核源代码中的顶层 Makefile,并编辑名为 EXTRAVERSION =
的标题行。我们实际上可以将其设置为,比如bridge? ;-)
在 modules_install
之后,我们在 /lib/modules/2.4.18bridge
中找到新的模块
对于 debian 用户(最终在 make-kpkg 之前使用 export PATCH_THE_KERNEL=YES
和 --added_patches your_patches)
root@bridge:~> make-kpkg --revision=tf.1.0 kernel_image
brctl
一旦我们的内核具有执行以太网桥和 netfilter 操作所需的功能,我们就准备用户空间工具 brctl
。brctl
是我们用来设置任何符合我们需求的配置工具。
我们下载源代码 tarball,解压缩并更改目录进入它。
root@bridge:~> wget -c http://bridge.sourceforge.net/bridge-utils/bridge-utils-0.9.5.tar.gz
root@bridge:~> tar xvzf bridge-utils-0.9.5.tar.gz
root@bridge:~> cd bridge-utils-0.9.5
此时,阅读 README
和 doc/
子目录中的文件。然后执行简单的 make 并将生成的 brctl/brctl
可执行文件复制到 /sbin/
。
root@bridge:~> make
root@bridge:~> cp -vi brctl/brctl /sbin/
就是这样。现在转到设置。
症状:设置期间一切正常,但数据包不再像在 2.4 中那样遍历桥接口。
ipuk s (qasuari_ @ _yahoo.com) 写道(大约 2005 年 6 月)
[...]
I have to compile my kernel from 2.4.18-14 to 2.6.0 and activate
bridge-netfilter&ebtables.
After compiling, i can't ping from a host to interface of linux box.
Linux box just have 1 interface.whats wrong with my compilation ???
[...]
我们需要 Linux 知道网桥。首先告诉它我们想要一个虚拟以太网桥接口:(这要在主机 bridge
上执行,当然。请参阅测试场地)
root@bridge:~> brctl addbr br0
其次,我们不需要 STP(生成树协议)。也就是说,我们只有一个路由器,因此循环的可能性很小。然后我们可以停用此功能。(也会减少受污染的网络环境)
root@bridge:~> brctl stp br0 off
在完成这些准备工作之后,我们现在最终执行一些有效的命令。我们添加我们的两个(甚至更多)物理以太网接口。这意味着,我们将它们附加到刚刚诞生的逻辑(虚拟)桥接口 br0
。
root@bridge:~> brctl addif br0 eth0
root@bridge:~> brctl addif br0 eth1
人们给我发送电子邮件,说如果我更清楚地强调被切断连接的风险,那将对他们有所帮助。因此,请在此处听取我的警告
如果您正在阅读本文,那么您离_可能_切断自己与您即将变成桥接设备的盒子的连接仅一步之遥。
如果您喜欢生活在尖端,那么现在是准备急救材料的时候了。您很可能需要它。
如果您无法进行物理访问,并且您范围内没有其他人
除非您的手指离开您面前的键盘,并且您的眼睛反思性地注视着控制台以外的其他事物,否则请勿继续。
您已被警告,现在。对任何事情都不承担责任。
root@bridge:~> ifconfig eth0 down
root@bridge:~> ifconfig eth1 down
root@bridge:~> ifconfig eth0 0.0.0.0 up
root@bridge:~> ifconfig eth1 0.0.0.0 up
太棒了!我们现在有一个没有附加任何 IP 的盒子。因此,如果您正在通过 TP 配置您未来的防火墙/路由器,请立即转到本地控制台 ;-)) 您有串行控制台吗?幸福的人 :-))我们告诉 Linux 新的(逻辑)接口,并将其与一个 IP 相关联
root@bridge:~> ifconfig br0 10.0.3.129 up
如果我们正在配置网关,我们将在 linux 内核中启用转发。
root@bridge:~> echo "1" > /proc/sys/net/ipv4/ip_forward
我们的盒子已经分配了 IP,但没有默认路由。我们现在解决这个问题
root@bridge:~> route add default gw 10.0.3.129
最后,我们应该拥有一个从、到和通过网关的工作网络。
又名:我们需要更改在重启后仍然存在。
为此,您需要一些 sh 风格的脚本,并将其放在适当的系统启动目录中:/etc/init.d/
其次,您在运行级别目录中创建链接。正确的目录取决于您的喜好,当然也取决于您的 linux 发行版。工作站上常见的运行级别值为 2
、3
和 5
。示例为:/etc/rc?.d/
(将 ? 替换为正确的运行级别)
此外,您需要了解何时关闭网络接口。目前,我们假设您的网络接口在系统优先级 S
下激活,因此我们无需担心。如果您确实需要确切知道,请查看 /etc/rcS.d/
。我们只是希望网桥尽快启动并运行,因此选择我们的优先级为 10
。(确保没有需要在之前启动桥接设备的服务,读取:优先级值小于 10
)
目前,我们假设您的运行级别为 5
root@bridge:~> mv -i bridge.sh /etc/init.d/
root@bridge:~> cd /etc/rc5.d/
root@bridge:~> ln -s ../init.d/bridge.sh S10bridge.sh
实际上,任何发行版都为您提供了一些运行级别检查器或等效工具,以帮助您完成管理运行级别链接的繁琐工作。请查阅您的发行版文档了解相关信息。
#!/bin/bash
PATH="/sbin:/usr/sbin:/usr/local/sbin";
slaveIfs="1 2 3 4 6 7 8 9 10";
cmd="$1";
[ -z "$cmd" ] && cmd="start";
case "$cmd" in
start)
brctl addbr br0;
brctl stp br0 on;
brctl addif br0 eth0;
brctl addif br0 eth1;
(ifdown eth0 1>/dev/null 2>&1;);
(ifdown eth1 1>/dev/null 2>&1;);
ifconfig eth0 0.0.0.0 up;
ifconfig eth1 0.0.0.0 up;
ifconfig br0 10.0.3.129 broadcast 10.0.3.255 netmask 255.255.255.0 up ### Adapt to your needs.
route add default gw 10.0.3.129; ### Adapt to your needs.
for file in br0 eth0 eth1;
do
echo "1" > /proc/sys/net/ipv4/conf/${file}/proxy_arp;
echo "1" > /proc/sys/net/ipv4/conf/${file}/forwarding;
done;
echo "1" > /proc/sys/net/ipv4/ip_forward;
;;
stop)
brctl delif br0 eth0;
brctl delif br0 eth1;
ifconfig br0 down;
brctl delbr br0;
#ifup eth0; ### Adapt to your needs.
#ifup eth1; ### Adapt to your needs.
;;
restart,reload)
$0 stop;
sleep 3;
$0 start;
;;
esac;
而且,是的,使其可执行..
root@bridge:~> chmod 700 /etc/init.d/bridge.sh
毕竟,确保您的网桥在无人值守的重启后仍然存在。这与备份的故事相同:您应该在需要它之前对其进行测试。
我们想象一下这种情况或类似情况
/\
Ethernet Ethernet ATM /-/ \
--------- --------- --------- /-/ |
| Box |----------|Bridge |----------|Router |-----| Inter- \
--------- --------- --------- \ net ---|
^ ^ ^ ^ \ /
| | | | \---/
eth0 eth0 eth1 if0 ^
| | | | |
10.0.3.2 none/10.0.3.1 195.137.15.7 anything else
\ /
\ /
^ \-br0-/
| ^ ^
| ^ | |
| | | |
own own foreign hostile
我们的管理权限仅包括标记为 own
的机器,路由器完全禁止访问,互联网当然也是如此。我们将像往常一样配置 Box 的 eth0。桥的接口配置如设置中所述。
如果我们要使用转发,我们或许可以这样做:;-)
root@bridge:~> echo "1" > /proc/sys/net/ipv4/ip_forward
可选地,我们设置默认路由
root@bridge:~> route add default gw 10.0.3.129
然后我们在主机 bridge
上设置一些 iptables 规则:
root@bridge:~> iptables -P FORWARD DROP
root@bridge:~> iptables -F FORWARD
root@bridge:~> iptables -I FORWARD -j ACCEPT
root@bridge:~> iptables -I FORWARD -j LOG
root@bridge:~> iptables -I FORWARD -j DROP
root@bridge:~> iptables -A FORWARD -j DROP
root@bridge:~> iptables -x -v --line-numbers -L FORWARD
最后一行给出以下输出
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- any any anywhere anywhere
2 0 0 LOG all -- any any anywhere anywhere LOG level warning
3 0 0 ACCEPT all -- any any anywhere anywhere
4 0 0 DROP all -- any any anywhere anywhere
LOG
目标通过 syslogd
记录每个数据包。请注意,这仅用于测试目的,在生产环境中删除。否则,您最终会用您自己或任何其他人对您进行的拒绝服务攻击来填充日志和硬盘分区。您已被警告。box
上 ping 路由器接口的 IP (195.137.15.7)
root@box:~> ping -c 3 195.137.15.7
PING router.provider.net (195.137.15.7) from 10.0.3.2 : 56(84) bytes of data.
--- router.provider.net ping statistics ---
3 packets transmitted, 0 received, 100% loss, time 2020ms
^C
root@box:~>
默认情况下,我们 DROP
所有内容。没有响应,没有记录的数据包。此 netfilter 设置旨在 DROP
所有数据包,除非我们在 LOG
目标匹配之前删除丢弃每个数据包的规则(上面的规则 1)
root@bridge:~> iptables -D FORWARD 1
root@bridge:~> iptables -x -v --line-numbers -L FORWARD
现在,规则是
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
2 0 0 LOG all -- any any anywhere anywhere LOG level warning
3 0 0 ACCEPT all -- any any anywhere anywhere
4 0 0 DROP all -- any any anywhere anywhere
并且任何数据包都可以通过。在主机 box
上使用 ping 进行测试
root@box:~> ping -c 3 195.137.15.7
PING router.provider.net (195.137.15.7) from 10.0.3.2 : 56(84) bytes of data.
64 bytes from router.provider.net (195.137.15.7): icmp_seq=1 ttl=255 time=0.103 ms
64 bytes from router.provider.net (195.137.15.7): icmp_seq=2 ttl=255 time=0.082 ms
64 bytes from router.provider.net (195.137.15.7): icmp_seq=3 ttl=255 time=0.083 ms
--- router.provider.net ping statistics ---
3 packets transmitted, 3 received, 0% loss, time 2002ms
rtt min/avg/max/mdev = 0.082/0.089/0.103/0.012 ms
root@box:~>
耶!路由器已启动、运行并正常工作。(好吧,它已经整天都在工作了.. ;-)
当我们刚刚启动桥接口时,大约需要 30 秒才能使桥完全运行。这是由于桥接口的 30 秒学习阶段。在此阶段,桥端口正在学习哪些 MAC 地址存在于哪个端口上。桥作者 Lennert 在他的 TODO 文件中告诉我们,30 秒的学习阶段将在某个时候及时进行一些改进。
在测试阶段,不会转发任何数据包。没有 ping 会得到响应。记住这一点!
本节旨在为您,亲爱的读者,提供一些关于在成功处理本 howto 后您的系统应该看起来和感觉如何的提示。
您的 ifconfig
命令的输出可能类似于这样
root@bridge:~> ifconfig
br0 Link encap:Ethernet HWaddr 00:04:75:81:D2:1D
inet addr:10.0.3.129 Bcast:195.30.198.255 Mask:255.255.255.128
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:826 errors:0 dropped:0 overruns:0 frame:0
TX packets:737 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:161180 (157.4 Kb) TX bytes:66708 (65.1 Kb)
eth0 Link encap:Ethernet HWaddr 00:04:75:81:ED:B7
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5729 errors:0 dropped:0 overruns:0 frame:0
TX packets:3115 errors:0 dropped:0 overruns:0 carrier:656
collisions:0 txqueuelen:100
RX bytes:1922290 (1.8 Mb) TX bytes:298837 (291.8 Kb)
Interrupt:11 Base address:0xe400
eth1 Link encap:Ethernet HWaddr 00:04:75:81:D2:1D
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:1 frame:0
TX packets:243 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:342 (342.0 b) TX bytes:48379 (47.2 Kb)
Interrupt:7 Base address:0xe800
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1034 errors:0 dropped:0 overruns:0 frame:0
TX packets:1034 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:82068 (80.1 Kb) TX bytes:82068 (80.1 Kb)
您的 route
命令的输出可能类似于这样
root@bridge:~> route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.3.129 0.0.0.0 255.255.255.128 U 0 0 0 br0
0.0.0.0 10.0.3.129 0.0.0.0 UG 0 0 0 br0
root@bridge:~>
请查看Ping it, Jim! 部分。
我想听到您的来信! :-)
您喜欢这次旅程吗?
您错过了什么吗?
需要帮助吗?(致电您当地的助理 ;-) 或 rtfm。)
您仍然在线吗?然后通过电子邮件给我留言。我真的会很高兴。
想给我寄支票吗?可惜,不接受这些..(开玩笑 ;)
让它值得我花时间,只需给我发一些好听的话,那就足够了。
没有什么比快乐的参与者给您有价值的反馈更能激励人心的了。
所以,继续,花一分钟给我发邮件!
谢谢!
Nils
From: Bart De Schuymer <bart.de.schuymer_@_pandora.be>
Date: Sun, 1 Sep 2002 21:52:46 +0200
To: Nils Radtke <Nils.Radtke_@_Think-Future.de>
Subject: Re: Ethernet-Brigde-netfilter-HOWTO
Hello Nils,
[...]
Also, network packet filtering debugging is generally a bad idea with the
br-nf patch. It can gives a lot of false warnings (about bugs) in the logs.
[...]
就我个人而言,我的日志中从未出现过误报。也许,该错误已修复。这已邮寄给 Bart,他写道
From: Bart De Schuymer <bart.de.schuymer_@_pandora.be>
Date: Mon, 2 Sep 2002 18:30:25 +0200
To: Nils Radtke <Nils.Radtke_@_Think-Future.de>
Subject: Re: Ethernet-Brigde-netfilter-HOWTO
On Monday 02 September 2002 00:39, Nils Radtke wrote:
> Will the revision of the nf-debug code in br-nf be subject of improvement?
I must admit I haven't been running any kernel with netfilter debugging
lately. It sure used to give false positives a few months ago (the bridge
mailing list has posts about that), I've been lacking time to see why and if
it is still the case. It's on my todo list.
[...]
但是(在撰写本文 2002-09-19 时),我没有找到官方公告,这个特定 bug 已经关闭。因此,如果您对此修复感兴趣,请持续关注以太网桥邮件列表上的这个主题。
James Dinkel (jdinkel_ @ _gmail.com) 在 2005 年 3 月 8 日星期二 10:59:22 -0600 写道
[...]
I am using Fedora Core 3 and all I had to do was "yum install bridge-utils"
to use the brctl command. I didn't have to do any kernel recompiling or
configurations or messing with kernel modules.
It was very easy.
[...]
可以通过电子邮件联系 Howto 作者。
Howto 作者的主页.
以太网桥邮件列表
Linux 内核以太网桥主页
Bridge-STP-HOWTO
免费防火墙,Shawn Grimes
ebtables,sourceforge
ebtables,支持的功能
ebtables,示例:基本,高级
IP 模式,LVS
高可用性 Linux
LVS