用一台能够公网访问的host作为跳板机,转发不同端口到内网目标机的ssh端口,进而实现ssh远程登录。
配置中将会用到的SSH参数:
反向代理 ssh -fCNR
正向代理 ssh -fCNL
-g:允许远程主机连接主机(host)的转发端口;
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地主机指定的端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口
准备工作
开启ssh的转发功能,以ubuntu server12.04为例,服务器默认是安装了openssh-server的,在/etc/ssh/sshd_config末尾追加一下命令:
GatewayPorts yes
重启ssh
service ssh restart
正向代理
正向代理的典型例子是主机(A)通过一台可以访问的主机(B)访问主机(C)提供的服务。 主机A不能直接访问主机C提供的服务,但是主机A可以访问主机B,主机B可以访问到主机C的服务,那我们可以在主机A上使用以下命令
ssh -CNfL a_port:c_ip:c_port b_user@b_ip
其中CNf都不是必须参数,C是对数据进行压缩,N代表不执行远程命令(尽量带上),f代表后台执行。
主机A可以通过访问自己的a_port端口来访问主机C的c_port端口,例如主机A要通过自己的6666端口访问主机C的80端口,则需要执行一下命令
ssh -CNfL 6666:c_ip:80 b_user@b_ip
我们可以将问题简化一些,假设主机B的某个端口不对外提供服务,只能够主机B自己访问,那么上述命令中的主机C和主机B将是一样的,命令将变为
ssh -CNfL a_port:b_ip:b_port b_user@b_ip ssh -CNfL a_port:localhost:b_port b_user@b_ip
以上两条命令是等价的,因为在第一个端口(a_port)后面的地址(b_ip)与端口(b_port)是相对于命令最末端的主机(b_ip)来说的,如果主机A是要用主机B来代理主机B的某项服务,那么第一个端口后写的主机地址为主机B的ip或者是localhost(127.0.0.1)是没有区别的。
可以看到正向代理是给自己代理提供服务的。
反向代理
反向代理与正向代理的原理产不多,都是用过ssh进行数据的传输,只是使用场景不同.反向代理的作用可以认为是把内网中的主机(A)暴露出来,以便于所有的主机都可以访问到主机A的服务。
假定我们使用一台公网可以访问的主机(B)来给主机A做反向代理,那么命令如下
ssh -CNfR b_port:127.0.0.1:a_port b_user@b_ip
CNf与正向代理相同,也不是必须的,在主机A上使用以上命令,即可以把主机B的b_port端口映射到主机A的a_port端口。
举个简单的例子,主机A处于内网中,公网不能访问,在主机A上有一个http服务器,现在想让异地的朋友能够看到这个服务器上的内容,那我们就可以使用一下命令:
ssh -CNfR b_port:127.0.0.1:80 b_user@b_ip
b_port自己定义,不要冲突就行,之后我们通过b_ip:b_port就可以访问到主机A的http服务了。
总结一下就是反向代理是给其他用户代理提供服务的。
喜欢这篇文章?欢迎打赏~~