python socket.connect не работает на виртуальном IP - PullRequest
1 голос
/ 11 сентября 2011

Я настроил несколько виртуальных IP-адресов с помощью:

~# ip link add link eth0 name eth0.1 address 11:22:33:44:55:66 type macvlan
~# ifconfig eth0.1 10.10.0.0/24

Я использую следующий код для подключения с него:

sTCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sTCP.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, IFACE)
print "PORT s_TCP:" + str(HOST) +":" +str(TCP_PORT)
sTCP.connect((HOST, TCP_PORT))
print "Connected"

это прекрасно работает, если IFACE имеет значение eth0, ноон не получает sTCP.connect от eth0.1 и завершает работу в bindtodevice (как и ожидалось) на eth0.2.

Почему eth0.1 не работает?Это проблема с питоном или что-то в сетевой реализации Linux?

1 Ответ

1 голос
/ 09 ноября 2011

Я только что попробовал это на моей системе Fedora 13, и это сработало. Мне пришлось внести некоторые изменения, чтобы она работала в моей системе, надеюсь, это даст вам подсказки. Используемый код:

### in shell
# Used 00 for first MAC octet to avoid issues with multicast addressing
ip link add link eth0 name eth0.1 address 00:22:33:44:55:66 type macvlan
ifconfig eth0.1 10.1.23.6/25

# python
import socket
HOST = "10.1.23.30"
TCP_PORT = 80
IFACE = "eth0.1"
sTCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# switched to socket.SO_BINDTODEVICE since I'm not sure what "IN" referred to
# EDIT: figured out there's another module called IN, but the value is the same (25)
sTCP.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE, IFACE)
print "PORT s_TCP:" + str(HOST) +":" +str(TCP_PORT)
sTCP.connect((HOST, TCP_PORT))
print "Connected"

Я использовал tcpdump, чтобы доказать себе, что пакеты выходят из eth0.1. Возможно, вы столкнулись с проблемой VLAN? Запустите захват пакетов на клиенте и сервере, чтобы увидеть, что на самом деле происходит в сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...