热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

KVM-QEMU虚拟机环境中配置TAP使虚拟机联网

在网上搜索基本有两种方法。一是直接利用QEMU提供的-netuser或-nettap。二是使用Bridge模式。后者较前者来说更方便虚拟机与主机系统互访(似乎),我没有试过,其实-nettap也可以实现的。QEMU本身的两种上网方式我更青睐TAP。关于-netuser的

    在网上搜索基本有两种方法。一是直接利用 QEMU 提供的 -net user 或 -net tap 。二是使用Bridge模式。后者较前者来说更方便虚拟机与主机系统互访(似乎),我没有试过,其实 -net tap 也可以实现的。

    QEMU 本身的两种上网方式我更青睐 TAP 。关于 -net user 的安全性高或不高我实在找不到资料,也许是我多虑了;TAP 虽然配置麻烦一些,但是能够直接应用我信任的 iptables 感觉心里踏实很多。而且它还可以实现虚拟机与主机互访,虽然我不会麻烦地去搞这个。

    言归正传。需要注意的有下面几点:

    一、 kvm 的参数

    以下几步都完成后,按这行命令启动虚拟机,会自动应用 /etc/kvm/kvm-ifup 脚本:

    kvm win.img -net nic,vlan=0 -net tap,vlan=0,ifname=tap0

    二、 相应的 iptables 规则,虽然不确定,我希望这些设置会比较安全。

    # FORWARD 默认规则为 抛弃

    iptables -P FORWARD DROP

    # nat POSTROUTING 默认规则为 抛弃

    iptables -t nat -P POSTROUTING DROP

    # tap0 向 ppp0 转发的包,即向外的包,全部接受

    iptables -A FORWARD -i tap0 -o ppp0 -j ACCEPT

    # 来自的 ppp0 的包,即向内的包,如果是已连接的或相关的,接受

    iptables -A FORWARD -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT

    # 其他的 TCP 包,拒绝

    iptables -A FORWARD -i ppp0 -p tcp -j REJECT --reject-with tcp-reset

    # UDP 包,拒绝

    iptables -A FORWARD -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable

    # 用于内网的 IP 伪装,内网即虚拟机访问互联网时会被认为是主机在访问,而互联网来的包也会被自动转发给虚拟机

    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

    三、 使能 IP 转发功能

    echo "1" > /proc/sys/net/ipv4/ip_forward

    四、 如果 tun 是编译成内核模块的,先要加载

    /sbin/modprobe tun

    完整文件如下:

    为了方便,我把 iptables 的规则用 iptables-save 写入一个文件 enable-kvm ,然后写了一个启动用的脚本,完成启动及之前的准备和最后的恢复工作。

    启动脚本如下:

    #!/bin/sh

    ###

    # Need to be ROOT.

    # Prepare and Start kvm win guest system.

    # Wait and cleanup.

    ###

    test -f /usr/bin/kvm || exit 0

    # Load tun module, for TAP network interface

    /sbin/modprobe tun

    # Enable ip forward

    echo "1" > /proc/sys/net/ipv4/ip_forward

    # Apply enable-kvm rules for iptables

    # Had to create rules in /etc/iptables

    # Had to create /etc/init.d/iptables first.

    # See /etc/init.d/iptables and /etc/iptables

    /etc/init.d/iptables enable-kvm

    # Start

    # With -m 1G, set virtual RAM size to 1G

    # With -localtime, set the real time clock to local time

    # With network, and create a new interface tap0

    # (must named after tap0, because of iptables rules up)

    /usr/bin/kvm win.img \

     -m 1G \

     -localtime \

     -net nic,vlan=0 -net tap,vlan=0,ifname=tap0

    # Restore previous rules

    /etc/init.d/iptables disable-kvm

    # Disable ip forward

    echo "0" > /proc/sys/net/ipv4/ip_forward

    # Unload tun module

    /sbin/modprobe -r tun

    exit 0

    另外,我把 /etc/kvm/kvm-ifup 稍微修改了一下,IP 固定为 192.168.0.1。

    虚拟机的配置: IP 设定为 192.168.0.2 ,网关为 192.168.0.1 ,子网掩码 255.255.255.0 ,DNS 看 /etc/resolv.conf ,添成一样的。

    /etc/kvm/kvm-ifup 如下:

    #!/bin/sh

    switch=$(ip route ls | awk '/^default / { for(i=0;i

    /sbin/ifconfig $1 192.168.0.1 up

    /usr/sbin/brctl addif ${switch} $1

    exit 0

    enable-kvm 是在原来的规则基础上再添加了上述几项,内容如下。 disable-kvm 则是去掉上述几项,恢复原来的规则。

    # Generated by iptables-save v1.4.1.1 on Thu Dec 25 10:15:44 2008

    *nat

    :PREROUTING ACCEPT [0:0]

    :POSTROUTING DROP [0:0]

    :OUTPUT ACCEPT [0:0]

    -A POSTROUTING -o ppp0 -j MASQUERADE

    COMMIT

    # Completed on Thu Dec 25 10:15:44 2008

    # Generated by iptables-save v1.4.1.1 on Thu Dec 25 10:15:44 2008

    *filter

    :INPUT DROP [0:0]

    :FORWARD DROP [0:0]

    :OUTPUT ACCEPT [0:0]

    -A INPUT -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT

    -A INPUT -i ppp0 -p tcp -j REJECT --reject-with tcp-reset

    -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable

    -A INPUT -i lo -j ACCEPT

    -A FORWARD -i tap0 -o ppp0 -j ACCEPT

    -A FORWARD -i ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT

    -A FORWARD -i ppp0 -p tcp -j REJECT --reject-with tcp-reset

    -A FORWARD -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable

    COMMIT

    # Completed on Thu Dec 25 10:15:44 2008

    /etc/init.d/iptables 是自己写的一个脚本用来自动启用 iptables 规则的。

    #!/bin/sh

    START=/etc/iptables/start.rule

    STOP=/etc/iptables/stop.rule

    KVM=/etc/iptables/enable-kvm.rule

    DISCOnNECT=/etc/iptables/disconnect.rule

    case "$1" in

    start)

     /sbin/iptables-restore

     ;;

    stop)

     /sbin/iptables-restore

     ;;

    restart)

     /sbin/iptables-restore

     ;;

    enable-kvm)

     /sbin/iptables-restore

     ;;

    disable-kvm)

     /sbin/iptables-restore

     ;;

    disconnect)

     /sbin/iptables-restore

     ;;

    *)

     echo "Usage: /etc/init.d/iptables {start|stop|restart|enable-kvm|disable-kvm|disconnect}"

     ;;

    esac

    exit 0

    罗罗嗦嗦全文完:)

    如果您有任何意见和建议,请让我知道。


