KVM의 게스트 유니커널은 호스트에 연결할 수 없지만 호스트는 게스트에 연결할 수 있습니다.

KVM의 게스트 유니커널은 호스트에 연결할 수 없지만 호스트는 게스트에 연결할 수 있습니다.

나는 엉덩이를 만들려고 노력 중입니다 (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

Welp, 하루 동안 이 문제를 해결하려고 노력했는데 여기에 질문을 게시한 후 답변을 찾았습니다.

힌트는 다음과 같았습니다.브리지된 가상 머신 네트워크 액세스를 허용하도록 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 PROTO=TCP SPT=52886 DPT=9999 WINDOW=32768 RES=0x00 SYN URGP=0

방화벽이 실행 중이고 연결을 차단하고 있는 것으로 나타났습니다. 여기에 지정된 대로 새 규칙을 추가했습니다. https://help.ubuntu.com/community/UFW 지금은 작동하고 있어요. 보기에.

관련 정보