Administrator
Administrator
发布于 2024-10-31 / 65 阅读
1
0

基于Ubuntu22.04进行KVM虚拟化

  1. 检查服务器是否支持KVM虚拟化

egrep -c '(vmx|svm)' /proc/cpuinfo 

如果大于0表示支持,输出0表示不支持

如果为0可以尝试执行以下操作:

# 对于 Intel 处理器
if [[ -f /sys/module/kvm_intel/parameters/nested ]]; then
    sudo modprobe -r kvm_intel
    sudo modprobe kvm_intel nested=1
    echo "Intel 处理器已开启嵌套虚拟化"
fi

# 对于 AMD 处理器
if [[ -f /sys/module/kvm_amd/parameters/nested ]]; then
    sudo modprobe -r kvm_amd
    sudo modprobe kvm_amd nested=1
    echo "AMD 处理器已开启嵌套虚拟化"
fi
  1. 安装虚拟化工具

apt-get update
apt-get install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst cloud-image-utils genisoimage libosinfo-bin openvswitch-switch

如果无法正常安装,可以修改源(/etc/apt/sources.list)进行

vim /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse

检查服务是否正常

systemctl enable --now libvirtd
systemctl status libvirtd
virsh list --all
  1. cloud-init的写法

cloud-init的目录结构

cloud-init.iso
├── meta-data                 # 元数据文件
└── user-data                 # 用户数据文件

可以根据需求选择添加 network-config 文件以进行网络配置。

3.1 meta-data 文件内容

meta-data 文件用于定义实例的基本元数据,例如主机名、实例 ID 等。其内容格式为 YAML 格式,常见内容如下:

# meta-data

instance-id: my-instance-id   # 唯一实例标识符
local-hostname: my-hostname   # 实例主机名

instance-id:实例的唯一标识符,cloud-init 会根据该 ID 来确定是否为新实例。

local-hostname:设置实例的主机名。

3.2 user-data 文件配置示例

#cloud-config

# 配置用户并使用明文密码
users:
  - name: ubuntu
    passwd: "YourPassword123"         # 明文密码
    lock_passwd: false                # 允许密码登录
    ssh_pwauth: true                  # 启用 SSH 密码认证
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
    ssh_authorized_keys: []           # 禁用密钥登录,设置为空数组

# 禁用密钥认证
ssh_pwauth: true

# 禁用 SSH 公钥
disable_root: false

# 启用root登录
ssh_pwauth: true
disable_root: false

配置说明

passwd: 为 root 用户设置明文密码。

lock_passwd: 设置为 false,解除 root 用户的密码锁定。

ssh_pwauth: 设置为 true 以启用 SSH 密码认证。

disable_root: 设置为 false,允许 root 用户通过 SSH 登录。

这样配置后,cloud-init 会允许 root 用户通过密码登录,而无需使用密钥。

3.3 可以使用 genisoimage 或 mkisofs 命令来创建 ISO 文件:

genisoimage -output cloud-init.iso -volid cidata -joliet -rock user-data meta-data

4. Cloudbase-Init的写法与目录结构 (Windows没研究好,跳过)

对于 Cloudbase-Init,NoCloud 数据源的 ISO 结构也通常包含两个主要文件:

cloudbase-init.iso
├── meta-data                 # 元数据文件
└── user-data                 # 用户数据文件

可以根据需求选择添加 network-config 文件以进行网络配置。

4.1 meta-data 文件内容

meta-data 文件用于提供虚拟机的元数据信息,比如主机名和实例 ID。Cloudbase-Init 可以读取此文件,以设置 Windows 虚拟机的基础信息。内容示例如下:

# meta-data

instance-id: my-instance-id    # 唯一实例标识符
local-hostname: my-hostname    # 虚拟机的主机名

instance-id:实例的唯一标识符,Cloudbase-Init 会使用此信息确定是否为新实例。

local-hostname:设置虚拟机的主机名。

4.2 user-data 文件内容

