我正在尝试为虚拟机设置一个私有网络,如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.46
google.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
解决了问题。