SSH(secure shell)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境(这点很重要);SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。人们通常利用SSH来传输命令行界面和远程执行命令;SSH也支持隧道协议、端口映射和X11连接。借助SFTP或SCP协议还可以传输文件等;闲话不说了,如需要详细了解ssh请自行搜索;
我们通常接触最多的ssh(协议)的地方就是通过xshell xmanager或linux shell中通过ssh工具登录类unix系统;其他的认知可能并不太多,但没有关系,本人也是如此,但今天我们的dba提出一个需求,需要我来协助处理;
题外话:
之前面试的时候,被问到两个IDC的主机怎么通讯?接下的技能就能解决,只是当时没有细想说用,其实根本不需要,因为它还要部署,不是很安全;接下来就见识下!
嘉善网站建设公司创新互联,嘉善网站设计制作,有大型网站制作公司丰富经验。已为嘉善1000+提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的嘉善做网站的公司定做!
有一台服务器是公司oracle数据库(IDC A)为了安全只对内网开放(即数据库的私网ip侦听);dba平时通过windows上xshell的forward功能,从它自己的本地127.0.0.1:port连接管理数据库(xhell做了连接转发),有一台开发机器是linux(IDC B),也需要在程序中调用数据库,需要做的就是在测试linux上也能这样通过本地测试机调用数据库;也就是需要ssh隧道转发功能;即测试机通过ssh 私钥登录到数据库;通过ssh端口转发功能,把数据库上侦听在内网的端口转发到这台linux测试机上的内网端口;以便于linux测试程序能调用;这么说OK?
方案:
首先需要在数据库上为测试Linux提供私钥无密码认证登录(开一个账号用私钥登录);然后在测试Linux机器上进行ssh登录做端口转发;通过ssh登录长连接把远程端口转发到本地,通过本地的端口连接远程的数据端口
IDC A 数据库服务器新增一个登录账号(无密码私钥登录)
IDC B 测试Linux通过以下登录 IDC A 数据库机器
# ssh -i test -C -f -N -g -L 1521:lanip:1521 test@x.x.x.x -p port(sshd)
#说明: -i 私钥
-C 压缩传输
-f 前台运行
-N 不执行远程程序
-g 允许远程端口转发到本地
-L port:host:remote port 即将远程的port转发映射在本地
远程某公网的上开放的redis 通过ssh 隧道转发到本地,通过本地访问redis
[san@TX_zgws_test02 ~]$ sudo netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6320 0.0.0.0:* LISTEN 25103/redis-server
....省略....
本机通过ssh登录并转发
涂掉的部分即这台主机的公网ip和连接端口;命令执行需要个几秒时间不要ctrl+c
查看本地的端口
san@san-dong:~$ netstat -ntpul
(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)
激活Internet连接 (仅服务器)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6320 0.0.0.0:* LISTEN 16968/ssh
访问本地主机上的6320
通过ssh隧道转发即可把访问本地的6320转发到远程的6320,远程的6320是不对外开放的;这样就绕过了防火墙,怎么样,是不是很强大?两台服务器之前直接通过ssh协议隧道访问,不需要***自带ssh加密保护;get到没有?
由于我办公电脑是ubuntu的在公司内网,回家想访问我的的这台主机(ssh或vnc)这里就拿ssh模拟好了;如果网管不把我办公电脑的22端口做映射,我在外面是不能访问;此时就可以通过以下方式实现;前提是你得有一个外网的主机;具体做法就是通过办公电脑ssh登录到第三方的的ssh主机上并把办公电脑上的ssh 22端口的访问通过ssh隧道转发到远程主机上的其他本地端口;这样你在第三方(如果你家里有dDNS能访问)主机上访问本地的端口即可访问公司办公电脑的服务;
架构如下:
格式如下:
ssh -i san -N -f -R 2222:127.0.0.1:22 san@外网主机(域名或公网ip) -p port(sshd)
参数说明:
-R: port:host:hostport 即把本地的22端口在远程主机上映成2222
实战:
下班前在公司电脑上执行如下:
即通过 ssh登录到公网电脑C上 并把本地的22端口映射成公网电脑的10022
回家后通过连接公网电脑C的10022 即可登录公司办公电脑;
[san@TX_zgws_test02 ~]$ ssh san@127.0.0.1 -p 10022
如图:
如此这般你便可以通过公网的电脑C来访问公司的办公电脑了(如果家里是ddns可访问的)就省了公网电脑C;前提是电脑支持ssh协议 ,windows下没有试过可自行研究;
如果你觉得很赞,get到,不要走,点个赞呗?
补充:
所谓的就是在计算机中一个程序;目的就是偷偷的运行并开放socket连接或服务端口等着别人来连接,对方想干啥就干啥只要他高兴;这种方式在所有计算机都有公网ip(或在一个网段)时好用;不流行了,现在大部分上网都是通过一个公网ip 代理上网(DNAT)方式,不明白不要紧;你在公司上网(手机4G也是)就是这个模式,表现出来的就是公司所有人的出口公网ip都一样;有了这咱NAT和防火墙,即使你电脑中了这种等对方来连接的,他也进不来;因此聪明的们就想到了另一招,我进不来,但我可以出去啊;对了大多的企业防火墙只防外面进入企业,企业内出去一般很少限制,限制多了就是这也上不了,那也上不了,所以一般企业只禁用一些明显有问题的协议或端口;大部分出去的端口是不做限制的;
这样你电脑种了一个后,会主动联系外面的机器并做隧道映射转发,就像是上面的场景;于是绕过了你电脑和公司的防火墙;对方就能以这种方式又可以操纵你的电脑了;这就是所谓的反弹式,原理是不是很像?以后看到自己电脑上有未知的类似以下的连接就要小心了
sudo netstat -n |grep EST
tcp 0 0 172.16.0.188:54032 x.x.x.x:22 ESTABLISHED
上面的是我刚做的测试不怕!