user-data 文件可以包含启动时运行的初始化脚本或配置,用于定义用户、密码设置、执行命令等内容。对于 Cloudbase-Init,user-data 文件通常采用 cloud-config 或 PowerShell 脚本格式。

使用 Cloud-Config 格式:

#cloud-config

# 配置用户
users:
  - name: Administrator
    plain_text_passwd: "YourPassword123"    # 直接使用明文密码
    lock_passwd: false
    groups: Administrators
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash

# 执行初始化命令
runcmd:
  - echo "Cloudbase-Init has configured the instance" > C:\cloudbase-init.txt

使用使用 PowerShell 格式:

#ps1

# 设置 Administrator 用户的明文密码
net user Administrator YourPassword123 /Y

# 其他初始化命令
New-Item -Path "C:\cloudbase-init.txt" -ItemType File -Value "Cloudbase-Init has configured the instance"

4.3 还可以使用 net user 设置明文密码

这是 Windows 内置命令,可以在 PowerShell 脚本或 runcmd 中使用:

#cloud-config

runcmd:
  - net user Administrator YourPassword123 /Y

4.4 创建ISO文件

可以使用 genisoimage 或 mkisofs 命令来创建 ISO 文件:

genisoimage -output cloudbase-init.iso -volid cidata -joliet -rock user-data meta-data

5 Ubuntu22.04桥接网卡

通用模板:

# /etc/netplan/01-bridge-config.yaml
network:
  version: 2
  renderer: networkd            # 使用 systemd-networkd 管理网络(可根据需求改为 NetworkManager)

  ethernets:
    INTERFACE_NAME:             # 物理网卡名称(例如 eth0, eno1)
      dhcp4: no                 # 禁用 DHCP
      match:
        macaddress: MAC_ADDRESS # 物理网卡的 MAC 地址,用于匹配正确的网卡
      set-name: INTERFACE_NAME  # 设置网卡名称(与上方的名称保持一致)

  bridges:
    br0:
      interfaces: [INTERFACE_NAME]      # 将物理网卡添加到桥接接口
      dhcp4: no                         # 为桥接接口禁用 DHCP

      # 设置静态 IP 地址和子网掩码(如 192.168.1.100/24)
      addresses: 
        - STATIC_IP/24

      # 设置默认网关(如 192.168.1.1)
      gateway4: GATEWAY_IP

      # 配置 DNS 服务器
      nameservers:
        addresses:
          - DNS_SERVER_1              # 主 DNS 服务器(如 8.8.8.8)
          - DNS_SERVER_2              # 备用 DNS 服务器(如 8.8.4.4)

      # 其他桥接参数
      parameters:
        stp: false                     # 禁用生成树协议(STP)
        forward-delay: 0               # 设置转发延迟

使用命令将虚拟机添加到这个网络桥接口

sudo virsh attach-interface --domain <vm-name> --type bridge --source br0 --model virtio --config --live

查看网络接口是否添加

sudo virsh domiflist <vm-name>

虚拟机内部临时绑定公网IP

ip addr     # 查看网络接口
ip link set 网卡 up    # 启用网卡
ip addr add IP地址/24 dev 网卡  # 添加IP地址
ip route show    # 查看当前路由表
ip route del default  # 删除现在的网关(可选)
ip route del default via 现在的网关  # 无法添加新的网关的情况下删除
ip route add default via 网关 dev 网卡   # 指定默认网关
ip route show  # 验证新的网关

如果需要固定IP,请添加到网卡配置文件

  1. 下载镜像

制作好的镜像地址:

