ssh 本地和远端端口转发

ssh 本地和远端端口转发

目录

一、相关概念

端口转发,也称隧道通信,一般指通过安全终端(secure shell),将明文TCP通信,转变成安全TCP通信的方式. 你可以通过端口转发,将POP3协议, SMTP协议, 以及HTTP协议等转变成加密的安全通信方式.

端口转发,可以分为两类:“本地端口转发”“远端端口转发”.也常常被称为“出口隧道”“入口隧道”.

本地端口转发,是将本地端口转发到指定的远端端口. 例如, 将所有发送到本地机器1234端口的请求,都转发至远端机器的23端口.

注意: “localhost”的解析,是在ssh连接建立之后,所以,在本地端口转发规则中,”localhost”应该被理解为通过ssh登录到的远端机器.

远端端口转发和本地端口转发所起的效果正好相反:它将远端端口的请求,转发至本地机器的指定端口. 例如将服务器上1234端口的请求,全部转发至本地机器的23端口.

二、本地端口转发

通过家庭电脑,访问办公室的服务器,可以通过ssh连接办公室的服务器,设置本地端口转发实现. 假定公司服务器地址:172.16.10.10, ssh端口为默认值22, 家庭电脑地址:192.168.10.10,执行以下命令:

home$ ssh user@work.example.org -L 10000:172.16.10.10:22

然后,我们会发现,家庭电脑已经开始监听10000端口,通过命令查看监听端口:

home$ netstat -tunelp | grep 10000

tcp 0 0 127.0.0.1:10000 0.0.0.0:* LISTEN 1000 71679 12468/ssh

此时,通过你的家庭电脑,已经可以访问到公司的服务器了.使用命令:

home$ ssh root@localhost -p 10000

如果你想要其它,和你家庭电脑处于同一个子网的电脑,能够通过你的家庭电脑,访问你公司的服务器,你需要加上-g属性.

home$ ssh user@work.example.org -L 10000:172.16.10.10:22 -g
home$ netstat -tunelp | grep 10000

tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 1000 72265 12543/ssh

现在所有家庭电脑子网内的电脑,都可以通过访问你的家庭电脑的10000端口,访问你的远端公司服务器.

三、远端端口转发

如果想要在公司,访问家里的电脑,这个时候,就可以使用远端端口转发了. 在家庭电脑上使用如下命令:

home$ ssh user@work.example.org -R 10000:192.168.1.10:22

现在,在我们公司的电脑上,可以看到我们可以访问到家庭电脑了.

work.example.org$ netstat -tunelp | grep 10000

tcp 0 0 127.0.0.1:10000 0.0.0.0:* LISTEN 0 73719534 3809/1

现在能登录到你公司电脑的同事, 就可以直接通过ssh访问你的家庭电脑了.通过以下命令:

work.example.org$ ssh user@localhost -p 10000

如果要想通过办公室同一子网内的其它电脑,访问你的家庭电脑, -g 选项是不行的.因为远端端口转发是没有-g选项的.你需要修改公司机器(work.example.org)上的sshd_config 文件.

GatewayPorts yes

注 sshd_config 文件路径
* ubuntu中在 /etc/ssh/ssh_config
* centos中在/etc/ssh/sshd_config, centos 需要安装 openssh-server openssh-clients,否则找不到该文件.yun -y install openssh-server openssh-clients

和刚刚一样, 运行命令:

home$ ssh user@work.example.org -R 10000:192.168.1.10:22

现在, 该端口即可转发该子网内的其它机器发来的请求了.通过一下命令查看:

work.example.org$ netstat -tunelp | grep 10000

tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 0 73721060 4426/1

备注:
* 如果要使用1024以下的端口,需要使用root权限.
* 不要忘记关闭该端口上的防火墙,无论是本地还是远端的端口
* 目前ssh端口转发只能用于TCP协议,如果想要转发UDP协议,请使用ssh+netcat.

查看原文: Howto use SSH local and remote port forwarding


四、实践场景

  1. 本地机器(local),转发3333端口请求,通过跳转机(120.26.90.219),访问公司数据库所在机器(company.mysql.aliyuncs.com)的3306端口
local$ ssh -fNL 3333:company.mysql.aliyuncs.com:3306 user@120.26.90.219 > ./log/db-forward.log 2>&1 &
# forward port to connect remote database. 
# -f do not login.
# -N do not execute script or command
# -L local port forward
  1. 本地机器(local)监听8096端口,通过公司公网服务器(120.57.31.78)的8097端口,接收第三方渠道的回调请求(发到120.57.31.78的8096端口)
local$ ssh -fNR 8097:127.0.0.1:8096 user@120.57.31.78
# forward port to receive remote callback request. 
# -f do not login.
# -N do not execute script or command
# -R reverse tunnel

PS.若要转发第三方渠道的回调请求,需要在公司公网服务器(120.57.31.78)上,修改sshd_config 配置.否则只能转发从该服务器上发出的请求.

展开阅读全文

没有更多推荐了,返回首页