ssh服务器重定向功能在家庭宽带动态ip资源发布中的应用

ssh是很强大的常用工具。利用ssh的重定向功能,我们可以非常方便的发布动态资源,实现对局域网中的非公网IP机器资源的远程访问。

家用宽带,一般是楼栋里好多家的局域网IP共享一个公网IP上网。即使是光纤宽带,也经常工作在局域网段。这种情况下,在家中架设一台服务器(如远程桌面、网页),即使安装了动态域名软件,也是无法从外部连接的。以我们学校的宿舍来说,经过了2层NAT。

请求202.X.X.X:80
X
X
X
局域网服务器192.168.100.100:80
楼道路由192.168.100.1
区域路由10.X.X.X
公网路由:202.X.X.X
来宾

上图中,局域网服务器位于2层网络背后,且没有路由器管理员权限。因此,除非购买某些内网穿透服务,否则无法实现客户机的连接。直接使用公网地址,访问到的是校园路由器的admin网页,并无法访问到192.168.100.100的网页。

我们采用ssh提供的重定向功能, 可以借助一台具备固定IP的计算机,访问局域网中的服务。低成本的解决方法是通过ssh,把192.168.100.100务器发布到云虚机上。

准备工作

  1. 购买一个入门级的云虚拟机,使用最普通的单核配置,512MB内存即可,一般很便宜(有烟瘾的可以就此戒烟)。
  2. 开放云虚拟机的ssh端口(22)、以及一个用于发布局域网服务的端口(如8990)。这里要格外注意,很多云服务商默认都不开放80端口。使用小端口80是要备案的。因此,可以选择一个大端口。
  3. 我们的192.168局域网80端口服务是windows的,因此要安装一个ssh客户端,比如直接安装git即可。在git-bash里有完整的ssh客户端。或者安装msys2,windows 10可以直接安装自带的linux子环境。

下面开始操作步骤:

配置SSH自动登入

这个阶段,我们从家庭局域网连接到云虚机。

ssh
局域网服务器192.168.100.100
楼道路由192.168.100.1
区域路由10.X.X.X
公网路由:202.X.X.X
云虚机

1、配置证书登入
在局域网机器上,生成登入的客户端证书

[user@happy ~]$ ssh-keygen

2、把证书拷贝到云虚机上去

[user@happy ~]$ scp .ssh/id_rsa.pub  [email protected]:/home/username/tmp.pub

注意,把username换成你的用户名,XXX换成自己的云虚机IP或者域名即可。

3、ssh登录云虚拟机,此时需要口令。

[user@happy ~]$ ssh [email protected]
[email protected]'s password:???[ENTER]
Last login: ...

[username@cloud ~]$  cat tmp.pub >> .ssh/authorized_keys 
[username@cloud ~]$  rm tmp.pub

该指令会把刚才拷贝到云虚机上的公钥插入到客户端表.ssh/authorized_keys中。随后删除tmp.pub

4、确认登入权限配置
很多时候按照上述步骤配置好了,重启云虚机或服务后,还是询问口令。请依次检查如下选项,确保自动登入。

  1. 检查配置文件
[username@cloud ~]$  sudo vi /etc/ssh/sshd_config 

注意以下选项:
RSAAuthentication yes
PubkeyAuthentication yes
GatewayPorts yes
AuthorizedKeysFile .ssh/authorized_keys

其中GatewayPorts 要打开,否则,云虚机上只能在127.0.0.1监听。

  1. 检查、严格几个关键位置的权限
[username@cloud ~]$  sudo chmod g-w /home/username
[username@cloud ~]$  sudo chmod 700 ~/.ssh
[username@cloud ~]$  sudo chmod 600 ~/.ssh/authorized_keys

ssh为了安全,会检查这几个文件夹、文件的权限。如果开的太足,是不会绕过口令登入的。

至此,重启云虚机服务后,应该就可以直接登入了。

参考:
ssh证书登录(实例详解)
解决SSH免密登录配置成功后不生效问题

配置重定向

这个阶段,我们通过ssh服务器与客户端之间的套接字,配置一条反向通道。在云虚机上,开放8990端口,用于等待客户连接。所有指向8990的访问,都会被转交给192.168.100.100:80。
此情况为什么能够从公网传输到局域网呢?那是因为最初的ssh连接是由局域网发起的。一旦连接成功,TCP套接字(SSL)的通信就是双向的了。

局域网服务器192.168.100.100:80
楼道路由192.168.100.1
区域路由10.X.X.X
公网路由:202.X.X.X
云虚机 XXX.XXX.XXX.XXX:8990

可以登入后,使用重定向功能,进行功能发布。

[username@cloud ~]$  exit
[user@happy ~]$ ssh [email protected] -R *:8990:192.168.100.100:80
[username@cloud ~]$ netstat -na | grep "tcp"
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:8990            0.0.0.0:*               LISTEN
...

这里的关键步骤是使用-R参数,进行类似代理的工作。-R参数有4部分:

远程监听地址(云虚机):远程监听端口(云虚机):局域网服务器地址:局域网服务器端口

一旦运行完毕,所有访问云虚机8990端口的TCP连接,会被ssh重定向到局域网中,从而实现代理。

测试

在客户端(可以是手机)浏览器访问
http://XXX.XXX.XXX.XXX:8990
打开网页,

3.回传
3.回传
3.回传
3.回传
2.转接
2.转接
2.转接
2.转接
1.发起
3.回传
局域网服务器192.168.100.100:80
楼道路由192.168.100.1
区域路由10.X.X.X
公网路由:202.X.X.X
云虚机 XXX.XXX.XXX.XXX:8990
手机

存在问题

  1. 一旦ssh连接断开,通道随即断开。
  2. 若ssh连接断开,可能因为不礼貌的断开而导致再次连接时,8990端口通信不畅。这个时候就要重启云虚机。

你可能感兴趣的:(开源,运维,网络,ssh,反向代理,动态ip)