Domain-Name-System
如何在基於 NAT 的自定義網路中啟用對 libvirt VM 的地址解析的 Internet 訪問
我正在嘗試按照libvirt 網路手冊中的規定為虛擬機設置專用網路,但虛擬機無法連接到網際網路並解析域名。
按照上面連結的手冊,我在主機中設置了一個所謂的“基於 NAT 的自定義網路”:
- 禁用 libvirt 的預設網路;
- 創建了一個虛擬介面(命名為
virbr10-dummy
);- 創建了一個虛擬網橋(以
virbr10
子網命名10.10.0.0/24
);- 使用 NAT 實現
iptables
(請參閱下面的完整 iptables 規則文件);dnsmasq
配置了忽略虛擬網橋的系統範圍實例;- 添加了一個
dnsmasq@virbr10
systemd
腳本,該腳本在網橋啟動時由 NetworkManager 的調度程序腳本呼叫。主機可以 ping 來賓,反之亦然。主機是具有 Internet 訪問 (IP
192.168.0.15
) 的網路的一部分,它被配置為虛擬機 (IP10.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 dnsmasq@virbr10.service
:● dnsmasq@virbr10.service - DHCP and DNS caching server for virbr10. Loaded: loaded (/etc/systemd/system/dnsmasq@.service; 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/dnsmasq@virbr10.service └─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
iptables
已經死了,因此沒有執行規則:
$ systemctl restart iptables
解決了這個問題。