我目前正在设置具有 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
- 从 Ubuntu 12.04 开始,反向路径过滤已启用(rp_filter=1)
- 的输出
# 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 以外的网络不可见。我可以禁用反向路径过滤,但我决定设置基于策略的路由。
基于策略的路由
echo "250 infra >> /etc/iproute2/rt_tables
ip rule add iif br1 table infra
ip route add to default dev br1 table infra
- 内核配置变量:CONFIG_IP_ADVANCED_ROUTER=y 和 CONFIG_IP_MULTIPLE_TABLES=y
- net.ipv4.ip_forward = 0
- net.ipv4.conf.eth1.rp_filter = 1
- net.ipv4.conf.br1.rp_filter = 1
- 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 rule
。fwmark
但在这里这没有意义。因为您使用 rp_filter,所以您可以简单地通过目标地址进行路由。您甚至不需要高级路由(ip rule
)。为此。普通的普通路由应该可以完成这项工作:“通过 br1 发送 10.0.4.0/24,其余通过 eth0。”
您解释了您所做的工作,但没有提到任何需要复杂设置的任务。如果您“不做任何特别的事情”,那么会发生什么问题?