服务器有 4 个 NIC 和一个网桥(与讨论无关),由 netplan 配置。运行后,netplan apply --debug
我得到以下合并配置:
DEBUG:Merged config:
network:
bonds: {}
bridges:
br0:
dhcp4: true
dhcp6: true
interfaces:
- enp4s0f3
ethernets:
enp4s0f0:
dhcp4: true
dhcp6: false
link-local: []
enp4s0f1:
dhcp4: false
dhcp6: true
enp4s0f2:
dhcp4: true
dhcp6: true
enp4s0f3:
dhcp4: false
dhcp6: false
我尝试netcat
在不同的 IP 上运行并监听,为了简单起见,这里只给出了两个 NIC 启用 IPv4 的情况:enp4s0f0
和enp4s0f2
。
路由表如下:
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.31.100.1 0.0.0.0 UG 100 0 0 enp4s0f2
0.0.0.0 10.31.100.1 0.0.0.0 UG 100 0 0 enp4s0f0
0.0.0.0 10.31.100.1 0.0.0.0 UG 100 0 0 br0
10.31.100.0 0.0.0.0 255.255.254.0 U 0 0 0 enp4s0f2
10.31.100.0 0.0.0.0 255.255.254.0 U 0 0 0 enp4s0f0
10.31.100.0 0.0.0.0 255.255.254.0 U 0 0 0 br0
10.31.100.1 0.0.0.0 255.255.255.255 UH 100 0 0 enp4s0f2
10.31.100.1 0.0.0.0 255.255.255.255 UH 100 0 0 enp4s0f0
10.31.100.1 0.0.0.0 255.255.255.255 UH 100 0 0 br0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
如您所见,生成了 3 条默认路由。最上面的默认路由使用接口enp4s0f2
,这是服务器响应客户端的唯一情况。以下是部分 IP 列表
2: enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 10:60:4b:9a:bd:7c brd ff:ff:ff:ff:ff:ff
inet 10.31.100.70/23 brd 10.31.101.255 scope global dynamic enp4s0f0
valid_lft 28703sec preferred_lft 28703sec
inet6 fe80::1260:4bff:fe9a:bd7c/64 scope link
valid_lft forever preferred_lft forever
4: enp4s0f2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 10:60:4b:9a:bd:7e brd ff:ff:ff:ff:ff:ff
inet 10.31.100.63/23 brd 10.31.101.255 scope global dynamic enp4s0f2
valid_lft 28703sec preferred_lft 28703sec
inet6 fe80::1260:4bff:fe9a:bd7e/64 scope link
valid_lft forever preferred_lft forever
netcat
我确实在监听 IPenp4s0f0
和 IP if时运行了两个测试。我在两种情况下都enp4s0f2
运行了。 这是第一种情况,使用IPtcpdump
enp4s0f0
10.31.100.70
nc -l -p 33333 -s 10.31.100.70
通过在不同机器上运行的客户端进行连接
nc 10.31.100.70 33333
tcpdump
显示如下:
sudo tcpdump -i any -nn -vv port 33333
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
11:20:54.744837 IP (tos 0x2,ECT(0), ttl 114, id 5558, offset 0, flags [DF], proto TCP (6), length 52)
10.47.240.156.41078 > 10.31.100.70.33333: Flags [SEW], cksum 0x2a91 (correct), seq 1636906657, win 8192, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
11:20:54.744837 IP (tos 0x2,ECT(0), ttl 114, id 5558, offset 0, flags [DF], proto TCP (6), length 52)
10.47.240.156.41078 > 10.31.100.70.33333: Flags [SEW], cksum 0x2a91 (correct), seq 1636906657, win 8192, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
由于客户端没有收到打开套接字的回复,这种情况持续发生。
我停止了 netcat 并开始监听enp4s0f2
IP10.31.100.63
nc -l -p 33333 -s 10.31.100.63
并运行客户端
nc 10.31.100.63 33333
客户端已连接并tcpdump
显示从服务器到客户端的套接字打开应答。
sudo tcpdump -i any -nn -vv port 33333
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
16:51:39.033834 IP (tos 0x2,ECT(0), ttl 114, id 23066, offset 0, flags [DF], proto TCP (6), length 52)
10.47.240.156.41180 > 10.31.100.63.33333: Flags [SEW], cksum 0xce53 (correct), seq 2777304710, win 8192, options [mss 1380,nop,wscale 8,nop,nop,sackOK], length 0
16:51:39.033906 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
10.31.100.63.33333 > 10.47.240.156.41180: Flags [S.], cksum 0x6950 (incorrect -> 0x1c2a), seq 467254207, ack 2777304711, win 64240, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
16:51:39.068784 IP (tos 0x0, ttl 114, id 23067, offset 0, flags [DF], proto TCP (6), length 40)
10.47.240.156.41180 > 10.31.100.63.33333: Flags [.], cksum 0x53ed (correct), seq 1, ack 1, win 1024, length 0
16:52:18.202401 IP (tos 0x0, ttl 114, id 23069, offset 0, flags [DF], proto TCP (6), length 40)
10.47.240.156.41180 > 10.31.100.63.33333: Flags [R.], cksum 0x57e9 (correct), seq 1, ack 1, win 0, length 0
强调回应:10.31.100.63.33333 > 10.47.240.156.41180:
。对我来说,这似乎与路由表没有问题。当在 netplan 配置中使用除最后一个 IP 以外的任何其他 IP 时,不会向套接字打开请求发送任何响应。
我不知道发生了什么,也不知道如何配置 netplan 以便能够监听所有地址。
计划是使用专用 NIC 给 Docker,另一个用于桥接,一个用于管理。所有 NIC 都连接到同一个交换机、同一个虚拟网络。我尝试在 netplan 中逐一配置它们并启用,并且我能够从远程计算机连接到任何 IP(但仅当此 NIC 是生成的 netplan 配置文件中的唯一 IP 或最新 IP 时)。