9 端口转发
SSH可以作为任意TCP流量的包装。你可以将telnet、POP3、IMAP或HTTP等未加密服务隐藏在SSH中,安全地传输这些本地不安全协议。SSH会话可以传输任何TCP/IP协议,包括本地IT安全团队禁止在组织网络上使用的协议。因此,许多对安全要求较高的组织不允许SSH穿越和/或离开其网络。要求不那么严格的组织则使用这种能力来确保网络安全。
例如我使用SSH端口转发技术在网络服务器和我的桌面之间建立HTTP隧道。这样可以在传输过程中保护我的凭据,消除密码在网络上被窃取的风险。这是对SSH端口转发的合理合法使用。
然而,假设我的台式机在高度安全的网络内。防火墙严格限制网页浏览并阻止所有文件传输。如果我能使用SSH连接到网络外的服务器,我就可以将我的台式机流量转发到外部服务器,从而获得不受限制的互联网访问。我可以通过SSH上传机密文件,而防火墙日志只会显示我进行了SSH连接。
9.1 端口转发与安全策略
绝对阻止SSH的唯一方法是拒绝所有TCP、UDP 或ICMP连接,使用能智能检查流量的网络代理,即使通过代理也不允许客户机访问公共DNS。我见过一家公司真正实施了这种类型的安全边界,但他们有很多漏洞和例外情况,特别是对于笨重的关键业务软件。如果你不能在你的环境中实施这种方法,但又有严格的安全要求,你必须与你的用户合作,以满足这些要求和业务需要。我强烈建议建立可靠的网络流量感知计划,以及入侵和挤出检测,这样你就能知道网络流量何时偏离了正常范围。请阅读 Richard Bejtlich关于入侵和挤出分析的书籍,以及《Network Flow Analysis》,并实施类似讨论的计划。
9.2 端口转发故障排除
某些应用程序在使用端口转发时会出现问题。必须将应用程序故障与端口转发故障区分开来。如果您已经转发了端口,但应用程序无法通过它运行,请使用netcat或telnet来确定端口是否真正开放。(比如netcat。)服务器对通过已转发端口发出的netcat请求的反馈应该与未转发端口相同。
如果没有得到响应,可能是端口转发配置错误。仔细检查命令行。必要时,在连接的一端或两端使用调试功能,以了解真实情况。请记住一次只能有一个进程打开指定的端口。
如果端口转发能正常工作,说明你的应用程序有问题。也许你需要一个主机条目,这在许多网络应用程序中很常见。也许是一种古老而笨拙的协议,需要打开各种各样的端口。FTP就是典型的例子。你需要深入研究应用程序及其协议,找出无法正常工作的原因。
端口转发是一种工具。并非所有协议都能使用这一工具。有时,使用端口转发就像用锤子敲螺丝,任何结果都会让你不高兴。
9.3 环境示例
9.4 端口转发类型
端口转发有本地、远程和动态三种类型。
本地端口转发将客户端的端口重定向到服务器的端口。从本质上讲,你就是在说”抓取SSH服务器上的某某端口,使其成为我的客户端的本地端口”。
远程端口转发的工作原理正好相反。SSH服务器上的端口被转发到SSH客户端上的端口。
动态端口转发是一种更广泛的系统,许多不同的客户端程序可以连接到许多不同的服务。它在SSH客户端创建一个SOCKS代理,并通过服务器将任何请求转发到该代理。SOCKS代理是一个通用网关,可以传输任何TCP/IP流量。(顺便说一句,SOCKS实际上并不代表任何东西。)这样,任何连接到代理的人都能完全访问服务器的网络。
9.5 特权端口和转发
在类Unix系统中,低于1024的TCP端口保留给系统使用。只有root才能绑定这些端口。作为非特权用户,你可以将SSH端口转发器的本地端连接到1024以上的任何端口。转发保留端口需要以根用户身份使用SSH。以root身份执行例行任务是很糟糕的做法,所以没有充分理由不要这样做。
只有连接到特权端口的一方需要以root身份运行。如果要在客户端绑定保留端口,应以root身份运行客户端,但要以普通用户身份登录服务器。如果在服务器上绑定的是保留端口,则需要以根用户身份登录服务器。在后一种情况下,最好更改端口,这样就不必直接以根用户身份登录。
微软系统不提供特权端口。任何人都可以绑定到系统上的任何开放端口。没有端口限制会产生各种潜在的安全问题,但转发低编号报告并不会比转发任何其他端口更困难。你永远不需要以root身份运行 PuTTY。
9.6 本地端口转发场景1:在192.168.111.32上开放2222端口:提供ssh到172.17.0.3功能
在本地端口转发示例中,我们将把192.168.111.32的2222端口转发到172.17.0.3的22端口,中介则是服务器192.168.111.212。
- 语法
$ ssh -L localIP:localport:remoteIP:remoteport hostname
如果不在SSH客户端指定IP地址,SSH会连接到127.0.0.1。在这种情况下,您可以跳过第一个参数,执行命令:
$ ssh -L localport:remoteIP:remoteport hostname
类似场景:
- 实例
在客户端192.168.111.32执行:
$ ssh -L 192.168.111.32:2222:172.17.0.3:22 andrew@192.168.111.212
192.168.111.32原来不能直接ssh到172.17.0.3,现在用如下方式却可以:
$ ssh -p 2222 andrew@192.168.111.32
实际上跟192.168.111.32同一网路的都这样访问。注意要在192.168.111.32的/etc/ssh/sshd_config设置”GatewayPorts yes”。
场景2:在192.168.111.32上开放2222端口:提供ssh到172.17.0.3功能
192.168.111.212默认的防火墙设置仅开放了22号端口,192.168.111.212上有VNC服务,现在想要在192.168.111.32通过VNC远程控制192.168.111.212
$ ssh -L 192.168.111.32:5901:192.168.111.212:5901 andrew@192.168.111.212
192.168.111.32上打开RealVNC VNC Viewer(VNC客户端),输入VNC服务器地址:192.168.111.32:10即可。
类似场景:
9.7 远程端口转发
本地端口转发通常用于加密服务,而远程端口转发则用于访问防火墙后面的服务。在本例中把192.168.111.212上的2222端口转发到172.17.0.3上的22端口。
场景1:在192.168.111.212开放2222端口:提供ssh到172.17.0.3功能
- 语法
$ ssh -R remoteIP:remoteport:localIPlocalIP:localport hostname
如果没有指定要连接到SSH服务器的IP地址,SSH会连接到127.0.0.1。在这种情况下,您可以跳过第一个参数,执行命令:
$ ssh -R remoteport:localIP:localport hostname
- 实例
在客户端172.17.0.3执行:
$ ssh -R 192.168.111.212:2222:localhost:22 andrew@172.17.0.1
192.168.111.32原来不能直接ssh到172.17.0.3,现在用如下方式却可以:
$ ssh -p 2222 andrew@192.168.111.212
实际上跟192.168.111.212同一网路的都这样访问。注意要在192.168.111.212的/etc/ssh/sshd_config设置”GatewayPorts yes”。
类似场景:
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
- https://iximiuz.com/en/posts/ssh-tunnels/
9.7 动态端口转发
动态端口转发可将SSH客户端转换为SOCKS(版本 5)代理。发送到代理的任何流量都会以隧道方式传送到SSH服务器,服务器会根据自己的访问许可转发这些流量。你必须有一个支持SOCKS的应用程序才能访问代理,但大多数网络浏览器都支持SOCKS。在本例中,我将把工作站上的 9999 端口配置为 SOCKS 代理,并将所有流量动态转发到公共互联网上的服务器。
使用SOCKS时,您的客户端可能需要将所有DNS请求转发到SOCKS服务器。
$ ssh -D 192.168.111.32:2222 andrew@192.168.111.212
如果192.168.111.32不能连接外网,但是192.168.111.212可以,在192.168.111.32进行如下配置即可上外网。
很多公司有海外主机,就用这种方式实现科学的上网。
钉钉或微信号: pythontesting 微信公众号:pythontesting