推荐阅读
  • NetCat,因其强大的多功能性和灵活性,被网络安全领域的专业人士誉为‘瑞士军刀’。本文将详细介绍NetCat的功能、应用场景及其在不同平台上的使用方法。 ... [详细]
  • 本文介绍了EasyRTSPClient这一高效、稳定的RTSP客户端工具库,并详细阐述了其在与大华球机对接过程中遇到的预览问题及解决方法。 ... [详细]
  • Python安全实践:Web安全与SQL注入防御
    本文旨在介绍Web安全的基础知识,特别是如何使用Python和相关工具来识别和防止SQL注入攻击。通过实际案例分析,帮助读者理解SQL注入的危害,并掌握有效的防御策略。 ... [详细]
  • 提升接口测试效率的关键:用例与工具的综合应用
    本文将探讨如何通过有效的接口测试用例设计和工具选择,显著提高接口测试的效率和质量。 ... [详细]
  • 随着物联网技术的快速发展,NB-IoT(窄带物联网)作为一项关键的技术,正逐步成为实现大规模设备互联的重要手段。本文将详细介绍NB-IoT技术的特点、应用场景及其在实际项目中的应用实例。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 本文是网络安全自学系列的一部分,旨在分享网络安全工具的使用技巧和实际操作案例。继之前讨论了XSS跨站脚本攻击的各个方面后,本文将重点介绍Powershell的基础知识及其在网络安全领域的应用。 ... [详细]
  • 一人有限公司的风险与应对策略
    创业者在选择公司形式时,往往对一人有限公司存在误解。虽然表面上看似简单易操作,但实际上,这种公司形式隐藏着较大的法律风险,尤其是在股东责任方面。本文将深入探讨为何应谨慎考虑注册一人有限公司,并提供相应的风险管理建议。 ... [详细]
  • Web安全入门:MySQL基础操作与SQL注入防范
    本文详细介绍了MySQL数据库的基础操作命令,包括数据库和表的基本管理,以及数据的增删查改等常用操作。同时,针对Web安全领域常见的SQL注入问题,提供了初步的理解和防范措施。 ... [详细]
  • 项目管理可细分为九个层次,每个层次都代表着不同的能力和视角。本文将详细介绍这九个层次的内容,帮助读者评估自身所处的阶段,并提供进一步学习和发展的方向。 ... [详细]
  • 本文详细记录了一位Java程序员在Lazada的面试经历,涵盖同步机制、JVM调优、Redis应用、线程池配置、Spring框架特性等多个技术点,以及高级面试中的设计问题和解决方案。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • Kubernetes Services详解
    本文深入探讨了Kubernetes中的服务(Services)概念,解释了如何通过Services实现Pods之间的稳定通信,以及如何管理没有选择器的服务。 ... [详细]
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
author-avatar
优优绿园之时尚饰品_834
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有