ubuntu localhost可以访问 ip不能访问_通过两次ssh tunnel访问gateway后主机上的jupyter notebook服务...

9e4fbc8625909e86fb3a51a0bd99ba47.png

一、 问题描述

计算机系的内网访问限制非常严格:

  • 内网的各台机器之间只允许用ssh协议默认的22号端口通信,其它端口会被屏蔽
  • 外网无法直接访问内网机器, 除了"脚踏两只船"的gateway
  • 外网机器与gateway之间也只允许22号端口间的通信

网络拓扑如下图所示:

982b690e256fa6cb8768124e5403f2c2.png
图一:网络拓扑

现在,

  • 我在办公室里有一台机器,我们叫它office_pc,它的ip地址当然是内网ip,假设是10.37.1.2。jupyter notebook运行在9966号端口上。我在该机器上的用户名是raypc。
  • gateway具有公网ip,域名gw.cs.univ.hk,,我在上面的用户名是raygw。
  • 我的本地机器是laptop, 在该机器上的用户名是rayleizhu。

那么,我怎么才能从laptop访问放置在office_pc上的jupyter notebook服务?

二、解决方案

在laptop上依次执行

ssh gw.cs.univ.hk "ssh -N -L 9966:localhost:9966 10.37.1.2"
ssh -N -L 9966:localhost:9966 gw.cs.univ.hk

然后你就可以在浏览器中输入localhost:9966来访问jupyter notebook了。
以上步骤假设你已经将本机的公钥复制到目标远程机器的authorized_keys文件中,因而可以无密码登录ssh, 无论是在gateway上还是在laptop上, 即

  1. 你在gateway上的公钥包含在office_pc的~/.ssh/authorized_keys文件中。
  2. 你在laptop上的公钥包含在gateway的~/.ssh/authorized_keys文件中。

如果1不成立, 那么在执行上述两条命令前, 你应该先在gateway上执行

ssh-copy-id raypc@10.37.1.2

类似地,如果2不成立,则要在laptop上执行

ssh-copy-id raygw@gw.cs.univ.hk

三、解释

图示如下。实际上是分别在offiice_pc与gateway之间以及gateway与laptop之间建立了 ssh tunnel。

dd272613354b1f1f491a517a46efb6f9.png
图二:通过两次ssh tunnel连接jupyter notebook服务

关于ssh tunnel或称端口转发,可以参考[1]。简单来说,

ssh -L localport:remotehost:remoteport username@middlehost

这条命令建立起了localhost:localport <--> localhost:22 <--> middlehost:22 <--> remotehost:remoteport的双向数据链路,如下图所示

c01f765b4382c9d6a548aefa4cbb182a.png
图三:ssh tunnel图示

其中F1, F3, B1, B3段的数据是未加密的,F2, B2上段的数据被ssh加密。

四、思考

  • 为什么下面这条命令不能实现上面所述的需求?
ssh -L -N 9966:l0.37.1.2:9966 raygw@gw.cs.univ.hk

提示: 图三中的链路(F1-3, B1-3)的哪部分出了问题?

  • 如果将内网机器之间只能用22号端口通信的限制去掉,上面的命令能够工作吗?

五、其他

用ssh用户配置文件设置快捷ssh会话参考[2],将ssh tunnel变成守护进程参考[3]和[4]。

六、参考

  1. SSH原理与运用(二):远程操作与端口转发 - 阮一峰的网络日志
  2. 利用 SSH 的用户配置文件 Config 管理 SSH 会话
  3. Create SSH tunnels using systemd units – github
  4. systemd: Grant an unprivileged user permission to alter one specific service Ask – severfault
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值