kvm 网络配置之nat、用户模式

简介:

接上篇,kvm的网络配置,参考书本:《kvm虚拟化技术 实现以及原理解析》

2. nat模式

nat模式自动获取ip需要dhcp服务,nat功能本身需要ip伪装,既然是一个网络,所以还需要虚拟网桥功能,所以需要的软件如下:

dhcp功能:dnsmasq

ip伪装:iptables

虚拟网桥:bridge-utils

实现:

    (1)yum install dnsmasq iptables bridge-utils -y#如果iptables是为内核的netfilter模块提供规则,如果内核不支持nat模块,还需要重新编译内核

    (2)提供为客户机建立nat用的qemu-ifup-nat脚本和关闭的脚本qemu-ifdown-nat模式

qemu-ifup-nat脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash
#
 
BRIDGE=virbr0
 
NETWORK=192.168.7.0 #设置nat的网段
NETMASK=255.255.255.0
GATEWAY=192.168.7.1 #网关
DHCPRANGE=192.168.7.2,192.168.7.30 #地址池
 
function  check_bridge() #检测虚拟网桥是否存在
{       
         if  brctl show | grep  -q  "^$BRIDGE"  ; then
                 return  1
         else
                 return  0
         fi
}
function  create_bridge() #创建虚拟网桥
{
         brctl addbr $BRIDGE 
         brctl stp $BRIDGE on
         brctl setfd $BRIDGE 0 #设置网桥转发延迟
         ifconfig  $BRIDGE $GATEWAY netmask $NETMASK up
}
function  enable_ip_forward() #开启数据包转发
{       
         echo  1 >  /proc/sys/net/ipv4/ip_forward
}
function  add_filter_rules() #nat功能,即出去的包修改源地址,masquerade表示iptables自己会探测自己的ip,不用手动指定
{
         iptables -t nat -A POSTROUTING -s $NETWORK/$NETMASK ! -d  $NETWORK/$NETMASK -j MASQUERADE
}
function  start_dnsmasq() #开启dnsmasq功能,即dhcp功能,这里使用最简单的写法,更多参数参考dnsmasq --help
{
         ps  -ef | grep  dnsmasq | grep   - v  grep  &>  /dev/null
         if  [ $? - eq  0 ]; then
                 return  1
         fi
         dnsmasq   --listen-address=$GATEWAY  --dhcp-range=$DHCPRANGE
}
function  setup_bridge_nat() #启动所有功能
{
check_bridge $BRIDGE
if  [ $? - eq  0 ]; then
create_bridge
fi
enable_ip_forward
add_filter_rules 
start_dnsmasq  
}
if  [ -n $1 ]; then
setup_bridge_nat #真正的程序开始的地方,其实是引用上面的函数
ifconfig  $1 0.0.0.0 up #$1被虚拟成网桥,所以本身不需要ip,但是要启用
brctl addif $BRIDGE $1 #把$1绑定到虚拟网桥
else
exit  1
fi

qemu-ifdown-nat脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#
 
BRIDGE=virbr0
if  [ -n $1 ]; then
ip link  set  $1 down
brctl delif $BRIDGE $1
brctl delbr $BRIDGE
iptables -t nat -F
exit  0
else
exit  1
fi

    (3)启动客户机

    首先给予脚本执行权限: chmod +x  /etc/qemu*

    qemu-system-x86_64  -m 4096 -smp 8 -net nic -net tap,ifname=tap1,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat  kvm_vhost/redhat6.qcow2  -daemonize

    (4) 查看结果

    客户机:ip a查看是否获取到了192.168.7.0段的地址,并测试是否能与外网ip通信

wKioL1g9LgbBL1lKAABFWhjvQUQ391.png-wh_50

    宿主机:ip a可以看到有个虚拟网口virbr0,并且ip地址为192.168.7.1

    wKioL1g9LiPDRAbvAABd2rq7cqc649.png-wh_50

    (5)如果想让客户机提供的某些服务,外网可以访问,那么可以在宿主机加这么一条规则

    iptables -t nat  -I PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.7.2:80

    # 这里假设提供web服务,且客户端获取到的ip为192.168.7.2


3.qemu内部的用户模式网络

默认情况下,qemu-kvm启动客户机的时候使用slirp实现tcp/ip协议栈,并虚拟出一套nat网络,它使用简单易用,独立性好,但是不能跟宿主机和外部网络直接通信

命令:

    qemu-system-x86_64 -net user[,option][,option][,...]

        vlan=n : 将用户模式网络栈连接到编号为n的vlan中,默认0

        name=NAME :网络别名

        net=addr[/mask]:设置客户机可以看到的ip地址,默认10.0.2.0/24

        host=addr:指定客户机可见宿主机的地址

        restrict=y|yes|no|n:如果此选项被打开,那么客户机会被隔离,即客户机无法与外界通信,默认no

        hostname=name :设置在宿主机dhcp服务器中保存的客户机主机名

        dhcpstart=addr :设置分配给客户机的第一个ip

        dns=addr:指定虚拟dns的地址

        tftp=dir:激活qemu内嵌的tftp服务器

        hostfwd=[tcp/udp]:[hostaddr]:hostport-[guestaddr]:guestport :将访问宿主机的hostport端口tcp/udp链接重定向到客户机的guestport端口上,可以多次使用

        guestfwd=[tcp]:server:port-dev,将客户机中访问ip地址为server的端口连接转发到宿主机的dev这个字符设备上

        bootfile=file:让file文件成为客户机可以使用的bootp启动镜像文件,它与tftp选项联合使用,可以实现从网络启动客户机的功能

        smb=dir[,smbserver=addr]:激活samba功能

例子:

        qemu-system-x86_64 -m 4096 -smp 8 -net nic -net user,tftp=/root/tftp,hostfwd=tcp::5022-:22 redhat6.qcow2

        这里我们把宿主机的5022端口转发到客户机的22端口,结果如下:

wKioL1g9LlnAws1-AABuNRJ6S-Y278.png-wh_50
















本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1877755 ,如需转载请自行联系原作者



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
461 1
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
636 3
|
安全 测试技术 虚拟化
VMware-三种网络模式原理
本文介绍了虚拟机三种常见网络模式(桥接模式、NAT模式、仅主机模式)的工作原理与适用场景。桥接模式让虚拟机如同独立设备接入局域网;NAT模式共享主机IP,适合大多数WiFi环境;仅主机模式则构建封闭的内部网络,适用于测试环境。内容简明易懂,便于理解不同模式的优缺点与应用场景。
1667 0
|
缓存 索引
基于Reactor模式的高性能网络库之缓冲区Buffer组件
Buffer 类用于处理 Socket I/O 缓存,负责数据读取、写入及内存管理。通过预分配空间和索引优化,减少内存拷贝与系统调用,提高网络通信效率,适用于 Reactor 模型中的异步非阻塞 IO 处理。
426 3
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
683 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
网络协议 安全 网络安全
NAT网络地址转换
NAT(网络地址转换)是一种关键的网络技术,通过将内部私有地址转换为外部公网地址,实现多设备共享单一公网IP上网。它不仅解决了IPv4地址不足的问题,还增强了网络安全,隐藏了内部网络结构。NAT主要分为静态NAT、动态NAT和NAPT(网络地址端口转换)三种类型,广泛应用于家庭和企业网络中。然而,NAT也存在对某些应用不友好、增加延迟及与IPv6不兼容等缺点。
1966 14
|
负载均衡 安全 网络安全
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
799 6
|
网络协议 测试技术 Linux
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
522 0

热门文章

最新文章