python socket.connect 在虚拟IP上似乎不工作

1 投票
1 回答
1878 浏览
提问于 2025-04-17 02:01

我通过以下方式设置了一些虚拟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"

如果接口是eth0,这个连接是正常的,但当我用eth0.1时,它在sTCP.connect这一步就卡住了,而在eth0.2上则在bindtodevice这一步失败(这也是预料之中的)。

为什么eth0.1不行呢?这是Python的问题,还是Linux网络实现的问题呢?

1 个回答

1

我刚在我的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的问题?可以在客户端和服务器上抓取数据包,看看实际发生了什么。

撰写回答