黑帽联盟

标题: KVM 虚拟机 配置 NAT 连接方式上网 [打印本页]

作者: 定位    时间: 2023-11-17 14:11
标题: KVM 虚拟机 配置 NAT 连接方式上网
1、命令行安装方式
  1. virt-install \

  2. --name=kvm99 --ram 1024 --vcpus=1 \

  3. --disk path=/home/vms/kvm99.qcow2,size=10,format=qcow2,bus=virtio \

  4. --location=/mnt/CentOS-7-x86_64-Minimal-1611.iso --network network=default,model=virtio \

  5. --graphics=none --console=pty,target_type=serial \

  6. --extra-args="console=tty0 console=ttyS0"
复制代码
--network network=default      配置网络使用默认,NAT 方式

dnsmasq 服务

libvirt默认使用了一个名为default的nat网络,这个网络默认使用virbr0作为桥接接口,使用dnsmasq来为使用nat网络的虚拟机提供dns及dhcp服务,dnsmasq生效后的配置文件默认保存在以下路径:

/var/lib/libvirt/dnsmasq/default.hostsfile   mac&&ip绑定的配置文件

/var/lib/libvirt/dnsmasq/default.leases  dhcp分配到虚拟机的ip地址列表

/var/lib/libvirt/network/default.xml  default网络的配置文件

dnsmasq服务的启动脚本在/etc/init.d/dnsmasq ,但是我们如果手动使用此脚本来启动服务将会导致dnsmasq读取其自己的配置文件来启动此服务,因此这么做是不推荐的,因为这个服务完全由libvirtd在接管,

当libvirtd服务启动的时候,它会将它管理的被标记为autostart的network一并启动起来,而启动network的时候就会自动调用dnsmasq并赋予其适宜的配置文件来运行服务。

使用libvirt管理的网络都会用到dnsmasq来产生相应的配置,比如定义了一个名为route110的network,那么这个route110将使用一个新的桥接接口virbr1来接入网络,并使用dnsmasq产生名为route110.hostsfile和route110.leases的配置文件。

其实这里提到的virbr0和virbr1都是libvirt产生的虚拟网卡,其作用就相当于一个虚拟交换机,为虚拟机提供网络转发服务。

2、安装完成后,修改网段,也可以用默认网段 192.168.122.0/24

  1. virsh net-edit default
复制代码
<network>
  <name>default</name>
  <uuid>5e3af757-8a76-4fe1-af65-3352b68e23f6</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:b1:22:d8'/>
  <ip address='192.168.77.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.77.2' end='192.168.77.254'/>
    </dhcp>
  </ip>
</network>


# 安装好 libvirtd 后,默认会安装一块 virbr0 的虚拟网卡,网段为 192.168.122.0/24



3、重新定义

  1. virsh net-define /etc/libvirt/qemu/networks/default.xml
复制代码
4、停止 网卡

  1. virsh net-destroy default
复制代码
5、启动网卡

  1. virsh net-start default
复制代码
6、重启 libvirtd

  1. systemctl restart libvirtd
复制代码
7、虚拟机配置 网卡


# 设置IP,其它参数已省略
…………
IPADDR=192.168.77.6
NETMASK=255.255.255.0
GATEWAY=192.168.77.1
DNS1=8.8.8.8

8、宿主机 查看 iptables

  1. iptables -t nat -nL
复制代码
# 显示
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         
RETURN     all  --  192.168.77.0/24      224.0.0.0/24        
RETURN     all  --  192.168.77.0/24      255.255.255.255     
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
  1. iptables -t filter -nL
复制代码
# 显示
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67


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           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable


Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:68
从上面防火墙可以看出, 在启动 libvirtd 网卡的时候,会动态生成 iptables nat,filter 表,以实现 SNAT 功能,虚拟机可以访问外网。因为没有保存,如果重启 iptables 会全部丢失,接下来我们重新启动 iptables 来手动配置 SNAT 功能



重启 iptables 后 虚拟机就不能上网了

  1. systemctl restart iptables
复制代码
配置 SNAT 转发功能,实现虚拟机通过 宿主机 来上网
  1. vim /etc/sysctl.conf

  2. # 加入
  3. net.ipv4.ip_forward = 1

  4. # 立退生效
  5. sysctl –p

  6. # 清空规则链
  7. iptables -F

  8. # 方法一 有固定IP 这里指宿主机 192.168.1.73
  9. iptables -t nat -A POSTROUTING -s 192.168.77.0/24 -j SNAT --to-source 192.168.1.73

  10. # 方法二 如果没有固定IP
  11. iptables -t nat -A POSTROUTING -s 192.168.77.0/24 -j MASQUERADE
复制代码
通过上面配置,这里虚拟机就可以上网了,也可以访问 192.168.1.0/24 网段的主机了,但是  192.168.1.0/24 网段的主机是不能访问 虚拟机 192.168.77.6,这时可以通过 端口映射来实现这个功能

宿主机   外网  192.168.1.73    内网  192.168.77.1 (这里就是生成的virbr0 虚拟网卡)

虚拟机            192.168.77.6

其它主机         192.168.1.86   (跟宿主机在一个网段)

实现 192.168.1.86 通过 访问 192.168.1.73 8802 端口 来实现 登陆 192.168.77.66 22 端口

配置 端口 映射功能,实现 192.168.1.0/24 网段主机 远程登陆 192.168.77.6

  1. iptables -t nat -A PREROUTING -d 192.168.1.73 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.77.6:22
复制代码
保存生效

  1. service iptables save
复制代码
这时找一台 192.168.1.0/24 网段的主机 我这里是 192.168.1.86,进行访问
telnet 192.168.1.73 8022


# 成功
Trying 192.168.1.73...
Connected to 192.168.1.73.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.6.1
接下来配置 宿主机 filter 表防火墙
  1. *filter
  2. :INPUT DROP [0:0]
  3. :FORWARD ACCEPT [0:0]      # 转发功能要打开
  4. :OUTPUT ACCEPT [0:0]
  5. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  6. -A INPUT -p icmp -j ACCEPT
  7. -A INPUT -i lo -j ACCEPT
  8. -A INPUT -p tcp --dport 22 -j ACCEPT
  9. COMMIT
复制代码





欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5