我正在嘗試製作一個臀部內核(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 guest 打開一個套接字並嘗試連接:
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 現在正在發揮作用。顯然。