网关上基于客户端的路由

网关上基于客户端的路由

我有一个带有两个接口的网络网关(Debian):eth0 和 tun0。一般来说,来自所有客户端的所有流量都通过 tun0 路由。

我想通过以下方式改变它:

  • 客户端 a 的流量仅通过 eth0 路由
  • 客户端 b 的流量仅通过 tun0 路由
  • 所有其他客户端都通过 tun0(如果存在)路由,并且通过 eth0(如果 tun0 不可用)路由

我目前正在使用 iptables 来路由来自网关本身的特定流量,并且不知道如何将其更改为“基于客户端”的路由。

- - 更新 - -

  • 客户端 A 将拥有静态 IP 地址
  • 客户端 B 将拥有静态 IP 地址
  • eth0 有一个动态 IP 地址
  • tun0 有一个动态 IP 地址

答案1

正如用户 Ferenc 已经提到的,策略路由可能是最好的解决方案。

看一下ip rule,它通常看起来像这样:

# ip rule
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default

这是规则优先级的排序列表,后跟规则规范。localmaindefault是要查看的路由表。要查看特定的路由表,请运行ip route show table <table>或简而言之ip r s t <table>

为了将不同的源 IP 路由到不同的目标或不同的设备,我们需要单独的路由桌子和路由规则跳入这些表。

假设我们希望有一条针对 IP 10.0.0.42 的特殊路由和一条针对网络 10.0.0.128/25 的特殊路由。我们必须创建两个额外的规则和另外两个桌子,顺序无关紧要。让我们创建规则。例子:

# ip rule add from 10.0.0.42 lookup 300 prio 5
# ip rule add from 10.0.0.128/25 lookup 301 prio 6

让我们看看它们:

# ip rule
0:  from all lookup local 
5:  from 10.0.0.42 lookup 300 
6:  from 10.0.0.128/25 lookup 301
32766:  from all lookup main 
32767:  from all lookup default

300301是我们的表名称(表通常只是数字,但也可以通过将它们添加到 来命名/etc/iproute2/rt_tables)。其余的应该是不言自明的。

现在我们需要填写这些表格。例子:

# ip route add default via 10.0.0.1 dev eth1 table 300
# ip route add 192.168.178.0/24 dev eth2 table 301

让我们看看它们:

# ip route show table 300
default via 10.0.0.1 dev eth1 scope link 
# ip route show table 301
192.168.178.0/24 dev eth2 scope link

如您所见,可以添加您喜欢的任何路线。来自地址 10.0.0.42 的系统现在将通过 eth1 通过 10.0.0.1 进行路由。来自网络 10.0.0.128/25 的系统现在将通过 eth2 进行路由如果它们的目标地址是内部网络 192.168.178.0/24。

如果没有与您的特殊路由表匹配的路由,则会评估下一个路由规则。例如,如果来自网络 10.0.0.128/25 的系统不想路由到 192.168.178.0/24,那么它们会回退到主表。

如果您想删除任何规则,只需替换adddel.路由表将一直存在,直到您删除所有路由(例如通过运行)ip route flush table <table>。如果你想看全部然后简单地运行路由规则ip route show table all

路由规则非常灵活,您可以使用各种其他选择器,例如传入/传出接口、源/目标端口和协议。man ip rule详情请参阅。

通过 SSH 编辑路由和规则时,请注意不要将自己锁定。

相关内容