这可能是非常基本的,但我现在对此陷入困境。我在 KVM 上有一个虚拟机,其中有一些套接字服务器。我能够通过本地主机连接到这台机器,即使用主机上的客户端,但我想要做的是能够远程连接。我所说的远程是指从另一台电脑。
现在我什至无法 ping 通这些机器。默认情况下分配给这台机器的 IP 是192.168.122.122
,当我的主机连接到大学网络时,它的 IP 类似于10.5.135.*
。有什么方法可以远程连接到我的应用程序吗?最好不必更改虚拟机的 IP,因为我需要更改很多配置。如果需要的话,我愿意创建一个具有静态 IP 的热点。
感谢我在这方面能得到的任何帮助。
答案1
您可以在主机上为某些 TCP 和 UDP 端口配置端口转发。不过,用 ICMP 进行 DNAT 似乎是不可能的。
替代方法是设置从远程系统到主机的加密(SSH、OpenVPN、IPsec)或明文隧道,并通过远程系统上的此隧道设置 VM 地址的路由。
SSH 端口转发
host_ip='10.5.135.42'
vm_ip='192.168.122.122'
vm_port=42
# on the remote system
ssh -L "127.0.0.1:1234:${vm_ip}:${vm_port}" user@$host_ip
当此 SSH 连接处于活动状态时,您可以在远程系统上连接到端口 1234 并到达虚拟机上所需的端口:
telnet localhost 1234
DNAT 与 iptables
在主机上:
vm_ip='192.168.122.122'
vm_port=42
iptables -t nat -A PREROUTING -p tcp --dport "$vm_port" -j DNAT --to-destination "$vm_ip"
iptables -t nat -A POSTROUTING -p tcp -d "$vm_ip" --dport "$vm_port" -j MASQUERADE
然后您可以连接到主机上的端口,数据包将被重定向到虚拟机。因为虚拟机看到来自主机的数据包(而不是由于伪装而来自远程系统),所以这是有效的。