![在 Linux 上选择应用程序级别的网关](https://linux22.com/image/571927/%E5%9C%A8%20Linux%20%E4%B8%8A%E9%80%89%E6%8B%A9%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%BA%A7%E5%88%AB%E7%9A%84%E7%BD%91%E5%85%B3.png)
我想在应用程序级别决定使用哪个网关来连接互联网。
这无法通过简单的子网规则来完成,因为实际上应用程序应该能够决定使用哪个网关。
例如,我想使用 curl 下载一些东西,并且想以某种方式指定使用哪个网关。
它是一个只有一块网卡的 Linux 机器,IP 地址为 10.0.0.1。有两个或多个网关(不同的 ISP):例如 10.0.0.100 和 10.0.0.101。
是否可以使用 iptables 和 iproute2 设置路由规则来管理它?如何告诉应用程序使用哪条路由?
我尝试过这个:
我在 /etc/iproute2/rt_tables 中添加:100 out2
ip rule add prio 200 from 10.0.0.2 lookup out2
ip route add 10.0.0.0/24 dev eth0 src 10.0.0.2 table out2
ip route add default via 10.0.0.100 dev eth0 src 10.0.0.2 table out2
仍然“telnet -b 10.0.0.2 www.google.com 80”返回“网络不可达”
答案1
我能想到一种方法来做到这一点,如下所示。
- 在您的 NIC 上定义两个 IP 地址,如 10.0.0.1 和 10.0.0.2。这应该很简单直接。可以使用 来完成
ifconfig
。 - 配置基于源的路由,以便每个源 IP 都被路由到其中一个默认网关。此链接可以帮你。
- 最后,您可以告诉应用程序使用
bind
地址 10.0.0.1 或 10.0.0.2 之一。这样,您可以根据所选的源 IP 选择其中一个网关。要测试这一点,您可以使用telnet
with-b source_ip
选项。
以下是我之前用来启用基于源的路由的命令:
$ sudo ip rule add from 10.0.0.2 tab 1 priority 500
$ sudo ip route add default via 10.0.0.101 dev eth0 tab 1
$ sudo ip route flush cache
如果您将默认网关设置为 10.0.0.100,那么这应该适合您。从 10.0.0.1 发送的数据包应发送到默认网关,而从 10.0.0.2 发送的数据包应发送到第二个网关 10.0.0.101,如上所述。
答案2
另一种选择。许多 CLI 实用程序使用环境变量来进行此类配置,http_proxy 可能与您的情况相关, http://www.cyberciti.biz/faq/linux-unix-set-proxy-environment-variable/