桥接接口上的基于策略的路由

桥接接口上的基于策略的路由

我目前正在设置具有 2 个网络接口的 Ubuntu 12.04。eth0 位于 LAN_USERS (192.168.5.0/24) 上,供用户使用,eth1 位于 LAN_INFRA (10.0.4.0) 上,供管理使用。此外,我在 eth1 上设置了一个网桥。

cat /etc/network/interfaces

auto eth0
iface eth0 inet static
  address 192.168.5.180
  netmask 255.255.255.0
  network 192.168.5.0
  broadcast 192.168.5.255
  gateway 192.168.5.1

auto eth1
iface eth1 inet manual

auto br1
iface br1 inet static
  address 10.0.4.5
  netmask 255.255.255.0
  network 10.0.4.0
  broadcast 10.0.4.255
  gateway 10.0.4.1
  bridge_ports eth1
  bridge_stp on
  bridge_fd 0
  bridge_waitport 0
  1. 从 Ubuntu 12.04 开始,反向路径过滤已启用(rp_filter=1)
  2. 的输出# route -n为:
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.5.1     0.0.0.0         UG    100    0        0 eth0
    10.0.4.0        0.0.0.0         255.255.255.0   U     0      0        0 br1   
    192.168.5.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
    

由于反向路径过滤,br1 对 10.0.4.0 以外的网络不可见。我可以禁用反向路径过滤,但我决定设置基于策略的路由。

基于策略的路由

  1. echo "250 infra >> /etc/iproute2/rt_tables
  2. ip rule add iif br1 table infra
  3. ip route add to default dev br1 table infra
  4. 内核配置变量:CONFIG_IP_ADVANCED_ROUTER=y 和 CONFIG_IP_MULTIPLE_TABLES=y
  5. net.ipv4.ip_forward = 0
  6. net.ipv4.conf.eth1.rp_filter = 1
  7. net.ipv4.conf.br1.rp_filter = 1
  8. net.ipv4.conf.all.log_martians = 1

而且它不起作用......

我该如何调试我的 PBR 规则?我的设置有什么明显的错误吗?

干杯

更新:我需要将来自 br1 的数据包的答案再次通过 br1 而不是 eth0 路由出去。我最简单的用例是:由于默认路由和 rp_filter=1,从 192.168.5.10 到 10.0.4.5 的 ping 未返回。它们被丢弃为火星数据包。

答案1

您的配置说:“如果数据包已到达 br1,则通过 br1 发送。”这显然没有意义。这样的规则适用于路由器,但您甚至没有提到路由。

您的意思是:“发送对通过 br1 到达 br1 的数据包的回复数据包。”这可以通过 Netfilter 的数据包标记和选项 来完成ip rulefwmark但在这里这没有意义。因为您使用 rp_filter,所以您可以简单地通过目标地址进行路由。您甚至不需要高级路由(ip rule)。为此。普通的普通路由应该可以完成这项工作:“通过 br1 发送 10.0.4.0/24,其余通过 eth0。”

您解释了您所做的工作,但没有提到任何需要复杂设置的任务。如果您“不做任何特别的事情”,那么会发生什么问题?

相关内容