黑帽联盟

 找回密码
 会员注册
查看: 488|回复: 0
打印 上一主题 下一主题

[资源教程] KVM 虚拟机 配置 NAT 连接方式上网

[复制链接]

295

主题

18

听众

965

积分

管理员

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    难过
    前天 00:16
  • 签到天数: 370 天

    [LV.9]以坛为家II

    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

    virsh net-edit default
    1. <network>

    2.   <name>default</name>

    3.   <uuid>5e3af757-8a76-4fe1-af65-3352b68e23f6</uuid>

    4.   <forward mode='nat'/>

    5.   


    6.   <mac address='52:54:00:b1:22:d8'/>

    7.   <ip address='192.168.77.1' netmask='255.255.255.0'>

    8.     <dhcp>

    9.       <range start='192.168.77.2' end='192.168.77.254'/>

    10.     </dhcp>

    11.   </ip>

    12. </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,其它参数已省略
    1. …………

    2. IPADDR=192.168.77.6

    3. NETMASK=255.255.255.0

    4. GATEWAY=192.168.77.1

    5. DNS1=8.8.8.8
    复制代码
    8、宿主机 查看 iptables

    iptables -t nat -nL


    # 显示
    1. Chain PREROUTING (policy ACCEPT)

    2. target     prot opt source               destination         



    3. Chain INPUT (policy ACCEPT)

    4. target     prot opt source               destination         



    5. Chain OUTPUT (policy ACCEPT)

    6. target     prot opt source               destination         



    7. Chain POSTROUTING (policy ACCEPT)

    8. target     prot opt source               destination         

    9. RETURN     all  --  192.168.77.0/24      224.0.0.0/24        

    10. RETURN     all  --  192.168.77.0/24      255.255.255.255     

    11. MASQUERADE  tcp  --  192.168.77.0/24     !192.168.77.0/24      masq ports: 1024-65535

    12. MASQUERADE  udp  --  192.168.77.0/24     !192.168.77.0/24      masq ports: 1024-65535

    13. MASQUERADE  all  --  192.168.77.0/24     !192.168.77.0/24
    复制代码
    iptables -t filter -nL

    # 显示
    1. Chain INPUT (policy ACCEPT)

    2. target     prot opt source               destination         

    3. ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53

    4. ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53

    5. ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67

    6. ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67



    7. Chain FORWARD (policy ACCEPT)

    8. target     prot opt source               destination         

    9. ACCEPT     all  --  0.0.0.0/0            192.168.77.0/24      ctstate RELATED,ESTABLISHED

    10. ACCEPT     all  --  192.168.77.0/24      0.0.0.0/0           

    11. ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

    12. REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

    13. REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable



    14. Chain OUTPUT (policy ACCEPT)

    15. target     prot opt source               destination         

    16. 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
    复制代码
    # 立退生效
    1. sysctl –p
    复制代码
    # 清空规则链
    1. iptables -F
    复制代码
    # 方法一 有固定IP 这里指宿主机 192.168.1.73
    1. iptables -t nat -A POSTROUTING -s 192.168.77.0/24 -j SNAT --to-source 192.168.1.73
    复制代码


    # 方法二 如果没有固定IP
    1. 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,进行访问
    1. telnet 192.168.1.73 8022



    2. # 成功

    3. Trying 192.168.1.73...

    4. Connected to 192.168.1.73.

    5. Escape character is '^]'.

    6. 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://blog.51cto.com/mshxuyi/5857678

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部