本文继续推进上文《三条命令助你完成ssh内网穿透》内容,之前当我们完成内网穿透后,可以通过ssh客户端的ProxyCommand
来完成Ansible-playbook的运行。现在我们需要有进一步的需求,比如访问部署在客户内网的一些服务时,就需要用到ssh的端口转发功能了。
简单来说,ssh的端口转发分为三种模式:
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
ssh -R [<bindHost>:]<sourcePort>:<forwardToHost>:<onPort> <connectToHost>
ssh -D <local port> <SSH Server>
先简单描述下我的网络结构,如下:
代号 | 角色 | 机器位置 | 地址 | 账户 | ssh 端口 | sshd |
---|---|---|---|---|---|---|
A | 中转机器 | 公网 | 121.41.218.68 | root | 服务22穿透后8822 | 启用 |
B | 客户机器 | 客户内网 | 10.155.0.0/24 | root | 22 | 启用 |
C | 我的机器 | 公司/家中 | 127.0.0.1 | root | 22 | 不需要 |
那么,在我的场景下,主要用到的就是本地模式
了,直接运行这个命令即可实现端口转发:
ssh -R 127.0.0.1:9999:10.155.0.1:80 -CNT \
-o ServerAliveInterval=5 \
-o ServerAliveCountMax=10 \
root@121.41.218.68 -p 8822
提示:还记得8822端口吗?它是上篇文章中介绍的
SSH内网穿透端口
这里加上了ServerAliveInterval和ServerAliveCountMax两个参数分别控制连接的心跳和断开。
这样我就可以在本地浏览器上访问http://127.0.0.1:9999
代理到客户内网10.155.0.1:80
服务上去。
当然,如果客户内网中有多个服务需要在本地代理,这样为每个服务都执行一条本地转发的命令会非常麻烦。其实我们只需要把SSH换成动态模式
就可以解决这个问题。命令也简单,如下:
ssh -D 127.0.0.1:9999 -CNT \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=10 \
root@121.41.218.68 -p 8822
因为动态模式是SOCKS转发,我们还需要在浏览器上安装一个socks代理插件,这里我以SwitchyOmega
举例,我们在代理服务器上设置SOCKS5,地址填入127.0.0.1,端口填入9999即可实现访问客户内网B上的服务
之后在浏览器选择代理模式后,就可以直接访问客户内网上的服务了。
最后,如果你懒得记ssh端口转发命令的话,你可以尝试下SSH Tunnel
这个应用
上面说的三个SSH端口转发模式它都支持,配置也非常的方便。
本文介绍了在实现SSH内网穿透之后,如果利用SSH端口转发实现本地端口访问远端内网服务。另外,有的同学就问了,我用ssh来做访问国外网站是否可行?理论上可行,不过做之前先阅读完下列文字
《中华人民共和国计算机信息网络国际联网管理暂行规定》规定“计算机信息网络直接进行国际联网,必须使用邮电部国家公用电信网提供的国际出入口信道。任何单位和个人不得自行建立或者使用其他信道进行国际联网。”如违反上述规定,公安机关会责令停止联网,给予警告,可以并处15000元以下的罚款,有违法所得的,没收违法所得。