SSH 隧道的主要功能之一是端口转发,它是一种通过 SSH 协议在本地和远程主机之间建立安全通道,实现端口之间的数据转发的方法。它允许用户在不直接访问目标主机的情况下,通过安全的 SSH 连接来访问该主机上的服务。
用途或应用场景
SSH端口转发具有广泛的用途,包括但不限于:
-
安全远程访问
-
绕过网络限制
-
代理服务器
-
加密通信
-
访问内部网络
-
远程管理和调试
端口转发类型
本地端口转发
本地端口转发:数据从本地机器流向远程机器,然后从远程机器流回本地机器。
常见的使用场景如下:
1. 访问远程数据库
如果数据库服务器(如 MySQL)只允许来自特定主机的连接,而你希望从本地机器访问它,可以通过 SSH 进行本地端口转发
2. 访问内部网络服务
在内部网络服务(如内部网站或应用)可能只能在 VPN 或特定网络上访问。通过 SSH 本地端口转发,你可以安全地访问这些服务
在这种情况下,你可以在本地浏览器中通过 http://localhost:8080 访问远程的内部服务。
3. 保护敏感数据传输
如果需要传输敏感数据到远程服务器,并且希望避免在不安全的网络中直接传输,可以使用本地端口转发,将不安全的服务流量通过 SSH 加密。例如,将不安全的 HTTP 流量转发:ssh -L 8888:example.com:80 user@remote_host
然后通过访问 http://localhost:8888,所有流量都将通过 SSH 加密。
4. 绕过防火墙和网络限制
在某些环境中,可能会有防火墙或网络限制,阻止对特定服务的访问。通过 SSH 本地端口转发,可以绕过这些限制:
ssh -L 9999:restricted_service:port user@remote_host
访问 localhost:9999 可以转发到受限服务。
5. 开发和调试
开发人员在远程服务器上运行应用程序时,可能希望在本地环境中进行调试和测试。通过本地端口转发,可以将远程应用程序的端口转发到本地进行测试。
示例一个案例:

需求:
B服务器 (开启了防火墙,只放通22端口 ),目前A需要访问B上的80服务
通过使用SSH建立隧道,可以转发A设定的本地端口8000,通过SSH隧道将本地8000的请求转发到服务器B的80。
实现访问效果。
# 模拟B已开启了防火墙
# IP:192.168.123.105
[root@ B ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
# A当前无法访问
[root@ A ~]# curl 192.168.123.105
curl: (7) Failed connect to 192.168.123.105:80; 没有到主机的路由
# 创建本地端口转发
# A上进行操作
[root@ A ~]# ssh -NfL 8000:localhost:80 root@192.168.123.105
-f:明确 SSH 在后台运行。
-N:表示不执行远程命令,这在仅用于端口转发时非常有用。
-L 8000:localhost:80:定义本地端口转发规则,将本地的 8000 端口转发到远程主机的 80 端口。
# 查看端口情况
[root@ A ~]# netstat -ntualp| grep 8000
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 30108/ssh
tcp6 0 0 ::1:8000 :::* LISTEN 30108/ssh
[root@ A ~]# ps -ef | grep ssh
root 30122 1 0 23:05 ? 00:00:00 ssh -NfL 8000:localhost:80 root@192.168.123.105
root 30124 30057 0 23:05 pts/2 00:00:00 grep --color=auto ssh
[root@ A ~]# curl 127.0.0.1:8000
This is ssh_port test!
远程端口转发
远程端口转发:数据从远程机器流向本地机器,然后从本地机器流回远程机器。
注意:远程端口转发通常需要在远程主机上进行配置。
使用场景如下:
1. 访问本地服务
如果你在本地计算机上运行某个服务(如 Web 服务器、数据库等),而想让远程计算机能够访问这个服务,可以使用远程端口转发。例如,将本地的 Web 服务器(运行在 8080 端口)转发到远程服务器的 80 端口:
ssh -R 80:localhost:8080 user@remote_host
这样,访问远程服务器的 80 端口时,会转发到本地的 8080 端口。
2. 绕过防火墙和网络限制
在某些网络环境中,直接访问某些服务可能会受到防火墙或其他网络策略的限制。通过远程端口转发,允许远程主机访问本地计算机上的服务,从而绕过这些限制。例如,可以将本地的 VPN 服务转发到远程服务器,这样远程用户可以通过连接到远程服务器来间接访问本地网络。
3. 远程调试
开发人员在远程服务器上工作时,可能需要访问本地计算机上的调试服务。通过远程端口转发,开发人员可以将本地的调试工具或应用程序提供给远程用户:
ssh -R 3000:localhost:4000 user@remote_host
这样,远程用户可以通过 localhost:3000 访问本地计算机上的服务。
4. 共享本地应用程序
如果你希望与团队成员共享本地运行的应用程序(如 Web 应用),可以通过远程端口转发将其暴露在远程服务器上。例如,在本地运行的 API 服务可以通过远程服务器的某个端口被其他人访问:
ssh -R 5000:localhost:3000 user@remote_host
5. 访问内部服务
在一些企业环境中,某些服务可能只能在内部网络上访问。通过远程端口转发,用户可以从外部安全地访问这些内部服务。例如,访问内部的数据库或应用程序:
ssh -R 5432:internal_db_server:5432 user@remote_host
6. 反向代理
`远程端口转发可以用作反向代理,允许外部用户通过远程服务器访问本地计算机上的服务。这在需要将访问限制在特定的远程服务器上时非常有用。``
7. 临时服务暴露
在开发和测试阶段,可能需要临时暴露本地服务供其他人访问。通过远程端口转发,可以快速实现这一点,而不需要配置 DNS 或额外的网络设置。
示例一个案例:

需求:
内网设备C的服务并没有暴露在公网,A客户端需要远程临时访问内网Mysql服务。
可以通过SSH远程端口转发内网3306到公网9999端口,A通过访问公网B的9999端口达到访问目的。
# 设置 GatewayPorts 选项决定了远程转发的端口是否可以被所有远程用户访问。
# SSH 服务器的配置文件(/etc/ssh/sshd_config)中,添加或修改以下行:
GatewayPorts yes
# 重启sshd服务
systemctl restart sshd
远程端口转发开启
# 内网C 设备上执行
ssh -f -N -R 9999:localhost:3306 root@47.109.x.x
说明:
# 9999 公网服务器B需要开放的端口
# 3306 内网C mysql服务端口
# root@47.109.x.x 公网服务器B的公网IP
可以从服务器B上查看端口监听
[root@ B ~]# netstat -ntualp| grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 14742/sshd: root
通过A测试,能够访问到内网Mysql
[root@ A ~]# mysql -uroot -p -h 47.109.X.X -P9999
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.4.2 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>



913

被折叠的 条评论
为什么被折叠?



