![Linux 服务器作为非管理型交换机](https://linux22.com/image/764577/Linux%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%9C%E4%B8%BA%E9%9D%9E%E7%AE%A1%E7%90%86%E5%9E%8B%E4%BA%A4%E6%8D%A2%E6%9C%BA.png)
我有一台小型 Ubuntu x64 服务器,它为我的家庭网络提供 dhcp、命名、文件等服务。它只需连接到旁边的非托管 SOHO 交换机即可工作。但是,它在 PCIe 插槽中有未使用的 4xGbE i350 NIC 卡,我想用这个 NIC 代替当前的交换机。如果它也是像当前专用设备一样的普通非托管交换机,它可能没有任何优势,但我想学习一些东西(我以后可能会把它变成托管交换机,也许可以实现一些 IPS/IDS 和其他东西)。我很惊讶地发现我不知道怎么做。当然,我做了一些搜索,但它让我更加困惑。首先,为什么所有的操作指南和文章都配置桥接来实现交换?对于非托管交换机,所有端口都是平等的,没有 IP,其中一个通向网关。在 Linux 服务器上创建它是否可行(考虑到小型交换机的低价,忽略它可能不是很有用)?
答案1
使用桥接驱动程序。
网桥是第 2 层交换机的软件实现,其中添加到网桥的每个接口都是一个交换端口。
假设您有 4 个 i350 端口,br0
并插入了另外两台 PC:
[ Remote PC A - MAC aa:aa:aa:aa:aa ] ---- [ i350 #1 ] ---- .------------.
[ i350 #2 ] ---- | Linux PC |
[ i350 #3 ] ---- | bridge br0 |
[ Remote PC B - MAC bb:bb:bb:bb:bb ] ---- [ i350 #4 ] ---- '------------'
远程 PC A 尝试访问远程 PC B。
ff
PC A 将使用自己的源 MAC地址(全部)向广播目标 MAC 地址(全部aa
)进行 ARP 。
网桥将接收该 ARP 请求并获悉 MACaa
已关闭桥接端口i350 #1
。
然后,网桥将该广播转发到所有其他 i350 端口,因为这是交换机接收到广播数据包时的正确行为。
远程 PC B 收到该 ARP,并向 PC A 发送一个回复,回复内容为 PC A 的目标 MAC 地址(全部aa
)以及自己的源 MAC 地址(全部bb
)。
网桥将收到该 ARP 答复并获悉 MACbb
已关闭桥接端口i350 #4
。
网桥看到目标 MAC 是aa
,并且网桥知道该 MACaa
在端口可用i350 #1
,因此将帧从该 NIC 发送出去。
你能向网桥添加 IP 地址并像常规网络接口一样使用它,用它进行路由、NAT 等,但您不必这样做。
即使net.ipv4.ip_forward=0
设置了内核可调参数,也会发生上述情况,因为桥接驱动程序没有执行 IP 转发、IP 路由或 IP NAT,而是像任何其他非托管第 2 层交换机一样执行第 2 层数据包交换。
如果您要将网桥连接到更大的网络,您还可以在网桥上运行生成树。
您说您正在使用 Ubuntu。以下内容应适用于使用 NetworkManager 的 Ubuntu 20.04:
/etc/NetworkManager/system-connections/br0.nmconnection
[connection]
id=br0
type=bridge
interface-name=br0
permissions=
[bridge]
stp=false
[ipv4]
dns-search=
ignore-auto-dns=true
ignore-auto-routes=true
method=disabled
never-default=true
[ipv6]
addr-gen-mode=stable-privacy
dns-search=
ignore-auto-dns=true
ignore-auto-routes=true
method=ignore
never-default=true
[proxy]
对每个名为 的 i350 重复此文件netX
,使用每个 NIC 的正确 MAC 地址:
/etc/NetworkManager/system-connections/netX.nmconnection
[connection]
id=netX
type=ethernet
interface-name=netX
master=br0
metered=2
permissions=
slave-type=bridge
[ethernet]
mac-address=xx:xx:xx:xx:xx:xx
mac-address-blacklist=
[bridge-port]