libvirt/KVM 게스트 포트에서 로컬 호스트로 169.254.169.254 바운드 패킷을 전달하는 방법은 무엇입니까?

libvirt/KVM 게스트 포트에서 로컬 호스트로 169.254.169.254 바운드 패킷을 전달하는 방법은 무엇입니까?

후속작입니다내 노트북에 로컬 169.254.169.254 주소를 제공하는 가장 좋은 방법은 무엇입니까?. 짧은 이야기: 169.254.169.254는 EC2 및 OpenStack 클라우드 메타데이터 서비스의 "잘 알려진" 주소이며, 개발 작업을 위해 내 노트북에서 이를 에뮬레이트하고 싶습니다.

lo:0접근 방식을 포기한 후 NAT/포트 전달만 설정하기로 결정했습니다. 내 게스트는 내 무선 카드를 통해 NAT되는 기본 libvirt 네트워크를 사용하여 libvirt로 구성됩니다. libvirt는 다음과 같이 구성됩니다.

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  tcp  --  192.168.77.0/24     !192.168.77.0/24      masq ports: 1024-65535
MASQUERADE  udp  --  192.168.77.0/24     !192.168.77.0/24      masq ports: 1024-65535
MASQUERADE  all  --  192.168.77.0/24     !192.168.77.0/24    

이 규칙은 다음과 같습니다.

sudo iptables -t nat -I OUTPUT -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination 127.0.0.1:80

노트북(호스트 OS) 자체에서 실행되는 Firefox에서의 전달은 훌륭하게 작동합니다. 하지만 손님의 마음에서 얻었습니다 No route to host.

분명히 그 일을 하려면 뭔가 다른 것이 필요해요. 무엇?


추가 네트워크 정보는 요청 시 제공됩니다. 간결성을 위해 하향 인터페이스를 제거했습니다 ip addr.

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 60:67:20:44:8d:48 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.5/24 brd 192.168.1.255 scope global wlp3s0
       valid_lft forever preferred_lft forever
    inet6 fe80::6267:20ff:fe44:8d48/64 scope link
       valid_lft forever preferred_lft forever
4: virbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 52:54:00:84:3d:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.77.1/24 brd 192.168.77.255 scope global virbr1
       valid_lft forever preferred_lft forever

$ ip route
default via 192.168.1.1 dev wlp3s0  proto static
192.168.1.0/24 dev wlp3s0  proto kernel  scope link  src 192.168.1.5
192.168.77.0/24 dev virbr1  proto kernel  scope link  src 192.168.77.1

$ ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

$ iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  tcp  --  192.168.77.0/24     !192.168.77.0/24      masq ports: 1024-65535
MASQUERADE  udp  --  192.168.77.0/24     !192.168.77.0/24      masq ports: 1024-65535
MASQUERADE  all  --  192.168.77.0/24     !192.168.77.0/24    

$ iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  0.0.0.0/0            192.168.77.0/24      ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.77.0/24      0.0.0.0/0          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

답변1

PREROUTING에 DNAT가 필요하고 INPUT에 규칙이 필요할 수도 있지만 이것이 오류 메시지를 설명하는지 잘 모르겠습니다. 호스트에 이 네트워크에 대한 경로가 있습니까? 특이한 점이 있나요 ip rule? ip addr, ip route및 에 대한 출력을 제공하십시오 ip rule.

iptables -t nat -I PREROUTING -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination $local_ip

lo비루프백 인터페이스뿐만 아니라 비루프백 인터페이스에서도 서비스가 수신하도록 할 수 있다면 상황이 훨씬 쉬워질 수 있습니다. $local_ip가 192.168.77.1대신에 있어야 한다고 말합니다 127.0.0.1.

관련 정보