ubuntu localhost可以访问 ip不能访问_通过两次ssh tunnel访问gateway后主机上的jupyter notebook服务...
一、 问题描述
计算机系的内网访问限制非常严格:
- 内网的各台机器之间只允许用ssh协议默认的22号端口通信,其它端口会被屏蔽
- 外网无法直接访问内网机器, 除了"脚踏两只船"的gateway
- 外网机器与gateway之间也只允许22号端口间的通信
网络拓扑如下图所示:
现在,
- 我在办公室里有一台机器,我们叫它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上, 即
- 你在gateway上的公钥包含在office_pc的
~/.ssh/authorized_keys
文件中。 - 你在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。
关于ssh tunnel或称端口转发,可以参考[1]。简单来说,
ssh -L localport:remotehost:remoteport username@middlehost
这条命令建立起了localhost:localport <--> localhost:22 <--> middlehost:22 <--> remotehost:remoteport
的双向数据链路,如下图所示
其中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]。
六、参考
- SSH原理与运用(二):远程操作与端口转发 - 阮一峰的网络日志
- 利用 SSH 的用户配置文件 Config 管理 SSH 会话
- Create SSH tunnels using systemd units – github
- systemd: Grant an unprivileged user permission to alter one specific service Ask – severfault