今天用公司环境在测试网络隧道,在写一半文章的时候突然老板来找我了,我真的好苦啊!
和老板的对话记录
告警邮件
自己好苦命,希望明天不要被怼的太惨。
好了,让我们开始今天的内容。
你是否常常遇到这些个麻烦,因为公司安全策略的问题,每次要通过跳板机而不能直接连开发环境,使用上面已经搭建好的数据库服务。为了方便发布,自己电脑上的服务别人,不能让开发环境的机器直接连上测试。还有我们在星巴克喝着咖啡连着免费wifi的时候,会不会网络请求都被黑客抓包下来?
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling)。这是因为 SSH 为其他 TCP 连接提供了一个安全的通道,避免了用户名,密码以及隐私信息的明文传输。例如,Telnet,SMTP,LDAP 这些 TCP 应用。
如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。总的来说 SSH 端口转发能够提供两大功能:
隧道
当开发机的Mysql只能从跳板机连上,我怎么才能跳过跳板机来访问远程Mysql呢?
访问远程服务器的Mysql
如上图,我们要明确的是现在有三个角色,客户端(SSH Client)、跳板机(SSH Server)、和服务器。
客户端只能通过ssh连接到跳板机上,跳板机可以直接访问服务器的全部端口,服务器中安装了Mysql服务并监听了3306端口。
这个时候,我们肯定是要用本地转发来连接,命令规则如下
ssh -L [local host:]<local port>:<remote host>:<remote port> <SSH hostname>
看起来非常的令人费解,不清楚的问题不过就是三个,what? where? how?
ssh -L 9527:服务器:3306 root@跳板机
解释为,当访问本机的9527的端口时,被加密后转发到跳板机的ssh服务,服务器的3306端口
remote host
和SSH hostname
可以是同一台
我的开发机上部署了一个mysql服务,我想回家以后还是连上我处于内网开发机上的mysql服务,这个时候我们怎么弄呢?
远程转发图示
我们需要借助一台公网的服务器讲远程的流量转发过来,由于安全策略内网机器可以连通外网机器,但是外网不能访问内网机器。我们只要转发远程的请求到正确的内网的服务上就可以了。它的命令格式是:
ssh -R [ssh server host:]<SSH server port>:<local host>:<local port> <SSH hostname>
ssh -R 9527:内网机器:3306 root@公网机器
让公网服务器监听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到内网机器ssh客户端,再由内网机器ssh客户端解密后转发到内网机器3306端口。这听起来有点奇怪,因为这个时间内网服务器充当了两个角色,就是ssh客户端和server端。用下图的展示看起来更直观一点
有跳板机的远程转发
这个时候我们就可以在跳板机上使用命令
ssh -R 9527:内网机器:3306 root@公网机器
这个时候就是让公网服务器监听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到跳板机ssh客户端上,再由ssh客户端解密后转发到内网机器3306端口上。
/etc/ssh/sshd_config
里要把AllowTcpForwarding
选项设置为yes
,否则-R远程端口转发会失败。把/etc/sysctl.conf
里的net.ipv4.ip_forward = 0
设置为1/etc/ssh/sshd_config
里的GatewayPorts
选项设置为yes
。这个选项如果由于权限没法打开也有办法,可配合ssh -L将端口绑定到0.0.0.0,如下ssh -R 127.0.0.1:9527:内网机器:3306 root@公网机器 ssh -L 0.0.0.0:9527:127.0.0.1:9527 root@127.0.0.1
共同点:
区别:
我有一台中国香港服务器能上外网,凭什么我自己不能上外网!还真就可以。
前面我们已经讨论过了本地转发,远程转发,但是前提都是要求有一个固定的应用服务端的端口号。那如果没有端口号怎么办?等等,什么样的应用会没有这个端口号呢?嗯,比如说用浏览器,比如说 MSN 等等。
同时当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览及 MSN 信息无疑是十分必要的。
让我们先来看一下动态转发的命令格式:
ssh -D <local port> <SSH Server>
动态转发
实际使用如下
ssh -qTFnN -D 127.0.0.1:9527 root@中国香港服务器
switchyOmega
brew install proxychains-ng
vim /usr/local/etc/proxychains.conf # 在ProxyList配置段下添加配置 "socks5 127.0.0.1 9527"
proxychains-ng wget http://host2 # 在其它命令行前添加proxychains-ng即可
-f
要求 ssh在执行命令前退至后台.它用于当ssh准备询问口令或密语,但是用户希望它在后台进行.该选项隐含了-n选项.
-N
不执行远程命令.用于转发端口.
-C
要求进行数据压缩 (包括stdin, stdout, stderr以及转发X11和TCP/IP连接 的数据).压缩算法和gzip(1)的一样,协议第一版中,压缩级别 “level” 用CompressionLevel选项控制.压缩技术在modem线路或其他慢速连接上很有用,但是在高速网络上反而 可能降低速度.可以在配置文件中对每个主机单独设定这个参数.
-g
允许远端主机连接本地转发的端口
-q
安静模式.消除所有的警告和诊断信息
-T
禁止分配伪终端
-n
把 stdin重定向到/dev/null (实际上防止从stdin读取数据). ssh在后台运行时一定会用到这个选项.它的常用技巧是远程运行X11程序.
(本故事纯属虚构,如有雷同纯属巧合)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。