是否可以直接通过NIC而不是通过路由表查找(linux命令或python)发送数据

是否可以直接通过NIC而不是通过路由表查找(linux命令或python)发送数据,python,linux,sockets,iptables,Python,Linux,Sockets,Iptables,假设我在一台主机PC中有3个NIC,将它们命名为eth0、eth1和eth2 所有接口在不同的子网中都有自己的ip地址,但是,这些NIC的所有网关路由器都有到我要访问的一台服务器的路由,我要建立到该服务器的3个连接,并通过不同的NIC获得响应 我在主机PC中使用不同的度量设置静态路由,这意味着所有ethX都有到服务器的路由 是否可以直接在python中通过不同的NIC建立tcp会话,或者通过shell命令建立tcp会话,例如: s1 = socket.socket(socket.AF_INET,

假设我在一台主机PC中有3个NIC,将它们命名为eth0、eth1和eth2


所有接口在不同的子网中都有自己的ip地址,但是,这些NIC的所有网关路由器都有到我要访问的一台服务器的路由,我要建立到该服务器的3个连接,并通过不同的NIC获得响应

我在主机PC中使用不同的度量设置静态路由,这意味着所有ethX都有到服务器的路由

是否可以直接在python中通过不同的NIC建立tcp会话,或者通过shell命令建立tcp会话,例如:

s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s1.connect((HOST, PORT, eth1))         # eth1 is my fiction
# and in same program  
s0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s0.connect((HOST, PORT, eth0))         # ethO is my fiction
然后可以通过路由表查找将流量直接发送到该eth


谢谢!

问题在于路由是由目的地决定的,仅仅因为您有多条路由可用,并不意味着操作系统实际上会使用这些多条路由。您希望操作系统在确定使用哪个出站路由时考虑源地址。一旦路由正确,就可以在套接字上绑定源IP地址,这样做是正确的

在linux中,您可以通过创建多个路由表并设置基于源IP地址选择这些路由表的规则来实现这一点。一般来说,这方面的文档非常糟糕,但是搜索多个默认路由和iproute2可以帮助缩小范围。以下是一些合理的页面:


OpenBSD还支持多个路由表,我发现在配置时不需要在init脚本中插入任何东西,这会更容易一些。您甚至可以在pf.conf中执行此操作。问题是路由由目的地决定,并且仅仅因为您有多个可用路由,并不意味着操作系统实际上将使用这些多个路由。您希望操作系统在确定使用哪个出站路由时考虑源地址。一旦路由正确,就可以在套接字上绑定源IP地址,这样做是正确的

在linux中,您可以通过创建多个路由表并设置基于源IP地址选择这些路由表的规则来实现这一点。一般来说,这方面的文档非常糟糕,但是搜索多个默认路由和iproute2可以帮助缩小范围。以下是一些合理的页面:


OpenBSD还支持多个路由表,我发现在配置时不需要在init脚本中插入任何东西,这会更容易一些。您甚至可以在pf.conf中执行此操作

的可能副本。答案是C语言,但应该很容易翻译成Python。@JoachimPileborg,在本例中,SO_BINDTODEVICE是不够的,因为它没有提供每个服务器上网关路由器的地址subnet@user478514,您要连接的主机是否有多个IP地址?将一个套接字绑定到一个NIC的IP地址如何?我想与该服务器建立3个连接,并通过不同的NIC获得响应。你为什么要这样做?可能是重复的。答案是C语言,但应该很容易翻译成Python。@JoachimPileborg,在本例中,SO_BINDTODEVICE是不够的,因为它没有提供每个服务器上网关路由器的地址subnet@user478514,您要连接的主机是否有多个IP地址?将一个套接字绑定到一个NIC的IP地址如何?我想与该服务器建立3个连接,并通过不同的NIC获得响应。你为什么要这么做?