让任意 Linux 应用程序使用特定 IP 地址进行出站连接

让任意 Linux 应用程序使用特定 IP 地址进行出站连接

拥有多个 IP 地址,是否可以让任意网络应用程序在与外界建立连接时仅使用特定的 IP 地址?

系统范围内,可以使用路由。有些应用程序可以为此配置。但是有没有通用的方法呢?

比如,浏览器应该始终使用绑定到“eth0”的 IP,而 torrent 客户端应该使用绑定到“eth1”的 IP。

技术上,这应该bind(2)在创建客户端套接字时明确传递一个特定的 IP 地址来调用。

答案1

您可以利用 LD_PRELOAD 环境变量和“函数干预”来修改网络程序的行为。请参阅本文举个例子,谷歌函数插入了解更多信息。

例如,您可以覆盖“socket”系统调用,以便每个 socket() 调用后面都跟着一个适当的 bind() 操作。

注意:这种技术玩起来很有趣(例如,我曾经写过一些东西,可以让我“打开” URL 并使用任意文本编辑器进行编辑),但要正确使用却有点棘手。

答案2

我唯一的建议是利用 iptables 将流量从一个接口重定向到另一个接口。

以下是其他人做过类似事情的链接:http://straylink.wordpress.com/2006/08/16/using-iptables-to-redirect-packets/

本质上,命令是这样的:

iptables -t nat -A PREROUTING -p tcp -d 198.168.1.254 --dport 80 -j REDIRECT --to-ports 8080

为了彻底窃取内容(以防内容消失),

上述规则将 PREROUTING 命令添加到你的 nat 表中,规定任何发往 192.168.1.254 端口 80 的 TCP 数据包都应重定向到本地主机端口 8080。因此,将上述示例分解为模板格式,你有

 iptables -t nat -A PREROUTING -p PROTO -d DEST_IP --dport DEST_PORT -j REDIRECT --to-ports LOCAL_PORTS

相关内容