Como faço para encaminhar pacotes 169.254.169.254 para a porta de convidados libvirt / KVM para localhost?

1

Este é um acompanhamento para Qual é a melhor maneira de ter um endereço 169.254.169.254 local para o meu laptop? . Breve história: 169.254.169.254 é o endereço "bem conhecido" dos serviços de metadados em nuvem para o EC2 e para o OpenStack, e eu quero emulá-lo no meu laptop para o desenvolvimento.

Tendo desistido da abordagem lo:0 , decidi apenas configurar o NAT / port forwarding. Meus convidados são configurados pelo libvirt, usando uma rede padrão libvirt que NATs através do meu wireless nic, que o libvirt configurou assim:

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    

Esta regra:

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

faz um ótimo trabalho de encaminhamento do Firefox em execução no laptop (host OS) em si. Mas de dentro do convidado, eu recebo No route to host .

É evidente que preciso de algo mais para fazer isso funcionar. O que?

Conforme solicitado, mais algumas informações de rede. Eu removi as interfaces de ip addr para brevidade.

$ 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        
    
por mattdm 17.05.2013 / 00:45

1 resposta

2

Você precisa do DNAT em PREROUTING e talvez também de uma regra no INPUT, mas não tenho certeza se isso pode explicar a mensagem de erro. Você tem uma rota para esta rede no host? Algum material extravagante de ip rule ? Forneça a saída de ip addr , ip route e ip rule .

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

As coisas provavelmente ficarão mais fáceis se você puder fazer este serviço ouvir não apenas em lo , mas também em uma interface sem loopback. Diga que $ local_ip deve ser em vez de 192.168.77.1 do que 127.0.0.1 .

    
por 17.05.2013 / 01:30