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 ruleip addrip 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

おすすめ記事