绑定到ruby中的网络接口

绑定到ruby中的网络接口,ruby,Ruby,我试图在linux的不同网络接口上打开ruby应用程序中的多个套接字。例如,假设我有IP为192.168.1.2的接口eth0和IP地址为10.0.0.2的接口wlan0。我想同时连接到一个服务器,每个接口上都有一个套接字。我认为绑定到这些接口的IP地址会起作用,但事实似乎并非如此。在wireshark中,当我绑定到wlan0的IP时,我成功地看到SYN数据包使用正确的源IP发送,但wireshark在eth0上看到它们,并且套接字从未打开 Ruby版本:Ruby 1.9.3p194(2012-

我试图在linux的不同网络接口上打开ruby应用程序中的多个套接字。例如,假设我有IP为192.168.1.2的接口eth0和IP地址为10.0.0.2的接口wlan0。我想同时连接到一个服务器,每个接口上都有一个套接字。我认为绑定到这些接口的IP地址会起作用,但事实似乎并非如此。在wireshark中,当我绑定到wlan0的IP时,我成功地看到SYN数据包使用正确的源IP发送,但wireshark在eth0上看到它们,并且套接字从未打开

Ruby版本:Ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-linux]

这是我目前的代码。我还尝试了ruby doc页面上为Socket记录的Addrinfo方法,得到了相同的结果

require 'socket'

ip = "192.168.1.2" # IP of internal interface
port = 8000
server = "" # IP of the server I'm trying to connect to goes here

lhost = Socket.pack_sockaddr_in(0, ip)
rhost = Socket.pack_sockaddr_in(port, server)
socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
socket.bind(lhost)
socket.connect(rhost)
谢谢你的帮助

解决方案是基于源代码的路由 我想我应该留下我的答案,以防其他人在路上遇到这个问题

我需要做的是基于源代码的路由。一般的想法是创建两个路由表,一个在一个接口上强制流量,另一个在另一个接口上强制流量,并具有一个基于源ip地址使用适当路由表的ip规则。我是这样设置的:

创建表 首先,我必须编辑
/etc/iproute2/rt_表
,添加以下行:

128    multiplex0
129    multiplex1
这创建了两个ID分别为
128
129
的路由表,称为
multiplex0
multiplex1

向表中添加路由 接下来,我为这些表创建了如下规则:

ip route add default via 10.0.2.2 table multiplex0 
ip route add default via 192.168.1.1 table multiplex1
这些命令指定要在路由表中使用的默认网关。我的10.0/16网络的默认网关为10.0.2.2,我的192.168.1/24网络的默认网关为192.168.1.1

如果这两个网络具有相同的默认网关会怎样? 如果您的网络具有相同的默认网关,我相信您可以在上述命令中添加
dev eth0
(或任何您的接口),以指定接口,尽管我尚未对此进行测试。当我了解更多信息时,我将进行编辑

编辑:我已经测试过了,它确实有效。如果在路由中指定接口,则两个路由可以具有相同的默认网关

基于源代码的规则 接下来,我需要创建使用这些表的规则:

ip rule add from 10.0.0.0/16 table multiplex0
ip rule add from 192.168.1.1/24 table multiplex1
这些规则表示,源IP在10.0/16范围内的任何数据包都应根据multiplex0中的规则进行路由,而源IP在192.168.1/24范围内的任何数据包都应使用multiplex1。当数据包使用这些表时,它们被定向到适当的网关和相应的接口。中提琴

编辑:在这一步中只指定网络接口的IP更准确!例如,如果两个接口都位于192.168.1/24网络上,那么这是必要的

刷新缓存
最后,我发布了
iproute flush cache
以使一切生效,使用上面的ruby代码,我能够在正确的接口上打开两个套接字到同一个可公开路由的主机。

这可能是内核正在做的事情。通常人们使用lan或wifi,但不是同时使用两者。在查看内核路由表时,我注意到我有一个网关用于0.0.0.0,所以我猜你是对的,内核强制所有流量通过一个网关。这也可以解释wireshark的结果。我将不得不尝试添加另一个路由,尽管我不确定这两个连接是否都要连接到同一个外部IP。也许路由可以通过默认网关?