我在Linux PC上有两个网络接口,我需要手动设置给定进程将使用的接口。
该程序(Twinkle软电话)没有类似的选项,因此我认为必须在外部进行设置。
我该怎么做?
编辑:我不是要使服务器进程绑定到特定的接口,而是要使客户端程序使用特定的接口与服务器联系。
我在Linux PC上有两个网络接口,我需要手动设置给定进程将使用的接口。
该程序(Twinkle软电话)没有类似的选项,因此我认为必须在外部进行设置。
我该怎么做?
编辑:我不是要使服务器进程绑定到特定的接口,而是要使客户端程序使用特定的接口与服务器联系。
Answers:
您可以在运行时使用LD_PRELOAD替换代码(@windows您可以使用一种类似的技术,称为detours,相当不错)。这样做是为了通知动态链接器首先将所有库加载到要运行的进程中,然后在其上面添加更多内容。您通常这样使用它:
% 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
类似的技巧和工具:
force_bind
Catalin M. Boie 的项目支持ipv6
ip netns可以做到这一点。
TL; DR: 创建网络名称空间,将接口与它们关联,然后运行“ ip netns exec NAME cmd ...”
只需检查您的发行版是否支持ip netns ...(回溯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不控制进程使用的路由。它将使用第一条路线。
并且由于它始终使用相同的路由,因此它将默认为注册到该路由的接口。(这不是我们想要的)
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
我认为不可能强迫一个进程使用某个接口。
但是,我认为您可能可以使用ipchain / iptables并强制您的进程正在侦听的某个端口只会使数据包通过特定的接口进入。
有用的HOWTO:http : //tldp.org/HOWTO/IPCHAINS-HOWTO.html
基于@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 &
注意I: “ sudo”命令中的“ -b -u”标志允许应用程序使用您的用户(而不是“ root”)运行,并在后台释放终端。该2> /dev/null 1> /dev/null &
代码段用于防止在终端上打印“ [APP_NAME]”的输出。
注II: ip“ 10.1.1.10”和“ 10.1.1.1”的值是任意的。
注意三:要为我工作,我必须运行dhcpcd [INTERFACE_NAME]
命令。
要删除名称空间,请使用...
ip netns del [INTERFACE_NAME]_ns
... 要么...
ip -all netns delete
...删除存在的任何内容。
使用ld_preload强制接口网关https://github.com/Intika-Linux-Network/App-Route-Jail
我们需要找到网络接口正在使用的网关,然后将该网关强制到我们监禁的应用程序,从而强制该应用程序绑定到特定的网络接口
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
192.168.1.1
用作强制网关,此路由规则不会影响其他应用程序,例如,如果您想在系统启动时仅执行一次此操作每天使用此解决方案ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
MARK=10 LD_PRELOAD=./mark.so firefox
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me
Firejail https://firejail.wordpress.com/可以强制应用程序使用特定的网络,但兼容性有限。
firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1
为什么要让程序使用与服务器连接的接口以外的接口来与该服务器通信?而且,如果系统未使用连接到服务器的接口与该服务器进行通讯,则是系统级(路由表)问题,并且与要与该服务器进行通讯的进程无关。
IP网络上的不同服务器具有不同的IP地址。内核应根据路由表知道要使用哪个接口来到达特定的IP地址。如果您试图与具有相同IP地址的两个不同的服务器进行通信,则系统会感到困惑(因为,除其他外,它仅按目标地址在内部为连接编制索引)。您可以使它工作,但这是系统级的修复,涉及将一台服务器置于单独的逻辑网络中,该逻辑网络仅通过软件NAT连接到计算机。
因此,如果它们具有不同的IP地址,请使用路由选择正确的接口。如果它们具有相同的IP地址,则需要使用NAT,以便它们对于系统而言似乎具有不同的IP地址。