IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    4.4.4 QEMU内部的用户模式网络

    master发表于 2016-09-13 22:01:42
    love 0

    前言:之前连载过2篇KVM网络的配置
    4.4.2 使用网桥模式(bridge networking mode)
    4.4.3 使用NAT模式
    其实,最近我在做开发过程中,并不总是需要什么高性能的网络,我只想guest中有网络,可以从host中ssh进去方便操作guest即可,所以用user-mode的网络配置也蛮不错的,使用很方便,也不依赖qemu/kvm之外的东西。所以,再把之前书中的user-mode网络配置发文章出来吧。

    前面4.5.1节中提到,在没有任何“-net”参数时,qemu-kvm默认使用的是“-net nic -net user”的参数,提供了一种用户模式(user-mode)的网络模拟。使用用户模式的网络的客户机可以连通宿主机及外部的网络。用户模式网络是完全由QEMU自身实现的,不依赖于其他的工具(如前面提到的bridge-utils、dnsmasq、iptables等),而且不需要root用户权限(前面介绍过的bridge模式和NAT模式在配置宿主机网络和设置iptables规则时一般都需要root用户权限)。QEMU使用Slirp实现了一整套TCP/IP协议栈,并且使用这个协议栈实现了一套虚拟的NAT网络。
    由于其使用简单、独立性好、不需root权限、客户机网络隔离性好等优势,用户模式网络是qemu-kvm的默认网络配置。不过,用户模式网路也有如下3个缺点:
    1) 由于其在QEMU内部实现所有网络协议栈,因此其性能较差。
    2) 不支持部分网络功能(如ICMP),所以不能在客户机中使用ping命令测试外网连通性。
    3) 不能从宿主机或外部网络直接访问客户机。

    使用用户模式的网络,其qemu-kvm命令行参数为:
    -net user[,option][,option][,…]
    其中常见的选项(option)及其意义如下:
    • vlan=n,将用户模式网络栈连接到编号为n的VLAN中(默认值为0)。
    • name=name,分配一个在QEMU monitor中会用到的名字(如在monitor的“info network”命令中 可看到这个网卡的name)。
    • net=addr[/mask],设置客户机可以看到的IP地址(客户机所在子网),其默认值是10.0.2.0/24。其中,子网掩码(mask)有两种形式可选,一种是类似于255.255.255.0这样地址,另一种是32位IP地址中前面被置位为1的位数(如10.0.2.0/24)。
    • host=addr,指定客户机可见宿主机的地址,默认值为客户机所在网络的第2个IP地址(如10.0.2.2)。
    • restrict=y|yes|n|no,如果将此选项打开(为y或yes),则客户机将会被隔离,客户机不能与宿主机通信,其IP数据包也不能通过宿主机而路由到外部网络中。这个选项不会影响“hostfwd”显示地指定的转发规则,“hostfwd”选项始终会生效。默认值为n或no,不会隔离客户机。
    • hostname=name,设置在宿主机DHCP服务器中保存的客户机主机名。
    • dhcpstart=addr,设置能够分配给客户机的第一个IP,在QEMU内嵌的DHCP服务器有16个IP地址可供分配。在客户机中IP地址范围的默认值是子网中的第15到第30个IP地址(如10.0.2.15 ~ 10.0.2.30)。
    • dns=addr,指定虚拟DNS的地址,这个地址必须与宿主机地址(在“host=addr”中指定的)不相同,其默认值是网络中的第3个IP地址(如10.0.2.3)。
    • tftp=dir,激活QEMU内嵌的TFTP服务器,目录dir是TFTP服务的根目录。不过,在客户机使用TFTP客户端连接TFTP服务后需要使用binary模式来操作。
    • hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport,将访问宿主机的hostpot端口的TCP/UDP连接重定向到客户机(IP为guestaddr)的guestport端口上。如果没有设置guestaddr,那么默认使用x.x.x.15(DHCP服务器可分配的第一个IP地址)。如果指定了hostaddr的值,则可以根据宿主机上的一个特定网络接口的IP端口来重定向。如果没有设置连接类型为TCP或UDP,则默认使用TCP连接。“hostfwd=…”这个选项在一个命令行中可以多次重复使用。
    • guestfwd=[tcp]:server:port-dev,将客户机中访问IP地址为server的port端口的连接转发到宿主机的dev这个字符设备上。“guestfwd=…”这个选项也可以在一个命令行中多次重复使用。
    • bootfile=file,让file文件成为客户机可以使用的BOOTP[11]启动镜像文件。它与“tfpt”选项联合使用,可以实现从网络(使用本地目录中的文件)启动客户机的功能。
    • smb=dir[,smbserver=addr], 激活Samba[12]服务器,以便让Windows客户机很方便地透明地访问宿主机中的dir目录。addr设置了Samba服务器的IP地址,addr的默认值为用户模式网络中的第4个IP地址(如10.0.2.4)。值得注意的是,该选项要求宿主机中安装有Samba服务器软件,并且启动文件为“/usr/sbin/smbd”(当然这个smbd的路径可以在qemu-kvm编译时加上特定的配置使之变为用户特定的文件路径)。

    下面用一个示例来介绍qemu-kvm中用户模式网络的使用。
    首先,通过如下的命令行启动了一个客户机,为它配置用户模式网络,并且开启TFTP服务,还将宿主机的5022端口转发到客户机的22端口(SSH服务默认端口),将宿主机的5080端口转发到客户机的80端口(HTTP服务默认端口)。

    qemu-system-x86_64 rhel6u3.img -m 1024 -smp 2 -net nic –net user,tftp=/root/tftp,hostfwd=tcp::5022-:22,hostfwd=tcp::5080-:80

    然后,在客户机中通过DHCP获得网络IP,检查其路由状态和默认网关,用ping命令来测试ICMP包的对外传输(如前面所说,ICMP在用户模式和网络中是不可用的),再用ssh工具测试客户机与宿主机(网关)的连通性,使用wget访问Google网站测试其外网网络连通性,并且访问宿主机中的TFTP服务(在其中测试了下载文件),还启动了客户机中的HTTP服务器。

    [root@kvm-guest ~]# dhclient eth0
    eth0: link up, 100Mbps, full-duplex, lpa 0x05E1
    [root@kvm-guest ~]# ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56
              inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
              inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:218 errors:0 dropped:0 overruns:0 frame:0
              TX packets:203 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:20704 (20.2 KiB)  TX bytes:27661 (27.0 KiB)
              Interrupt:11
    [root@kvm-guest ~]# route
    Kernel IP routing table
    Destination     Gateway    Genmask      Flags Metric Ref    Use Iface
    10.0.2.0        *          255.255.255.0   U     0      0        0 eth0
    default         10.0.2.2   0.0.0.0         UG    0      0        0 eth0
    [root@kvm-guest ~]# ping vt-snb7 -c 1
    PING vt-snb7.tsp.org (192.168.199.108) 56(84) bytes of data.
    
    --- vt-snb7.tsp.org ping statistics ---
    1 packets transmitted, 0 received, 100% packet loss, time 10001ms
    [root@kvm-guest ~]# ssh 10.0.2.2
    The authenticity of host '10.0.2.2 (10.0.2.2)' can't be established.
    RSA key fingerprint is 6b:69:03:c4:64:9d:c2:63:72:8b:34:eb:b5:c3:ad:f7.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '10.0.2.2' (RSA) to the list of known hosts.
    root@10.0.2.2's password:
    Last login: Mon Jul 30 23:50:19 2012 from 192.168.162.55
    [root@jay-linux ~]# hostname
    jay-linux
    [root@jay-linux ~]# exit
    logout
    Connection to 10.0.2.2 closed.
    [root@kvm-guest ~]# wget www.google.com
    --2012-07-31 00:45:13--  http://www.google.com/
    #......
    awaiting response... 200 OK
    Length: unspecified [text/html]
    Saving to: “index.html”
       [ <=>           ] 14,405      --.-K/s   in 0.04s
    2012-07-31 00:45:14 (387 KB/s) - “index.html” saved [14405]
    [root@kvm-guest ~]# tftp 10.0.2.2
    tftp> binary
    tftp> verbose
    Verbose mode on.
    tftp> get tftp-demo.txt
    getting from 10.0.2.2:tftp-demo.txt to tftp-demo.txt [octet]
    Received 14 bytes in 0.0 seconds [230955 bit/s]
    tftp> quit
    [root@kvm-guest ~]#
    [root@kvm-guest ~]# service httpd start
    Starting httpd: httpd: apr_sockaddr_info_get() failed for kvm-guest
    httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                               [  OK  ]

    最后,在外网中另外一台主机上测试前面配置的宿主机对客户机的端口转发。如下命令行是在某台主机上,通过ssh连接到宿主机的5022端口(使用-p参数指定ssh连接的端口),连接请求被自动转发到了客户机的22端口(ssh服务),然后可以登录到客户机。

    [root@vt-snb9 ~]# ssh -p 5022 192.168.82.0
    The authenticity of host '[192.168.82.0]:5022 ([192.168.82.0]:5022)' can't be established.
    RSA key fingerprint is a8:9d:c7:c8:bc:7a:a3:f4:13:5f:d3:8d:08:1e:56:14.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[192.168.82.0]:5022' (RSA) to the list of known hosts.
    root@192.168.82.0's password:
    Last login: Tue Jul 31 00:15:36 2012
    [root@kvm-guest ~]# hostname
    kvm-guest

    同样,在外部网络的一个主机上通过Firefox浏览器对宿主机的5080端口的访问,即被转发到了客户机的80端口,浏览器中显示了在客户机的HTTP服务中测试网页内容,如图4-9所示。

    图4-9 在宿主机转发功能作用下,外部网络得以访问用户模式网络中的客户机

    Original article: 4.4.4 QEMU内部的用户模式网络

    ©2016 笑遍世界. All Rights Reserved.



沪ICP备19023445号-2号
友情链接