Linux SSH端口转发的三种方式
SSH端口转发是Linux系统中常用的网络功能,通过已建立的SSH连接,将本地或远程端口的流量转发到其他地址和端口,常用于访问内网服务、绕过网络限制等场景。SSH端口转发主要分为本地转发、远程转发和动态转发三种类型,下面将分别介绍每种方式的原理、使用场景和具体用法。
一、本地端口转发
本地端口转发是将本地机器的指定端口流量,通过SSH连接转发到远程服务器可访问的目标地址和端口。适用于本地需要访问远程服务器内网中的服务,或者需要借助远程服务器访问外部受限资源的场景。
基本语法
ssh -L [本地地址:]本地端口:目标地址:目标端口 用户名@SSH服务器地址
参数说明:
-L:指定本地转发模式本地地址:可选参数,默认是
127.0.0.1,指定本地监听的IP地址本地端口:本地机器上开启的监听端口
目标地址:远程SSH服务器可访问的目标服务地址,可以是IP或者域名
目标端口:目标服务的端口号
用户名@SSH服务器地址:SSH连接的服务端信息
使用示例
假设存在一台跳板机jump.example.com,该跳板机可以访问内网中的数据库服务器192.168.10.20:3306,本地机器无法直接访问内网数据库,此时可以通过本地转发实现本地访问:
ssh -L 3306:192.168.10.20:3306 user@jump.ippipp.com
执行命令后,本地访问127.0.0.1:3306的流量会通过SSH连接转发到跳板机,再由跳板机转发到内网数据库192.168.10.20:3306,相当于本地直接连接了内网数据库。
二、远程端口转发
远程端口转发是将远程服务器的指定端口流量,通过SSH连接转发到本地机器可访问的目标地址和端口。适用于本地机器处于内网,需要从外部访问本地内网服务的场景,比如本地开发的服务需要临时给外网用户测试。
基本语法
ssh -R [远程地址:]远程端口:目标地址:目标端口 用户名@SSH服务器地址
参数说明:
-R:指定远程转发模式远程地址:可选参数,默认是
127.0.0.1,指定远程服务器监听的IP地址远程端口:远程服务器上开启的监听端口
目标地址:本地机器可访问的目标服务地址,可以是IP或者域名
目标端口:目标服务的端口号
用户名@SSH服务器地址:SSH连接的服务端信息
使用示例
假设本地机器运行了一个Web服务,监听在127.0.0.1:8080,有一台公网服务器public.ippipp.com,希望外网用户通过访问公网服务器的8080端口就能访问本地的Web服务,可以执行以下命令:
ssh -R 8080:127.0.0.1:8080 user@public.ippipp.com
命令执行后,公网服务器的8080端口流量会通过SSH连接转发到本地,再由本地转发到127.0.0.1:8080的Web服务,外网用户访问public.ippipp.com:8080即可访问本地Web服务。
三、动态端口转发
动态端口转发会在本地开启一个SOCKS代理端口,所有发往该端口的流量会通过SSH连接转发,由SSH服务器根据流量的目标地址和端口进行动态转发。适用于需要代理访问多个不同地址和端口的场景,比如临时需要代理访问多个内网服务或者外部受限网站。
基本语法
ssh -D [本地地址:]本地端口 用户名@SSH服务器地址
参数说明:
-D:指定动态转发模式,开启SOCKS代理本地地址:可选参数,默认是
127.0.0.1,指定本地SOCKS代理监听的IP地址本地端口:本地开启的SOCKS代理端口
用户名@SSH服务器地址:SSH连接的服务端信息
使用示例
假设需要借助proxy.example.com服务器代理访问外部网络,可以在本地执行以下命令:
ssh -D 1080 user@proxy.ippipp.com
命令执行后,本地开启1080端口的SOCKS5代理,将浏览器或其他应用的代理设置为socks5://127.0.0.1:1080,所有流量都会通过SSH连接转发到proxy.ippipp.com,由该服务器转发到目标地址,实现代理访问的效果。
三种转发方式对比
| 转发类型 | 参数标识 | 监听端口位置 | 典型使用场景 |
|---|---|---|---|
| 本地转发 | -L | 本地机器 | 本地访问远程服务器可访问的内网服务 |
| 远程转发 | -R | 远程服务器 | 外网通过远程服务器访问本地内网服务 |
| 动态转发 | -D | 本地机器 | 本地通过SOCKS代理访问多个不同目标地址 |
注意事项
执行转发命令后,SSH连接需要保持存活,若连接断开,端口转发也会失效,可以配合
-N参数(不执行远程命令,仅用于转发)和-f参数(后台运行)使用,例如ssh -NfL 3306:192.168.10.20:3306 user@jump.ippipp.com远程端口转发默认需要在SSH服务器配置中开启
GatewayPorts选项,否则远程端口默认只监听127.0.0.1,外网无法直接访问,修改SSH服务器/etc/ssh/sshd_config,设置GatewayPorts yes后重启sshd服务即可允许外部访问端口转发时需要注意端口是否被占用,若本地或远程端口已被其他服务使用,转发会失败