我在一台机器上有多个网络接口。我想知道如何将网络接口绑定到应用程序。
示例:网络接口: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,我想出于不同的原因使用我的公共接口。
对于这个目的来说,上述库运行良好!
一个解决方案是:
- 创建新用户
- 对该特定用户的所有数据包进行 header-mangle
- 以该用户的身份运行程序,仅仅“有效绑定”到所需的界面似乎……相比之下,是一种丑陋的黑客行为。
或者:
- 创建新用户 SuperFluous
- 让 SuperFluous 使用不同的路由表
- 以用户 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