如何为不同的进程使用不同的网络接口?

如何为不同的进程使用不同的网络接口?

我在 Linux PC 上有两个网络接口,我需要手动设置给定进程将使用的接口。

该程序(Twinkle 软件电话)没有类似的选项,所以我认为必须在外部进行设置。

我该怎么做?

编辑:我并不是想让服务器进程绑定到特定接口,而是让客户端程序使用特定接口联系服务器。

答案1

你可以在运行时使用以下代码替换代码LD_预加载(@windows 你可以使用类似的技术绕行,相当花哨)。它的作用是通知动态链接器首先将所有库加载到要运行的进程中,然后在其上添加一些库。您通常像这样使用它:

% LD_PRELOAD=./mylib.so ls

通过这种方式,你可以改变现状ls

对于你的问题我会尝试http://www.ryde.net/code/bind.c.txt,你可以像这样使用:

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

构建方法如下:

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

更长的指南是http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

类似的技巧和工具:

答案2

ip netns 可以做到这一点。

总结: 创建网络命名空间,将接口关联到它们,然后运行“ip netns exec NAME cmd...”

只需检查你的发行版是否支持 ip netns...(Backtrack 5r3 不支持,而 Kali 支持;))

详细信息:

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

为什么这比通过 LD_PRELOAD 绑定 IP 更好?因为 LD_PRELOAD 不控制进程使用的路由。它将使用第一个路由。

并且由于它总是使用相同的路由,它将默认使用注册到该路由的接口。(这不是我们想要的)

答案3

根据@olivervbk 的回答,以下是我的!

以“root”身份运行所有命令。

使用命令...

ip a

...找出您想要使用的网络接口的名称。

运行以下命令作为模板...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME]-替换为所选网络接口的名称。
  • [YOUR_USER] – 替换为您的用户名。
  • [APP_NAME] - 将在命名空间“[INTERFACE_NAME]_ns”中执行的应用程序的名称。例如:“firefox”。

注一:-b -u“”命令中的“”标志允许sudo应用程序使用您的用户(而不是“root”)在后台运行并释放终端。该2> /dev/null 1> /dev/null &代码片段是为了防止在终端上打印“[APP_NAME]”的输出。
注二:ip“10.1.1.10”和“10.1.1.1”的值是任意的。
注三:为了工作我必须运行该dhcpcd [INTERFACE_NAME]命令。

要删除命名空间,请使用...

ip netns del [INTERFACE_NAME]_ns

... 或者...

ip -all netns delete

...删除所有已存在的。

答案4

我认为不可能强制某个进程使用某个特定的接口。

不过,我认为您可以使用 ipchain/iptables 并强制您的进程正在监听的某个端口只获取通过特定接口传来的数据包。

有用的方法: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

相关内容