本文来自:https://iximiuz.com/en/posts/ssh-tunnels/
所有知识总结为一张图:https://moneyslow.com/images/ssh-tunnels.png
一、端口转发。
访问一个本地端口,实际上流量被转发到远程服务器的某个端口
ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr
技巧:ssh -f -N -L 可以使端口转发在后台运行。
二、访问一个本地端口,实际上流量被转发到中间的跳板机(公+私),再转发给远程服务器的某个端口
ssh -L命令允许将本地端口转发到任何机器上的远程端口,而不仅仅是 SSH 服务器本身。请注意remote_addrandsshd_addr可能具有或可能不具有相同的值。
ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]bastion
三、想把机房里client服务器A(只有内外地址)的一个服务,通过gateway服务器B(有公网ip)的一个端口来被访问到。
我们可以称服务器B(有公网ip)为网关。命令如下:
ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr
这里记住,要在Gateway端的sshd_config文件里添加一条:”GatewayPorts yes”
echo “GatewayPorts yes” >> /etc/ssh/sshd_config
想过sshd的配置参数,可以参考:https://linux.die.net/man/5/sshd_config#GatewayPorts
技巧:ssh -f -N -R ,可以使该命令在后台运行。
这个命令就是黑客常用的后门。
四、把第三步的本地服务再做一个延伸,即可以通过gateway访问到本地局域网的所有服务。
ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr
命令和第三步是一样的,但是本地的local_addr变为了client的相同局域网的另外一个server的地址。
总结:
1、命令中的local,是client自己,也可以client能访问的到的其他机器。
2、命令中的remote,是具有sshd server功能的服务器,或者sshd server 可以访问的到的机器,比如第二种跳板机的情况。
3、本地端口转发 ( ssh -L) 意味着client的ssh开启一个新端口用来提供被访问。
4、远程端口转发 ( ssh -R) 意味着远程的sshd开启一个新端口来提供被访问。
5、记忆技巧,”ssh -L local:remote” and “ssh -R remote:local” ,看到没有,总是从左侧开始一个新端口的监听。