我有一个带有两个接口的网络网关(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
这是规则优先级的排序列表,后跟规则规范。local
、main
和default
是要查看的路由表。要查看特定的路由表,请运行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
300
和301
是我们的表名称(表通常只是数字,但也可以通过将它们添加到 来命名/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,那么它们会回退到主表。
如果您想删除任何规则,只需替换add
为del
.路由表将一直存在,直到您删除所有路由(例如通过运行)ip route flush table <table>
。如果你想看全部然后简单地运行路由规则ip route show table all
。
路由规则非常灵活,您可以使用各种其他选择器,例如传入/传出接口、源/目标端口和协议。man ip rule
详情请参阅。
通过 SSH 编辑路由和规则时,请注意不要将自己锁定。