SSH 隧道进行内网穿透

  1. ”动态“端口转发(SOCKS代理):
    ssh -D 1080 JumpHost  # D is for Dynamic
    

    区别于下面要讲的其他端口转发模式,-D是建立在TCP/IP应用层的动态端口转发。这条命令相当于监听本地1080端口作为SOCKS5代理服务器,所有到该端口的请求都会被代理(转发)到JumpHost,就好像请求是从JumpHost发出一样。由于是标准代理协议,只要是支持SOCKS代理的程序,都能从中受益,访问原先本机无法访问而JumpHost可以访问的网络资源,不限协议(HTTP/SSH/FTP, TCP/UDP),不限端口。

  2. 本地端口转发
    ssh -L 2222:localhost:22 JumpHost  # L is for Local
    

    这条命令的作用是,绑定本机2222端口,当有到2222端口的连接时,该连接会经由安全通道(secure channel)转发到JumpHost,由JumpHost建立一个到localhost(也就是JumpHost自己) 22端口的连接。
    如果上述命令执行成功,新开一个终端,执行ssh -p 2222 localhost,登录的其实是JumpHost。
    所以-L是一个建立在传输层的,端口到端口的转发模式,当然远程主机不仅限于localhost。
    后面的stdio转发和ProxyJump可以看做是本地端口转发的升级版和便利版(参见OpenSSH netcat mode

  3. 远程端口转发(内网穿透使用)
    ssh -R 8080:localhost:80 JumpHost  # R is for Remote
    

    顾名思义,远程转发就是在ssh连接成功后,绑定目标主机的指定端口,并转发到本地网络的某主机和端口:和本地转发相比,转发的方向正好反过来。
    假如在本机80端口有一个HTTP服务器,上述命令执行成功后,JumpHost的用户就可以通过请求http://localhost:8080来访问本机的HTTP服务了。

  4. stdio转发(netcat模式)与ProxyJump
    ssh -W localhost:23 JumpHost
    

    netcat模式可谓ssh的杀手特性:通过-W参数开启到目标网络某主机和端口的stdio转发,可以看做是组合了netcat(nc)和ssh -L。上述命令相当于将本机的标准输入输出连接到了JumpHost的telnet端口上,就像在JumpHost上执行telnet localhost一样,而且并不需要在本机运行telnet!
    既然是直接转发stdio,用来做ssh跳板再方便不过(可以看做不用执行两遍ssh命令就直接跳到了目标主机),所以在ProxyJump面世前(OpenSSH 7.3),ssh -W常被用于构建主机到主机的透明隧道代理,而ProxyJump其实就是基于stdio转发做的简化,专门用于链式的SSH跳板。


原文链接

使用SSH反向隧道进行内网穿透

SSH隧道:内网穿透实战(后面有使用场景分析)

内网穿透用法

  1. 要绑定公网端口,请确保在JumpHost的/etc/ssh/sshd_config里,配置了GatewayPorts yes,以及开放防火墙,否则SSH Server只能绑定回环地址端口。
  2. 内网机执行 ssh -qTfNn -R *:2222:localhost:22 JumpHost,将本机的 22 穿透到公网机的 2222 上。
  3. 使用 autossh 等工具避免 ssh 自动关闭。

发布者

胡中元

《中原驿站》站长

《SSH 隧道进行内网穿透》上有1条评论

回复 胡中元 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注