如何在基于 NAT 的自定义网络内启用 libvirt VM 的地址解析互联网访问

如何在基于 NAT 的自定义网络内启用 libvirt VM 的地址解析互联网访问

我正在尝试为虚拟机设置一个私有网络,如libvirt 网络手册但虚拟机无法连接到互联网并解析域名。

按照上面链接的手册,我在主机中设置了一个所谓的“基于自定义 NAT 的网络”:

  • 禁用 libvirt 的默认网络;
  • 创建了一个虚拟接口(名为virbr10-dummy);
  • 创建虚拟网桥(virbr10以子网命名10.10.0.0/24);
  • 实现 NAT iptables(请参阅下面完整的 iptables 规则文件);
  • dnsmasq配置了一个忽略虚拟桥的系统范围的实例;
  • 添加了一个dnsmasq@virbr10 systemd脚本,当网桥启动时,该脚本会被 NetworkManager 的调度程序脚本调用。

主机可以 ping 通客户机,反之亦然。主机是具有互联网访问权限(IP 192.168.0.15)的网络的一部分,并且配置为虚拟机(IP 10.10.0.1)的专用 LAN 的网关。具有 IP 的客户机10.10.0.10无法解析互联网地址(例如 google.com),也无法直接 ping 互联网上的 IP(例如216.58.222.46google.com)。


主持人

文件/var/lib/dnsmasq/virbr10/dnsmasq.conf

except-interface=lo
interface=virbr10
bind-dynamic
dhcp-range=10.10.0.2,10.10.0.254
dhcp-lease-max=1000
dhcp-leasefile=/var/lib/dnsmasq/virbr10/leases
dhcp-hostsfile=/var/lib/dnsmasq/virbr10/hostsfile
dhcp-no-override
strict-order

由于。。。导致的结果:systemctl status [email protected]

[email protected] - DHCP and DNS caching server for virbr10.
   Loaded: loaded (/etc/systemd/system/[email protected]; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2017-06-07 09:43:39 -03; 8h ago
 Main PID: 1209 (dnsmasq)
   CGroup: /system.slice/system-dnsmasq.slice/[email protected]
           └─1209 /usr/sbin/dnsmasq -k --conf-file=/var/lib/dnsmasq/virbr10/dnsmasq.conf

文件/etc/sysconfig/iptables

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o virbr10 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.10.0.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 10.10.0.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 10.10.0.0/24 ! -d 10.10.0.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 10.10.0.0/24 ! -d 10.10.0.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 10.10.0.0/24 ! -d 10.10.0.0/24 -j MASQUERADE
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -m tcp --syn -m conntrack --ctstate NEW --dport 22 -j ACCEPT
-A INPUT -i virbr10 -p udp -m udp -m multiport --dports 53,67 -j ACCEPT
-A INPUT -i virbr10 -p tcp -m tcp -m multiport --dports 53,67 -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p tcp -m tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -d 10.10.0.0/24 -o virbr10 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.10.0.0/24 -i virbr10 -j ACCEPT
-A FORWARD -i virbr10 -o virbr10 -j ACCEPT
-A FORWARD -i virbr10 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -o virbr10 -j REJECT --reject-with icmp-port-unreachable
COMMIT

客人

文件cat /etc/resolv.conf

# Generated by NetworkManager
nameserver 10.10.0.1

答案1

iptables已经死亡,因此规则未被执行:

$ systemctl restart iptables解决了问题。

相关内容