Contents
  1. 1. 场景与效果
  2. 2. Local方式
  3. 3. Remote方式

  近日实验室一合作项目需要将校内的某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上运行:

1
ssh -L 0.0.0.0:8080:localhost:80 user@2001:da8:215:306:8024:x:x:x

通过-L参数指定本地和远程地址+端口,就将VPS的8080端口映射到了校内主机的80端口,所有访问104.x.x.x:8080的流量将通过ssh连接转向10.x.x.x:80。

  所以这种方式是有限制的,如果没有ipv6的条件,就只能用以下的方式了。

Remote方式

  和本地转发类似的,这次是将远程的某端口映射到本地某端口,在我们的场景下,这次就要在本地主机(10.x.x.x)上操作了。

1
ssh -R 8080:localhost:80 user@104.x.x.x

当然使用IPv6地址也是可以。这次使用的参数是-R,地址端口指定的顺序也相应地变成了先远程后本地。

光这样还是不行的,因为需要远程主机的sshd(server)作端口转发,所以相应地要对其sshd作配置。

以下是对远程主机的操作(VPS):

1
2
#edit file /etc/ssh/sshd_config, add the following line
GatewayPorts yes

重启sshd

1
/etc/init.d/sshd restart

还需要重新ssh连接,才最终完成。

Contents
  1. 1. 场景与效果
  2. 2. Local方式
  3. 3. Remote方式