Skip to content
Advertisement

Can Python select what network adapter when opening a socket?

The target machine running the python application will have three network interfaces available to it. In general all three networks will be vastly different, however there is a possibility that two of the three could be on similar networks.

In the example below I do not have control over the destination address on ETH 2 (as it a pre-configured system), so I forced into selecting what adapter to use programmaticly.

I am fairly sure that this will fall on how the OS works with routing the connections. My hope is that there will be a platform independent way to solve the issue using python, because there is a possibility that this application will need to run on Windows 7 as well as a Linux machine.

Example Code

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.0.2', 8000)) # Which device will this connect to??

Normal Case

  • ETH 0 Source: 192.168.0.1
  • ETH 0 Destination: 192.168.0.2
  • ETH 1 Source: 10.20.30.1
  • ETH 1 Destination: 10.20.30.2
  • ETH 2 Source: 60.50.40.1
  • ETH 2 Destination: 60.50.40.1

Possible Trouble Case

  • ETH 0 Source: 192.168.0.1
  • ETH 0 Destination: 192.168.0.2
  • ETH 1 Source: 10.20.30.1
  • ETH 1 Destination: 10.20.30.2
  • ETH 2 Source: 192.168.0.3
  • ETH 2 Destination: 192.168.0.2

Additional Information
Adapters ETH0,1,and 2 are all connected to different physical netoworks

Advertisement

Answer

On Windows, if you know the IP address of the interface you want to use, just bind to that before you connect. On Linux,use socket option SO_BINDTODEVICE as suggested by JimB (seems to be a privileged call too).

i.e. on Windows

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.0.1', 0))
s.connect(('...'))

Binding source address under Windows, selects the interface with the same IP address as that device, even if that IP address has a higher routing metric cost. This doesn’t work under Linux though, as it always overwrites the source address with the IP address of the selected device. Routing is done based solely on the destination address. The only exception it seems is if you set source address to 127.0.0.1, then Linux prevents these packets from going out of that box.

Advertisement