通过特定接口路由应用程序流量

通过特定接口路由应用程序流量

这是第一个问题,请放心:

我有一台具有两个公共接口的 Debian Linux 5.0 服务器。我想通过一个接口路由应用程序的一个实例的出站流量,并通过第二个接口路由第二个实例的出站流量。存在一些挑战:

  • 应用程序的两个实例都使用相同的协议
  • 应用程序的两个实例都可以访问整个互联网(无法根据目标网络进行路由)
  • 我无法更改应用程序的代码
  • 我认为对所有流量进行负载平衡的典型方法不会很好地发挥作用,因为在出​​站流量中访问的目标服务器相对较少,并且所有流量实际上需要在这些相对较少的服务器上均匀分布。

我可能可以在机器上运行两个虚拟化服务器并将它们分别绑定到不同的接口,但我正在寻找一个更简单的解决方案,也许使用 iproute 或 iptables?

有什么想法吗?提前谢谢您 - 我很乐意回答任何问题。

答案1

您是否查看过owneriptables 中的模块,可能与源 NAT 规则相结合?

这使您可以OUTPUT根据 UID、GID、PID、SID 和命令名称设置链规则。

答案2

Linux 支持将应用程序绑定到特定 IP(例如 Apache 使用)。如果您的应用程序不支持此功能,那么您就倒霉了。

我不知道有任何 Linux 内核模块(因为这是您需要的)可以将特定应用程序绑定到接口,即使它尝试绑定到 *。使用虚拟机是一种可能性。

如果没有应用程序支持,我能想到的最接近你要求的就是以太网接口绑定(http://www.cyberciti.biz/howto/question/static/linux-ethernet-bonding-driver-howto.php)。但是这样你就只能在具有相同 IP 的多个接口上运行该应用程序的一个实例。

答案3

我认为最好的选择是将每个应用程序绑定到不同的 IP,并使用基于源的路由来更改来自该源 IP 的数据包通过哪个接口传出。

总体思路是,您可以创建多个并行路由表(“ip route” 有一个可选的“table”参数)。然后添加一条规则,说明“如果它来自 IP [xxxx],则使用表 [foo]”。

所以:

  • 在 /etc/iproute2/rt_tables 中创建路由表 [foo1, foo2]
  • 填充路由表(类似于“ip route add default gateway 1.2.3.4 dev eth0 table foo1”,对 foo2 也同样如此)
  • 创建规则来根据源 IP 指定使用哪个表 - “ip 规则从 1.2.3.2/32 表 foo1 添加”、“ip 规则从 1.2.3.3/32 表 foo2 添加”。

我没有专门测试过这些例子,但我过去曾成功使用过类似的例子。

相关内容