我想知道我是否有一个具有 2 个网络接口(1.1.1.1 和 2.2.2.2)并且 1.1.1.1 设置为主网络接口的 VPS...
eth0 = 1.1.1.1
eth0:1 = 2.2.2.2
现在我想将 domain.com 的所有流量(我不知道该域名是否使用 Cloudflare)路由到 IP 2.2.2.2 eth0:1
示例1:
如果运行,
wget domain.com
它将通过 2.2.2.2 eth0:1,
但如果运行,wget google.com
它将通过 1.1.1.1 eth0
ex2:
如果我访问“whatismyip.com”通过 eth0,它会显示我的 IP 是“1.1.1.1”,
但如果我访问“whatismyipaddress.com”,它会通过 eth0:1,所以它会显示我的 IP 是“2.2.2.2”
答案1
有几件事需要考虑:
Linux路由不处理域名
Linux 上有很多路由配置选项,但没有一个接受裸域名。毕竟,我们讨论的是 IP 路由。因此必须为 IP 地址定义规则,当域的 DNS 记录发生变化时,这些规则显然会“失效”。
界面偏好
在这种情况下,有 2 个接口提供到同一子网 (0.0.0.0/0,即 Internet) 的路由。为了告诉内核优先使用特定接口,我们需要应用基于策略的路由 (PBR)。
顾名思义,基于策略的路由通过定义策略(又称“规则”)来确定使用哪个接口。如果没有策略,内核将选择与目标网络匹配的第一个路由。
路线、规则、表格
内核使用路由来确定如何处理数据包。路由是一个简单的定义,其中包括目标地址和要使用的链接(接口)。
路线被分组在tables
,使用哪个表取决于定义的策略。
规则policy
告诉内核要检查哪个表来路由数据包。策略的定义包括要检查的数据包的源、目标和路由表。
显示当前路线和政策
要显示系统当前使用的路由,请执行
ip route
这将显示路由表中的所有条目main
。可以通过运行 来访问其他表ip route show table <tablename>
。
要显示当前使用的策略,请执行
ip rule
这列出了内核使用的所有策略/规则。它们从上到下迭代,直到一条规则与正在处理的数据包匹配。
例子
echo "101 out1" >> /etc/iproute2/rt_tables
ip rule add from all to 3.4.5.6 table out1
ip route add default via 10.0.0.1 dev eth0 src 1.1.1.1 table out1
ip route add 10.0.0.0/8 dev eth0 src 1.1.1.1 table out1
这些命令将创建一个新的路由表out1
并将其添加10.0.0.1
为访问互联网的网关。前往的流量3.4.5.6
(需要替换为目标域的实际解析 IP 地址)将通过表中定义的默认网关发送out1
,使用指定的设备eth0
和 IP 1.1.1.1
。
我建议阅读一些现有的教程和指南来熟悉术语。搜索iproute2
和linux advanced routing and traffic control
。
最后,但并非最不重要的一点:在将更改应用于实时系统之前,请先测试它们。错误确实会发生,我个人更喜欢使用虚拟机而不是远程服务器。