SSH端口转发 (Port Forwarding) 的个人理解
2020/8/18 15:06:55
工作原因,会用到SSH登陆以及端口转发 (Port Forwarding) 的配置,对这个原理上如果不清楚的话,出现问题就不知道如何下手排查故障。咱也不是科班出身,对于这个问题,也只能从网上搜索答案,然后尝试自己理解。目前来看这个理解在逻辑上是通的,先记下来。
我用的SSH客户端是KiTTY,在这个软件上,端口转发叫做隧道 (Tunnels)。这个叫法很形象,配置两边的端口(一边是Local Port或者叫Source Port;另外一边是Remote IP:Remote Port,或者叫Destination)就像隧道的两头,连接起了本端 (Local) 和远端 (Remote) 两头。
SSH Port forwarding example:
Remark | Local port | Remote IP | Remote port |
---|---|---|---|
Local machine (RDP) | 1110 | 222.222.222.222 | 3389 |
Local machine (SSH, SFTP) | 1111 | 222.222.222.222 | 22 |
web Application Launcher | 10000 | -- | Dynamic |
最常见的是远程桌面连接 (Remote Desktop Protocol, RDP) 以及SFTP的Port Forwarding。两端防火墙设置允许,权限开通,网络联通,登陆已经配置好Port Forwarding的主SSH会话 (Session),对本地端口的操作就全部转发至远端,且接受远端的数据,通讯建立。
其实真正促使我写这篇笔记的是刚开始让我挠头不已,一头雾水的SOCKS转发,在KiTTY中叫做动态转发 (Dynamic)。在网上查了一下(https://blog.csdn.net/English0523/article/details/79461430)才大概理解了,这个动态转发,在本端的浏览器上配置好SOCKS代理 (Proxy) 规则,比如用FireFox自带的代理 (Proxy) 设置,或者Chrome结合代理插件SwitchyOmega,浏览器主动请求应用SOCKS Host(也就是中间代理),结合上表中的例子来说,浏览器访问一个地址时(可以是类似Bing.com这样的URL,也可以是222.222.222.222这样的IP地址),浏览器通过本地的10000端口发送数据,这些数据就像隧道里的水流一样,从本地10000端口流入,从哪里流出呢(这是我之前最迷惑的地方)?流出的地方取决于浏览器的目标地址,如果填入的是URL,则通过系统hosts文件解析或DNS解析目标地址(这就是叫做动态的原因吧)(另外对于DNS解析请求,还有这么一个知识点:尽管访问网页的流量被加密转发了,并且对于目标服务器来说访问源IP改变了,但是DNS查询的时候记录的仍然是你本身所在的网络,并没有做到完全的保密。这种情况也是有解决方案的。打开Firefox浏览器,地址栏中输入about:config进入浏览器的内部设置,在使用该配置的时候要非常的谨慎,配置不当可能会使浏览器无法正常使用。在弹出的告警对话框中点击”我了解此风险!”进入下一个页面。在顶部的搜索栏中输入”network.proxy.socks_remote_dns”,然后双击该配置项,配置就发生了变化,状态由默认变成了已修改,值由false(默认值)变成了true。配置生效后,Firefox就会使用代理转发DNS请求而不是在本地解析。);如果填入的是IP地址,也同样通过SOCKS Host(也就是中间代理)和远端进行通讯。通俗(可能不太准确)的理解就是这种由SOCKS中间代理替代本端和远端直接通讯可以实现身份鉴权和安全管理的需求,就好比说,一个无名小辈想拜会大佬,直接去拜会的话,大佬是不认识你也不屑理你的,得找说得上话的有身份的中间人,大佬认识中间人,原意和中间人说话,然后中间人再通过转述把你的话转告大佬,同时把大佬的话转告给你。