AlmaLinux-8.8-x64.qcow2: http://149.88.95.3:5212/f/kBDxf1/AlmaLinux-8.8-x64.qcow2
AlmaLinux-9.2-x64.qcow2: http://149.88.95.3:5212/f/p84NuW/AlmaLinux-9.2-x64.qcow2
CentOS-5.9-x64.qcow2: http://149.88.95.3:5212/f/W91Aub/CentOS-5.9-x64.qcow2
CentOS-6.10.1907-x64.qcow2: http://149.88.95.3:5212/f/Dd8bcx/CentOS-6.10.1907-x64.qcow2
CentOS-6.3.1206-x64.qcow2: http://149.88.95.3:5212/f/1lmDSD/CentOS-6.3.1206-x64.qcow2
CentOS-6.7.1504-x64.qcow2: http://149.88.95.3:5212/f/7lmjsm/CentOS-6.7.1504-x64.qcow2
CentOS-6.8.1607-x64.qcow2: http://149.88.95.3:5212/f/Jep7ud/CentOS-6.8.1607-x64.qcow2
CentOS-6.9.1704-x64.qcow2: http://149.88.95.3:5212/f/rjBacZ/CentOS-6.9.1704-x64.qcow2
CentOS-7.1.1503-x64.qcow2: http://149.88.95.3:5212/f/lr1bTR/CentOS-7.1.1503-x64.qcow2
CentOS-7.2.1511-x64.qcow2: http://149.88.95.3:5212/f/8bDaSp/CentOS-7.2.1511-x64.qcow2
CentOS-7.3.1611-x64.qcow2: http://149.88.95.3:5212/f/5b9rsb/CentOS-7.3.1611-x64.qcow2
CentOS-7.4.1708-x64.qcow2: http://149.88.95.3:5212/f/vr3PiA/CentOS-7.4.1708-x64.qcow2
CentOS-7.5.1804-x64.qcow2: http://149.88.95.3:5212/f/RxdpuA/CentOS-7.5.1804-x64.qcow2
CentOS-7.6.1810-x64.qcow2: http://149.88.95.3:5212/f/lr1euR/CentOS-7.6.1810-x64.qcow2
CentOS-7.7.1908-x64.qcow2: http://149.88.95.3:5212/f/VP95Cd/CentOS-7.7.1908-x64.qcow2
CentOS-7.8.2003-x64.qcow2: http://149.88.95.3:5212/f/1lm5cD/CentOS-7.8.2003-x64.qcow2
CentOS-8.1.1911-x64.qcow2: http://149.88.95.3:5212/f/0DngH4/CentOS-8.1.1911-x64.qcow2
CentOS-8.2.2004-x64.qcow2: http://149.88.95.3:5212/f/NJYVTx/CentOS-8.2.2004-x64.qcow2
CentOS-8-Stream-x64.qcow2: http://149.88.95.3:5212/f/8bDkUp/CentOS-8-Stream-x64.qcow2
CentOS-9-Stream-x64.qcow2: http://149.88.95.3:5212/f/42oLfm/CentOS-9-Stream-x64.qcow2
Debian-10.3.3-x64.qcow2: http://149.88.95.3:5212/f/XkykTe/Debian-10.3.3-x64.qcow2
Debian-9.12.1-x64.qcow2: http://149.88.95.3:5212/f/90ARcO/Debian-9.12.1-x64.qcow2
Fedora-25-x64.qcow2: http://149.88.95.3:5212/f/zo8dip/Fedora-25-x64.qcow2
Fedora-26-x64.qcow2: http://149.88.95.3:5212/f/q9PYFD/Fedora-26-x64.qcow2
Fedora-27-x64.qcow2: http://149.88.95.3:5212/f/3n2BC8/Fedora-27-x64.qcow2
Fedora-28-x64.qcow2: http://149.88.95.3:5212/f/eLAAhd/Fedora-28-x64.qcow2
Fedora-29-x64.qcow2: http://149.88.95.3:5212/f/dEOgSB/Fedora-29-x64.qcow2
Fedora-31-x64.qcow2: http://149.88.95.3:5212/f/YkenCy/Fedora-31-x64.qcow2
Linux_Rescue.qcow2: http://149.88.95.3:5212/f/nBDRsW/Linux_Rescue.qcow2
OpenEuler-22.03-LTS-SP1-x64.qcow2: http://149.88.95.3:5212/f/brgkcL/OpenEuler-22.03-LTS-SP1-x64.qcow2
Rocky-linux-8.8-x64.qcow2: http://149.88.95.3:5212/f/BX54cN/Rocky-linux-8.8-x64.qcow2
Rocky-linux-9.2-x64.qcow2: http://149.88.95.3:5212/f/2ObqcB/Rocky-linux-9.2-x64.qcow2
Ubuntu-16.04-x64.qcow2: http://149.88.95.3:5212/f/NJYxux/Ubuntu-16.04-x64.qcow2
Ubuntu-18.04-x64.qcow2: http://149.88.95.3:5212/f/mPJ0tV/Ubuntu-18.04-x64.qcow2
Ubuntu-20.04.1-x64.qcow2: http://149.88.95.3:5212/f/joDYIj/Ubuntu-20.04.1-x64.qcow2
Ubuntu-22.04-x64.qcow2: http://149.88.95.3:5212/f/KJdysp/Ubuntu-22.04-x64.qcow2
Windows_Rescue.qcow2: http://149.88.95.3:5212/f/Zyd2Tr/Windows_Rescue.qcow2
Windows10-cn.qcow2: http://149.88.95.3:5212/f/Oe5Vs3/Windows10-cn.qcow2
Windows-2003-Enterprise-cn.qcow2: http://149.88.95.3:5212/f/Aa8OHR/Windows-2003-Enterprise-cn.qcow2
Windows-2008R2-Datacenter-cn.qcow2: http://149.88.95.3:5212/f/wzEqSy/Windows-2008R2-Datacenter-cn.qcow2
Windows-2012R2-Datacenter-cn.qcow2: http://149.88.95.3:5212/f/xDOBFE/Windows-2012R2-Datacenter-cn.qcow2
Windows-2016-Datacenter-cn.qcow2: http://149.88.95.3:5212/f/aXA5fO/Windows-2016-Datacenter-cn.qcow2
Windows-2019-Datacenter-cn.qcow2: http://149.88.95.3:5212/f/yLzeIb/Windows-2019-Datacenter-cn.qcow2
Windows-2019-Standard-en.qcow2: http://149.88.95.3:5212/f/EPBxHX/Windows-2019-Standard-en.qcow2
Windows-2022-Datacenter-cn.qcow2: http://149.88.95.3:5212/f/PdvVTz/Windows-2022-Datacenter-cn.qcow2
Windows7_enterprise-cn.qcow2: http://149.88.95.3:5212/f/gwEAHy/Windows7_enterprise-cn.qcow2
  1. 创建虚拟机

