我们需要 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
几乎所有发行版都为你提供一些运行级别检查器或等效工具,以帮助你完成管理运行级别链接的繁琐工作。请查阅你的发行版文档。update-rc.d
,Red Hat 及其后续版本有 chkconfig
。最后,SuSE 显然也有自己的工具(我不容易记住名字..)。bridge.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
最后,确保你的桥接在无人值守的重启后仍然存在。这和备份的故事一样:你应该在需要它之前测试它。