利用ssh端口转发使内网服务对公网可见
近日实验室一合作项目需要将校内的某web站点发现到公网,但是校内的地址都是10.0.0.0/8的私网地址,对外不可见。如果要向校方申请公网ip未免太过麻烦,想到自己有一VPS,拿来做端口转发应该是满足这个需求的。
ssh的端口转发有三种,本地、远程和动态,动态转发应该是更为大家熟悉的,因为它可以用来做socks5代理。但是HTTP服务明显不能用socks5的形式来发布,所以这里我们可以用local/remote端口转发。
场景与效果
使内网ip为10.x.x.x的主机的80服务对外可用,拥有一台ip为104.x.x.x的公网VPS(虚拟服务器)。
设置完成后,访问http://104.x.x.x:8080将等同于访问10.x.x.x的80端口。
Local方式
本地转发的意思是将本地的某个端口映射到远程的主机的某端口上,使得访问本地端口就等同于访问远程主机。那么放到我们的场景上,本地主机就是104.x.x.x,远程主机自然是10.x.x.x。
这种方式应该是比较安全的,不需要对本地和远程的机器做多余的设置。但是这里有一个问题,既然10.x.x.x是内网地址那么远程主机又如何主动访问呢?
幸运地我们的远程和本地主机都有ipv6地址,ipv6地址是global的,可以相互访问,且不用登录校园ipv4网关就可以互通。这里我用IPv6来建立ssh连接。
- 校内主机的ipv6地址:2001:da8:215:306:8024:x:x:x
- VPS的ipv6地址:2001:470:66:x::x
在VPS上运行:
通过-L参数指定本地和远程地址+端口,就将VPS的8080端口映射到了校内主机的80端口,所有访问104.x.x.x:8080的流量将通过ssh连接转向10.x.x.x:80。
所以这种方式是有限制的,如果没有ipv6的条件,就只能用以下的方式了。
Remote方式
和本地转发类似的,这次是将远程的某端口映射到本地某端口,在我们的场景下,这次就要在本地主机(10.x.x.x)上操作了。
当然使用IPv6地址也是可以。这次使用的参数是-R,地址端口指定的顺序也相应地变成了先远程后本地。
光这样还是不行的,因为需要远程主机的sshd(server)作端口转发,所以相应地要对其sshd作配置。
以下是对远程主机的操作(VPS):
重启sshd
还需要重新ssh连接,才最终完成。