virt-install通用参数解释

1. --name kvm001
作用: 指定虚拟机的名称。
解释: kvm001 是虚拟机的标识名称。在 virsh list 中会以此名称显示虚拟机。
2. --memory 12288
作用: 为虚拟机分配内存。
解释: 12288 表示分配 12288 MB 的内存,也就是 12 GB。
3. --vcpus sockets=1,cores=12,threads=1
作用: 设置虚拟机的 CPU 配置。
解释: 这里表示虚拟机将拥有 1 个 CPU 插槽,每个插槽有 12 个核心,并且每个核心只有一个线程(不使用超线程)。因此总共分配 24 个虚拟 CPU (vCPUs)。
4. --disk path=/home/kvm/kvm001/Ubuntu-22.04-x64.qcow2,format=qcow2,bus=virtio
作用: 为虚拟机指定磁盘。
解释:
path=/home/kvm/kvm001/Ubuntu-22.04-x64.qcow2 指定虚拟磁盘的路径。
format=qcow2 表示磁盘文件使用 qcow2 格式,这是 KVM 支持的常用磁盘格式,具有支持快照和压缩的特性。
bus=virtio 指定磁盘使用 virtio 总线模型,这是一种高性能的虚拟化驱动类型,通常用于提高 I/O 性能。
5. --disk path=/home/kvm/kvm001/seed.iso,device=cdrom
作用: 为虚拟机添加 CD-ROM 驱动器。
解释:
path=/home/kvm/kvm001/seed.iso 是光盘镜像的路径,这里通常用于无提示自动安装(cloud-init 或 kickstart 文件)。
device=cdrom 指定该磁盘作为光驱设备。
6. --os-variant ubuntu22.04
作用: 指定虚拟机的操作系统类型。
解释: ubuntu22.04 表示虚拟机使用 Ubuntu 22.04 操作系统。这个参数帮助 KVM 进行适当的优化和配置,比如内核参数和驱动等。
可以使用osinfo-query os 命令查看支持的操作系统类型
7. --network network=default,model=virtio
作用: 配置虚拟机的网络。
解释:
network=default 表示虚拟机将连接到默认网络(由 libvirt 管理的虚拟网络)。
model=virtio 表示使用 virtio 驱动程序进行网络通信,这是虚拟化环境中性能最佳的网卡驱动。
8. --graphics vnc,listen=0.0.0.0
作用: 配置虚拟机的图形输出。
解释:
vnc 表示虚拟机将通过 VNC(虚拟网络计算)提供图形化界面。
listen=0.0.0.0 表示 VNC 服务器将监听所有 IP 地址,这样就可以从外部访问虚拟机的图形界面。注意:建议在生产环境中对 VNC 访问进行加密和限制。
9. --console pty,target_type=serial
作用: 设置虚拟机的控制台访问方式。
解释:
pty 表示将虚拟机的控制台映射到主机的伪终端。
target_type=serial 表示虚拟机的控制台将使用串口通信,这在无图形界面的安装或调试中很常用。
10. --boot hd
作用: 设置虚拟机的启动设备。
解释: hd 表示虚拟机将从硬盘启动。
11. --cpu host-passthrough
作用: 配置虚拟机的 CPU 模型。
解释: host-passthrough 将宿主机的 CPU 直接透传给虚拟机,使虚拟机可以看到并使用宿主机的 CPU 特性。这通常会提升性能,但要求宿主机和虚拟机的 CPU 兼容性较高。
12. --noautoconsole
作用: 禁止自动连接到虚拟机的控制台。
解释: --noautoconsole 表示在创建虚拟机后不会自动连接到它的控制台。这允许您在后台创建虚拟机,而无需打开控制台窗口。

