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

And*_*ini 71 networking linux

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

该程序(Twinkle softphone)没有类似的选项,所以我认为它必须在外部设置。

我该怎么做?

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

aki*_*ira 54

您可以在运行时使用LD_PRELOAD替换代码(@windows 您可以使用类似的技术detours,非常花哨)。这样做是通知动态链接器首先将所有库加载到您要运行的进程中,然后在其上添加更多库。你通常像这样使用它:

% LD_PRELOAD=./mylib.so ls
Run Code Online (Sandbox Code Playgroud)

然后你改变了ls它的作用。

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

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle
Run Code Online (Sandbox Code Playgroud)

这是您构建它的方式:

% 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
Run Code Online (Sandbox Code Playgroud)

更长的操作方法是http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

类似的技巧和工具:

  • 哇,什么鬼。+1 (10认同)
  • 如果您的有效 UID 与您的真实 UID 不同,LD_PRELOAD 将被忽略。 (4认同)

oli*_*vbk 41

ip netns 可以做到这一点。

TL;DR: 创建网络命名空间,将接口关联到它们,然后运行“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
Run Code Online (Sandbox Code Playgroud)

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

并且因为它总是使用相同的路由,所以它会默认使用注册到路由的接口。(这不是我们想要的)

  • 如果 eth0 是公共网络接口,请不要在远程服务器上执行此操作。 (4认同)
  • 请尝试在您的答案中添加更多详细信息。 (2认同)

小智 3

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

但是,我认为您可能可以使用 ipchain/iptables 并强制您的进程正在侦听的某个端口仅接收通过特定接口发送的数据包。

有用的指南: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html

  • 两个得票率较高的帖子证明事实并非如此。 (7认同)