前段时间有个需求,就是需要在公司连回到家里面的电脑,看看挂机下载的情况。公司是一个局域网,家里面的电脑也在小区局域网里面,看上去无法直接连回去家里面的电脑。这个就需要公网有一个中继服务器来帮助建立连接。
vpn
首先因为有VPN,所以就先尝试了一下两台电脑连上了同一个VPN,这样我们都有一个网段的IP。我在公司直接发起了连接家里电脑在vpn里面的局域网ip,就连上了vnc了,就这么容易连上了另一个局域网里面的家里的电脑了。
VPN可以非常轻松地把两个不同的局域网的电脑连接到同一个虚拟的局域网里面啊。
SSH
不过觉得vpn有些过于重量级,所以还是想用一下ssh试试,这个同样需要在外网有一台电脑来做中继。
我们首先在家中的电脑运行:
1 | ssh user@everet.org -p 22 -fNR 21990:localhost:3389 |
在公司的电脑中运行
1 | ssh user@everet.org -p 22 -fNL 9999:localhost:21990 |
然后在公司电脑访问localhost:9999就是访问家里面电脑的3389这个端口了。
参数
-N
是指不执行任何命令,不过不加-N
的话,就会直接登录到远程服务器,然后显示一个shell。-f
是指在后台运行-L
是指访问本地的指定端口会转发到远程的一个端口,例如9999:localhost:80就是访问本地9999就等价于访问远程的80这个端口-R
正好与-L
相反,21990:localhost:3389就是访问远程的服务器中的21990就等于访问本地的3389这个端口。
例子
1 | ssh user@everet.org -p 22 -fNL 9999:localhost:80 |
我们在本机运行上述命令,就可以在本机访问http://localhost:9999/ 来访问远程服务器的80了。
其他用途
在工作中,服务器的一些重要的接口都是有IP白名单限制的,例如远程的数据库服务器(db.everet.org)只开发了开发机(dev.everet.org)的白名单,就是说,只有从开发机才能连上远程的数据库服务器。而我喜欢在本地开发与测试,就不希望老是要部署到开发机上面才能跑。于是就可以使用通过ssh tunnel到开发机,通过开发机来连接远程的数据库服务器,就可以在本地连接远程的数据库服务器了。
1 | ssh user@dev.everet.org -p 22 -fNL 3333:db.everet.org:3306 |
然后就可以通过连接本地的3333来连接到db.everet.org的数据库了。