创建示例:

virt-install \
  --name kvm001 \
  --memory 12288 \
  --vcpus sockets=1,cores=12,threads=1 \
  --disk path=/home/kvm/kvm001/Ubuntu-22.04-x64.qcow2,format=qcow2,bus=virtio \
  --disk path=/home/kvm/kvm001/seed.iso,device=cdrom \
  --os-variant ubuntu22.04 \
  --network network=default,model=virtio \
  --graphics vnc,listen=0.0.0.0 \
  --console pty,target_type=serial \
  --boot hd \
  --cpu host-passthrough \
  --noautoconsole

从特定的xml的配置文件启动虚拟机

  1. 虚拟机读写限制

8.1 限制虚拟机读写速度

可以使用 --read-bytes-sec 和 --write-bytes-sec 参数来限制虚拟机的磁盘读写速度。这里假设虚拟机名称为 vm1,磁盘设备为 vda

# 限制读写速度(单位:字节/秒)
virsh blkdeviotune vm1 vda --read-bytes-sec 10485760 --write-bytes-sec 5242880 --live

--read-bytes-sec 10485760:限制读取速度为 10 MB/s。

--write-bytes-sec 5242880:限制写入速度为 5 MB/s。

--live:实时应用配置,不需要重启虚拟机。

8.2 限制虚拟机 IOPS

使用 --read-iops-sec 和 --write-iops-sec 参数可以设置每秒的 IOPS 限制:

# 限制 IOPS
virsh blkdeviotune vm1 vda --read-iops-sec 100 --write-iops-sec 50 --live

--read-iops-sec 100:限制每秒读取 IOPS 为 100。

--write-iops-sec 50:限制每秒写入 IOPS 为 50。

