如何将 169.254.169.254 绑定的数据包从 libvirt/KVM guest 端口转发到本地主机?

如何将 169.254.169.254 绑定的数据包从 libvirt/KVM guest 端口转发到本地主机?

这是后续为我的笔记本电脑提供本地 169.254.169.254 地址的最佳方式是什么?。简短的故事:169.254.169.254 是 EC2 和 OpenStack 云元数据服务的“众所周知”地址,我想在我的笔记本电脑上模拟它以进行开发工作。

放弃这种lo:0方法后,我决定只设置 NAT/端口转发。我的客人由 libvirt 配置,使用默认的 libvirt 网络,该网络通过我的无线网卡进行 NAT,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

从笔记本电脑(主机操作系统)本身运行的 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 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

相关内容