在centos7上 创建的 kvm 虚拟机,如果虚拟网络设置为 NAT 而不是 bridge 的话,从宿主机之外是没有办法直接访问的,只能在宿主机上进行连接。
这样很不方便。有人说为什么不使用bridge网络呢。如果要从宿主机之外的主机直接访问的话。原因是因为,公司只给你分配这一个IP啊。
如果想开放虚拟机的某个服务端口,比如 ssh 或者 http,可以在宿主机上设置 iptables 规则。
步骤如下:
1. 禁用centos主机的防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
2.禁用selinux
2.1打开/etc/selinux/config
2.2找到'SELINUX='行,将它的值设置为'disabled'。
3.允许路由转发(网上很多教程都没有提到这一步)
3.1进入目录/etc/sysctl.d
3.2创建文件00-system.conf
3.3在这个文件中追加一行net.ipv4.ip_forward = 1
3.4重启生效,或者输入命令生效sudo sysctl -p
4.设置iptables规则
需要实现的是,当访问宿主机 (HOST_IP
) 的特定端口 (HOST_PORT
) 时,转发给指定的虚拟机端口 (GUEST_IP:GUEST_PORT
)。
在宿主机上运行以下 iptables
命令:
$ sudo iptables -I FORWARD -o virbr0 -p tcp -d $GUEST_IP --dport $GUEST_PORT -j ACCEPT $ sudo iptables -t nat -I PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
举例: KVM虚拟机的IP地址为192.168.122.162。 开放的端口为122(本来是开放端口22,但是端口22被主机占用了) 需要设置如下两条iptables规则。sudo iptables -I FORWARD -o virbr0 -d 192.168.122.162 -p tcp --dport 122 -j ACCEPT
sudo iptables -t nat -I PREROUTING -p tcp --dport 122 -j DNAT --to 192.168.122.162:122
5. 此时可以通过HOST_IP:HOST_PORT访问主机了。
Comments