KVM虚拟机通过iptables+NAT模式实现远程连接访问

KVM虚拟机通过iptables+NAT模式实现远程连接

前言

  • 由于服务器只有一个公网ip,想要KVM虚拟机可以远程登陆操控,桥接是无法实现这个念想了,所以直接采用iptable+NAT网络的模式来进行操作。
  • 本篇文章继承上一篇文章《Ubuntu配置GPU直传kvm虚拟机》https://blog.csdn.net/weixin_43802844/article/details/112569060 来续写。

KVM网络

  • 上篇文章采用的是桥接模式,这个模式需要给虚拟机一个额外的ip地址,如果是内网的话,可以选择桥接模式。如果有要远程连接登录的需求,就要考虑NAT模式 + iptables 端口转发的方式了

配置NAT网络

  • 按照正常情况下NAT都是默认开启的,执行virsh net-lis查看
    KVM虚拟机通过iptables+NAT模式实现远程连接访问_第1张图片

  • NAT模式开启之后会有一个NAT模式默认的网卡virbr0,这块网卡就是负责给虚拟机分配ip地址的网卡。

创建虚拟机(带有GPU直传)

  • sudo virt-install --name=ubuntu --memory=380000,maxmemory=380000 --vcpus=46,maxvcpus=46 --os-type=linux --os-variant=ubuntu18.04 --cdrom=/data/ubuntu-18.04.5-live-server-amd64.iso --disk path=/data/ubuntu.img,size=600 --network network=default --graphics vnc,listen=0.0.0.0,keymap=en_us --host-device 04:00.0 --host-device 83:00.0 --features kvm_hidden=on --machine q35 --check disk_size=off
    
  • --memory  //分配的内存
    --vcpus  //分配的cpu
    --cdrom  //ios映像文件,--location会出现hvm报错,所以直接选用cdrom减少麻烦
    --disk path  //硬盘  size大小为G
    --graphics vnc  //登录方式为vnc,创建过程vnc远程配置即可
    --host-device   //显卡的id,建议按组全部添加
    --features kvm_hidden=on   //阻止nvidia驱动发现虚拟机
    --machine q35    //采用q35架构
    --network network=default //default即为默认的NAT网络模式
    
  • 创建完成后使用vnc连接安装系统

配置iptables

  • 开启IP转发

    vi /etc/sysctl.conf
    net.ipv4.ip_forward=1      
    sysctl –p         //令上面修改生效
    
  • 配置iptables端口转发

    sudo iptables --table nat --append PREROUTING --protocol tcp --destination xx.xx.xx.xx --destination-port xxxx --jump DNAT --to-destination 192.168.122.xx:22
    sudo iptables -t nat -A PREROUTING -p tcp --dport xxxx -j DNAT --to-destination 192.168.122.2:22
    sudo iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.122.2 -j SNAT --to 192.168.122.1
    
    //注意:这里会有一个坑但是因人而异,这样配置完成之后可能会出现依旧无法实现远程连接的现象,这时候需要删除一个或者两个规则。
    
  • 查看iptables规则

    sudo iptables -nL -v --line-numbers -t filter
    
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1    21974   22M DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    2    21974   22M DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    3        0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    4        0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    5        0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    6        0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           
    7    11179   21M ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
    8    10793  776K ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
    9        0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    10       2    84 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    11       0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    12       0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
    13       0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
    14       0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    15       0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    
    

    这里的第十条和第十一条,阻止了我们的端口转发,需要把他删掉

  • 删除特定的iptables规则

    root@GPU-B175:~# sudo iptables -D FORWARD 10 -t filter
    root@GPU-B175:~# sudo iptables -D FORWARD 11 -t filter
    
  • 远程连接测试

KVM虚拟机通过iptables+NAT模式实现远程连接访问_第2张图片

你可能感兴趣的:(KVM,linux,ubuntu,ssh,kvm)