将 IP 地址绑定到应用程序

将 IP 地址绑定到应用程序

我在一台机器上有多个网络接口。我想知道如何将网络接口绑定到应用程序。

示例:网络接口:eth0、eth1

应用程序 A 使用 dummy0 应用程序 B 使用 dummy1

是否可以将应用程序绑定到这样的接口?

用例:1 台机器有 2 个互联网连接;eth0 -> 互联网连接 0 eth1 -> 互联网连接 1

应用程序使用预定义接口 Firefox -> eth0 -> internet 连接 0 Chrome -> eth1 -> internet 连接 1

操作系统:CentOS 5.9 32位

答案1

为应用程序选择特定适配器是应用程序特定的设置。您必须确定如何在特定应用程序中完成此操作。它不能在系统级别完成。

视窗

不过,您可以在全局系统级别调整适配器的优先级。使用网络连接高级属性页面上的向上和向下箭头。

http://levynewsnetwork.wordpress.com/2011/12/01/windows-7-default-internet-connection-choice/

Linux

在 Linux 中,这个过程并不那么简单。您必须使用 来告诉 Linux 一个适配器比另一个适配器更远metric

要在 Linux 中确定适配器的优先级,您必须使用路线命令,添加具有所需度量的路由并删除旧条目。例如:

sudo route add -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 1
sudo route del -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 0

对于这两种操作系统,完成此操作后,每个应用程序将使用相同的顺序。

答案2

有一个简单的解决方案 - Daniel Ryde 编写了一个 LD_PRELOAD“垫片”库(绑定) 修改绑定行为,用于此目的。查看本教程:

https://www.x4b.net/kb/BindProcessToIPonLinux

鉴于应用程序实际上有一个默认绑定地址(请参阅路由表),我认为出色地奇怪的是,通常没有标准的方法(如“分发包代码”)来覆盖该默认接口,是的;在系统层面,适用于一组特定的应用程序。

有些程序确实有命令行选项来监听您选择的接口,这一切都很好。

我的默认路由通过 VPN 代理(肯定是一种非常常见的情况)。对于传出连接来说,这个隧道是一个很好的默认选择,但它不能很好地支持来自互联网的入站连接。因此,我需要强制面向服务器的程序 A、B 和 C 绑定到其他 IP(主 ISP 提供的地址)。对于面向客户端的程序 D,我想出于不同的原因使用我的公共接口。

对于这个目的来说,上述库运行良好!

一个解决方案是:

  1. 创建新用户
  2. 对该特定用户的所有数据包进行 header-mangle
  3. 以该用户的身份运行程序,仅仅“有效绑定”到所需的界面似乎……相比之下,是一种丑陋的黑客行为。

或者:

  1. 创建新用户 SuperFluous
  2. 让 SuperFluous 使用不同的路由表
  3. 以用户 SuperFluous 的身份运行 A、B、C;还不够好!我想以“我”的身份运行“我的”服务器(我甚至可能没有创建新用户和路由策略的权限)。

LISTEN_TO=$THIS_INTERFACE 命令;#<- 就这么简单。

答案3

虽然应用程序可以绑定到特定 IP 地址,但这是特定于应用程序的。对于您的特定示例,Chrome 和 Firefox 都支持 HTTP 代理。

您可以使用如下配置的 Squid 来让它们使用特定的 NIC。

acl browser1 localip 127.0.0.2
acl browser2 localip 127.0.0.3
tcp_outgoing_address 192.168.1.99 browser1
tcp_outgoing_address 197.6.0.1 browser2

现在 Firefox 将配置为连接到 127.0.0.2 的代理,该代理将使用 192.168.1.99 作为执行传出 TCP 请求的 NIC。

Chrome 将配置为使用 127.0.0.3 作为代理,并使用 197.6.0.1 作为传出地址。

答案4

正如 krowe 所说,它是特定于应用程序的。如果您的应用程序不支持绑定到给定的接口/IP,您可以使用 iptables (Linux) 或 ipfilter (*BSD)。

Ubuntu-Wiki 对 iptables 有一些相当不错的介绍: https://help.ubuntu.com/community/IptablesHowTo

相关内容