多网卡同一子网

多网卡同一子网

我有一个如图所示的设置。我知道这很疯狂,但我只需要在这个配置上工作。

它基本上是一个ubuntu 服务器作为路由器有 4 个接口。其中 3 个(eth0、eth1 和 eth3)分别作为 PC1、PC2 和 PC3 的网关。

我希望电脑通过它们访问互联网,并设置 iptable 规则以在 ubuntu 服务器上建立防火墙。


                              -----
                             | PC1 |10.1.0.101/16 (gw & dns-10.1.0.20)
                              ----- 
                                |
                           eth1 |10.1.0.20/16
                         ---------------
                        |               |
                   eth0 |    Ubuntu     | eth2         ----- 
10.1.5.244 -------------|    Server     |-------------| PC2 |10.1.0.102/16
(Router)    10.1.0.10/16|               |10.1.0.30/16  ----- (gw & dns-10.1.0.30)
                         ---------------            
                           eth3 |10.1.0.40/16
                                |
                              -----
                             | PC3 |10.1.0.103/16
                              ----- (gw & dns-10.1.0.40)

eth0 - connected to router (internet connected interface - gw=10.1.5.244)
       inet addr:10.1.0.10  Bcast:10.1.255.255  Mask:255.255.0.0
eth1 - inet addr:10.1.0.20  Bcast:10.1.255.255  Mask:255.255.0.0
eth2 - inet addr:10.1.0.30  Bcast:10.1.255.255  Mask:255.255.0.0
eth3 - inet addr:10.1.0.40  Bcast:10.1.255.255  Mask:255.255.0.0

$route -n 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.1.5.244      0.0.0.0         UG    0      0        0 eth0
10.1.0.0        *               255.255.0.0     U     0      0        0 eth2
10.1.0.0        *               255.255.0.0     U     0      0        0 eth1
10.1.0.0        *               255.255.0.0     U     0      0        0 eth3
10.1.0.0        *               255.255.0.0     U     0      0        0 eth0

我已经通过以下 arp 配置解决了 ARP 通量问题。

echo "1" > /proc/sys/net/ipv4/conf/all/arp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

另外,我在 3 个接口 eth1、eth2 和 eth3 上设置了 IP 路由,如下所示 eth2。

echo "152 table2" >>/etc/iproute2/rt_tables
ip route add default via 10.1.0.10 dev eth0 table table2
ip route add 10.1.0.0/16 dev eth2 table table2
ip rule add from 10.1.0.30 table table2
ip rule add to 10.1.0.30 table table2

我不确定 eth0 上的 IP 规则。

通过上述配置,我能够将 PC1、PC2 和 PC3 连接到单独的接口 eth1、eth2、eth3(解决 arp 通量问题)。

但是我无法在 PC1 和 PC3 上连接到互联网。

看起来返回的数据包仅被路由到 eth2(路由 -n 中 10.1.0.0/16 子网的第一个条目),无论源自 PC1、PC2 还是 PC3。 (我也一直rp_过滤器=1因为我只想使用相应的传出接口。)

所以我的问题是如何将返回数据包路由到相应的接口,或者如何仅从相应的接口访问 PC 上的互联网。

答案1

看起来您正在尝试强制路由器执行交换机的工作……但为什么不将服务器变成真正的交换机呢?

您可以使用 Ubuntu 中的网络桥接解决方案来桥接所有接口,然后将服务器用作透明防火墙,而无需任何第 3 层接口参与从 PC 到 Internet 的流量。

看这里 :https://help.ubuntu.com/community/NetworkConnectionBridge

或者,使其成为一个实际的路由器,但在这种情况下将您的 /16 分成更小的子网,以便每台 PC 都在自己的子网上,然后在服务器和 Internet 网关之间有一个最终子网。

答案2

Linux Netfilter 能够将桥接流量传递到 iptables 规则表中进行检查。有特殊的表达式可以匹配特定的物理接口(因为在这种情况下,您在 -i 或 -o 中指定的逻辑接口将始终是桥接接口)。

要启用此功能,您必须根据需要设置这些 sysctl 变量(在sysctl.conf、中的某个文件sysctl.conf.d、将 1 回显到 /proc 中的某个文件中等等):

net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

每个选项的含义是不言而喻的。这些键仅在bridge加载内核模块后出现,例如,使用modprobe bridge

然后建造一座通常的桥:

auto eth0
iface eth0 inet manual

auto eth1
iface eth1 inet manual

auto eth2
iface eth3 inet manual

auto br0
iface br0 inet static
    address 10.1.0.10
    netmask 255.255.0.0
    broadcast 10.1.255.255
    network 10.1.0.0
    bridge_ports eth0 eth1 eth2
    bridge_stp off
    bridge_fd 0

请注意,您不需要拥有路由器的多个 IP 地址。Bridge 就像一个非常智能的开关。

此后,您可以使用 physdev 模块过滤您的流量:

iptables -A FILTER -m physdev --physdev-in eth0 -s 10.0.1.2 -j DROP

此示例规则将丢弃从 10.0.1.2 通过 eth0 进入路由器的任何流量。

用于iptables -m physdev --help查看其所有功能。

Netfilter 中还有其他专门用于处理桥接流量的功能。这些功能由另一个名为 的用户空间实用程序实现ebtables。它们允许进行 MAC 地址伪装和转换、brouting 等;有关详细信息,请阅读 ebtables 手册。

相关内容