8.3 设置突发读写速度和 IOPS

可以通过 --read-bytes-sec-max、--write-bytes-sec-max、--read-iops-sec-max 和 --write-iops-sec-max 设置突发速度和 IOPS 限制,--*_burst 参数控制突发持续时间:

# 设置突发读写和 IOPS
virsh blkdeviotune vm1 vda \
    --read-bytes-sec 10485760 \
    --write-bytes-sec 5242880 \
    --read-bytes-sec-max 20971520 \
    --write-bytes-sec-max 10485760 \
    --read-iops-sec 100 \
    --write-iops-sec 50 \
    --read-iops-sec-max 200 \
    --write-iops-sec-max 100 \
    --read-iops-sec-burst 500 \
    --write-iops-sec-burst 250 \
    --live

--read-bytes-sec-max 20971520:设置突发读取速度上限为 20 MB/s。

--write-bytes-sec-max 10485760:设置突发写入速度上限为 10 MB/s。

--read-iops-sec-max 200 和 --write-iops-sec-max 100:突发的最大 IOPS 值。

--read-iops-sec-burst 和 --write-iops-sec-burst:设置突发 IOPS 的持续时间。

8.4 查看当前限制

可以使用 virsh blkdeviotune 查看当前配置的 I/O 限制:

virsh blkdeviotune vm1 vda

确保磁盘设备名称(如 vda)正确,可以通过 virsh domblklist vm1 查看虚拟机的磁盘设备列表。

--live 参数确保设置在运行中的虚拟机上即时生效。

  1. kvm虚拟机命令行日常维护

基本管理操作
列出所有虚拟机:virsh list --all
启动虚拟机:virsh start <vm_name>
优雅地关闭虚拟机:virsh shutdown <vm_name>
断电关机(强制关闭):virsh destroy <vm_name>
重启虚拟机:virsh reboot <vm_name>
强制重启(硬重启):virsh reset <vm_name>
暂停虚拟机:virsh suspend <vm_name>
恢复虚拟机:virsh resume <vm_name>
删除虚拟机:virsh undefine <vm_name>
从xml中启动: virsh define <xml_name>

配置和状态查看
编辑虚拟机配置文件:virsh edit <vm_name>
查看虚拟机磁盘信息:virsh domblklist <vm_name>
查看虚拟机网卡 IP 地址:virsh domifaddr <vm_name>
查看虚拟机的 VNC 端口:virsh vncdisplay <vm_name>
从宿主机登录虚拟机控制台:virsh console <vm_name>
查看虚拟机 ID:virsh domid <vm_name>
查看虚拟机 UUID:virsh domuuid <vm_name>

网络管理
列出所有网络:virsh net-list
启动指定网络:virsh net-start <network_name>
停止指定网络:virsh net-destroy <network_name>
编辑虚拟网络配置:virsh net-edit <network_name>
查看虚拟机接口列表:virsh domiflist <vm_name>
添加网络接口:virsh attach-interface <vm_name> <network/bridge>
移除网络接口:virsh detach-interface <vm_name> <interface>

磁盘管理
查看虚拟机的磁盘信息:virsh domblklist <vm_name>
挂载磁盘到虚拟机:virsh attach-disk <vm_name> <disk_path> <target_dev>
从虚拟机卸载磁盘:virsh detach-disk <vm_name> <target_dev>
调整磁盘大小:virsh blockresize <vm_name> <target_dev> <size>
列出存储池中的磁盘卷:virsh vol-list <pool_name>

性能和资源管理
动态调整虚拟机内存:virsh setmem <vm_name> <memory>
动态调整虚拟机 CPU 数量:virsh setvcpus <vm_name> <vcpus>
查看虚拟机内存使用情况:virsh dommemstat <vm_name>
限制磁盘 I/O 速率:virsh blkiotune <vm_name>
管理磁盘设备的 I/O 限制:virsh blkdeviotune <vm_name> <disk>
设置带宽限制:virsh domiftune <vm_name> <interface> --inbound <rate> --outbound <rate>
保存虚拟机状态到文件:virsh save <vm_name> <path>
从文件恢复虚拟机状态:virsh restore <path>

