Domain-Name-System

如何在基於 NAT 的自定義網路中啟用對 libvirt VM 的地址解析的 Internet 訪問

  • June 9, 2017

我正在嘗試按照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) 的網路的一部分,它被配置為虛擬機 (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 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解決了這個問題。

引用自:https://serverfault.com/questions/854546