笔记:ssh隧道与端口转发

270 阅读5分钟

远程端口转发

有什么问题需要解决

运维需要登录业务服务器进行工作。

客户的服务器是在自己的专有云上,访问控制比较严格,其中一项就是白名单,只有配置了白名单的才能访问。

运维的笔记本整天背来背去的,出口IP肯定就是变来变去,每次要检查自己的IP,然后联络客户的运管老师配置白名单,很麻烦,也耽误时间。毕竟运维可能是7x24要解决问题,而客户这边是朝九晚五。

网络拓扑

image.png

想干什么

目的:省掉每次找客户改白名单的事儿。

想法:公司在阿里云上租用了服务器,具有固定IP地址,
因此想在公司服务器上建立一个SSH远程端口转发,连接到客户的业务服务器上,这样客户的白名单就固定配置公司的服务器就好了。然后在公司服务器上做自己的白名单控制,这样就不用每次都需要等待客户运管老师了(自己就可以改了)

image.png

什么是 ssh 远程端口转发

首先要认清3个“视角”的角色。

  • 运维工程师在自己的笔记本上搞事情,称为运维视角的“工程师”;
  • 公司的服务器也是有人登录上去,在里面搞事情,称为公司视角上的“转发服务器”;
  • 客户的服务器才是最终目的,称为客户视角的“业务机”。

那么“远程端口转发”的描述就是:

转发服务器上进行配置,将远程业务机上的某个端口,映射到转发服务器上的某个端口,这样,当工程师 访问转发服务器的端口时,就被转发到业务机的端口了。(看起来好像工程师直接访问业务机的端口一样)

怎么做

  • 首先注意,配置命令是在 转发服务器 上执行的 (吐个槽:很多文档写一大堆命令行,但是不说是在哪个地方,包括机器和路径,来执行,这个也是自己写笔记的原因之一,这些细节令人挠头)

    image.png

  • 在本场景中,操作如下

    • 首先登录阿里云的公司服务器
    • 参考网上教程,先确定ssh的配置中 GatewayPorts / AllowTcpForwarding / PasswordAuthentication / PubkeyAuthentication / PermitRootLogin 这些参数正确设置了。 文件位置是 /etc/ssh/sshd_config
    • 使用以下命令
    ssh -R [公司服务器端口]:[业务服务器IP]:[业务服务器端口] [公司服务器用户]@[公司服务器IP] -N -f
    

    例如

    ssh -R 62001:222.1.2.3:10022 engineer@www.company.com -N -f
    

    这个命令的意思就是:

    • 在公司服务器 www.company.com 上建立一个远程端口转发 62001
    • 此端口映射为业务服务器 222.1.2.3:10022
    • 在后台(-f的效果)仅做端口转发,不需要执行命令(-N的效果)

这里的 “engineer” 是在公司服务器上做端口转发时使用的用户账号,通常会单独给端口转发建立一个账号,然后这个账号不在sudoer组里,降低风险。

它真的不重要,在执行命令的过程中,会询问 engineer用的密码,输入就可以了,不需要记住。 后面再建转发,再新增用户都可以。

怎么使用

SSH端口转发建立起来以后,在运维笔记本上执行ssh -p就可以了

ssh -p [公司服务器的端口] [业务服务器的用户名]@[公司服务器的地址]

例如:
ssh -p 62001 govmt@www.company.com

注意这里的“govmt”是业务服务器上的运维账号;而它后面跟的www.company.com 是转发服务器的地址,而不是业务服务器的地址,比较具有撕裂感🙄

本地端口转发

远程端口转发了解啦,理解本地端口转发就很轻松了。

还是上面的场景,用本地端口转发怎么处理呢? 答案是“不能单纯的使用本地端口映射来完成”。

什么是本地端口转发

工程师自己的笔记本上进行配置,将本地的某个端口,映射到转发服务器上的某个端口(本场景将转发服务器作为远程服务器),这样,当工程师 访问本地的此端口时,就被转发到转发服务器的端口了。

本地端口映射的目的是:SSH的这个本地端口通过已建立的安全SSH连接,在本地计算机和远程服务器之间建立一个加密的TCP数据流通道。

它是用来建立通道的, 试着执行命令

ssh -L 62005:222.213.125.18:13190 test@localhost -N -f

然后用ss命令查看结果:

 ss -nlta | grep 6200

看到结果:

image.png

注意端口62005对应的连接,它的监听地址是 127.0.0.1[..1] 。也就是说,它只监听本地连接。

那它有什么用呢?

就是把对远端的连接映射成本地端口的连接,比方说,mysql服务器在云上的某个地方,我通过这个命令把它“伪装”成本地的3306端口,然后我就可以假装有个本地mysql了。

这个在网上教程里是比较典型的场景: 例如远程服务器上有个mysql,运行在62006端口,那么在本机执行

ssh -NfL 3306:www.company.com:62006 ssht@localhost

就可以用 mysql -h127.0.0.1 -uroot -pxxx 来连接远程服务器了。

注意:这种用法很危险,一定要确定不要连接到生产服务器上。 最好别用。