快照和备份
创建快照:virsh snapshot-create-as <vm_name> <snapshot_name>
列出所有快照:virsh snapshot-list <vm_name>
恢复到指定快照:virsh snapshot-revert <vm_name> <snapshot_name>
删除快照:virsh snapshot-delete <vm_name> <snapshot_name>

虚拟机性能监控
查看虚拟机统计信息(CPU、内存、磁盘、网络等):virsh domstats <vm_name>
查看虚拟机 CPU 使用情况:virsh cpu-stats <vm_name>
查看宿主机上的网络接口使用情况:virsh iface-metrics <interface>
获取或同步虚拟机时间:virsh domtime <vm_name>

设备管理和安全
通过 XML 添加设备:virsh attach-device <vm_name> <device.xml>
通过 XML 移除设备:virsh detach-device <vm_name> <device.xml>
  1. 在无虚拟交换机和独立 IP 的 KVM 环境下,通过 iptables 实现外部网络映射

10.1 开启 IP 转发

首先,需要开启 IP 转发功能,使得宿主机可以将外部网络流量转发至虚拟机。

sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
sysctl -p

10.2 查看虚拟机的 IP 地址

使用 virsh domifaddr <vm_name> 命令查看虚拟机的内部 IP 地址,用于设置目标 IP。

10.3 设置 iptables 规则

使用 iptables 设置端口转发规则,将外部端口映射到虚拟机的内部 IP 和端口:

  • PREROUTING:用于将指定端口的流量转发到虚拟机的 IP 和端口。

  • POSTROUTING:使用 MASQUERADE 实现源地址伪装,适用于动态外部 IP。

示例:

# 将宿主机的 30001 端口映射到虚拟机 192.168.122.143 的 22 端口
iptables -t nat -A PREROUTING -p tcp --dport 30001 -j DNAT --to-destination 192.168.122.143:22
iptables -t nat -A POSTROUTING -j MASQUERADE

注意:POSTROUTING 链使用 MASQUERADE,使流量通过动态外部 IP 伪装。

10.4 清除防火墙规则(如需)

如端口转发不通畅,可以清除当前 filter 表中的所有防火墙规则:

iptables -F

注意:这不会影响 natmangle 表。

10.5 删除指定规则

根据规则内容删除特定的 iptables 规则:

iptables -t nat -D PREROUTING -p tcp --dport 30001 -j DNAT --to-destination 192.168.122.143:22
iptables -t nat -D POSTROUTING -j MASQUERADE

10.6 真实 IP 转发

当宿主机有真实 IP 时,可以针对特定外部端口的流量进行精确转发:

# 外部真实 IP 转发
iptables -t nat -A PREROUTING -d 110.40.59.251 -p tcp --dport 30002 -j DNAT --to-destination 192.168.122.155:22
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o eth0 -j MASQUERADE

10.7 查看所有 NAT 规则

使用以下命令查看 iptables 的所有 NAT 规则:

iptables -t nat -L -n -v

此配置在无独立 IP 的 KVM 环境下,允许通过 iptables 转发宿主机端口到虚拟机内部端口,实现外部访问。

10.8 ipv6流量转发到内网ipv4中

# 将外部 IPv6 地址的 30002 端口流量转发到内网 IPv4 的 192.168.122.155:22
ip6tables -t nat -A PREROUTING -d 2001:db8::1 -p tcp --dport 30002 -j DNAT --to-destination 192.168.122.155:22

# 使用 MASQUERADE 实现源地址伪装,确保内网主机将流量返回到宿主机
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o eth0 -j MASQUERADE

验证规则

# 查看 IPv6 NAT 规则
ip6tables -t nat -L -n -v

# 查看 IPv4 NAT 规则
iptables -t nat -L -n -v


评论