起因是这样的,我在服务器上安装了个虚拟winxp。但是想要在外网远程控制却不行,因为这个虚拟系统没有公网IP。

我的服务器是有公网IP的,例如:210.1.1.1

服务器所在内网全部是10.0.1.x 网段,外网IP是通过路由器映射给服务器的,也就是说服务器上查看IP,只有10.0.1.1这个   虚拟机我是用的xen,然后采用nat方式将一个192.168.122.x的ip分配给虚拟winxp使用。这个192.168.122.x段ip只有虚拟服务器和虚拟机可以访问到,就连同一个内网的10.0.1.x段其他机器都不能访问

我要想远程控制winxp,只有两个办法,一个是通过xen提供的vnc来访问。也就是访问10.0.1.1:5901或者外网210.1.1.1:5901

但是vnc的速度确实比winxp的远程桌面慢,有时候刷屏都很卡。但是winxp的ip又不能从外面访问,只能虚拟服务器自己用。   后来我就想到了用ssh来做跳转,将192.168.122.1(winxp的ip)下3389端口转发过来,这样不是就可以远程通过3389访问了?   因为mac下面的命令行直接支持ssh,确实比windows方面。linux下的常用命令和工具都支持!

我就直接在外网通过下面命令建立了ssh隧道

ssh -N -L3389:192.168.122.1:3389 root@114.251.211.103

其中-N表示不用显示提示符,这个选项也可以不要 -L表示建立一个隧道,格式:[-L [bind_address:]port:host:hostport]

我的这条命令就是将本地的3389端口通过ssh转发到192.168.122.1的3389端口,注意:这里的192.168.122.1必须是远程ssh服务器可以访问的。

这样你访问本地127.0.0.1:3389就相当于直接访问192.168.122.1:3389了

当然,通过调整端口也可以实现vnc的转发

其实通过ssh -D等选项,还可以建立ssh通道,让浏览器翻墙使用。这个网上资料很多,就不多说了。