检查服务器是否支持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
安装虚拟化工具
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
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,请添加到网卡配置文件
下载镜像
制作好的镜像地址:
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
创建虚拟机
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的配置文件启动虚拟机
虚拟机读写限制
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 参数确保设置在运行中的虚拟机上即时生效。
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>
在无虚拟交换机和独立 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
注意:这不会影响
nat
或mangle
表。
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