我正在尝试制作一个 rumpkernel (https://github.com/rumpkernel) 在 KVM 上运行,连接到主机上的套接字并发送一些数据。
我可以使用此处的 nginx 示例让主机访问客户机: https://github.com/rumpkernel/wiki/wiki/Tutorial%3A-Serve-a-static-website-as-a-Unikernel
我所做的基本上是:
ip tuntap add tap0 mode tap
ip addr add 10.0.0.10/24 dev tap0
ip link set dev tap0 up
然后使用以下参数启动 rumprun:
rumprun kvm -i -M 128 \
-I if,vioif,'-net tap,script=no,ifname=tap0'\
-W if,inet,static,10.0.0.11/24 \
-b images/data.iso,/data \
-- <my python script>
其中 Python 脚本打开一个套接字 (0.0.0.0:2010) 并进行监听。然后在主机上我可以执行以下操作:
nc 10.0.0.11 2010
我可以看到它正在连接。问题是我无法反过来做。现在我让 kvm 客户端打开一个套接字并尝试连接:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
ip = "10.0.0.10"
try:
s.connect( (ip, 9999) )
#send some data
并运行与之前相同的脚本,在 10.0.0.10:9999 上进行监听。客户机只是卡在尝试连接上,最终超时。
我尝试了几乎所有能在网上找到的方法,最终找到了一个 IP 为 10.0.0.10 的网桥,并在其中添加了 tap0。然后我监听了 br0,得到了以下内容(删除了一些行):
15:38:46.173914 ARP, Request who-has 10.0.0.11 tell 10.0.0.11, length 28
...
15:38:46.500262 ARP, Request who-has 10.0.0.10 tell 10.0.0.11, length 28
15:38:46.500288 ARP, Reply 10.0.0.10 is-at 0e:ec:XX:XX:XX:XX (oui Unknown), length 28
15:38:46.500440 IP 10.0.0.11.52886 > 10.0.0.10.9999: Flags [S], seq 20858086, win 32768, options [mss 1460,nop,wscale 3,sackOK,nop,nop,nop,nop,TS val 1 ecr 0], length 0
这让我认为有一条路由,但不知何故数据包没有到达。我尝试在 sys.d 中禁用过滤
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
还是没有结果。
关于如何实现这一点,您有什么想法吗?我不想桥接我的 eth0,因为它是一个远程服务器,而客户机目前不需要外部连接。
答案1
哎呀,我尝试解决这个问题一天了,当然在我在这里发布问题后我找到了答案。
提示如下:配置 FirewallD 以允许桥接虚拟机网络访问
我检查了 iptables 和日志,在 /var/log/ufw.log 上发现了这个
Dec 5 15:38:46 xxxx kernel: [516010.193395] [UFW BLOCK] IN=br0 OUT= MAC=... SRC=10.0.0.11 DST=10.0.0.10 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=
0 DF 协议=TCP SPT=52886 DPT=9999 窗口=32768 RES=0x00 SYN URGP=0
原来防火墙正在运行,并且阻止了连接。我添加了一条新规则,如下所示: https://help.ubuntu.com/community/UFW 显然,它现在正在发挥作用。