端口转发、Http Tunnel、内网穿透

原文链接:https://www.yuque.com/tec-nine/architecture/mgxc71
SSH 命令帮助
命令行选项有:

 -a      禁止转发认证代理的连接.

 -A      允许转发认证代理的连接.  可以在配置文件中对每个主机单独设定这个参数.

         代理转发须谨慎.  某些用户能够在远程主机上绕过文件访问权限 (由于代理的 UNIX 域 socket), 他们可以通过转发的连接访问本地代理.
         攻击者不可能从代理获得密钥内容, 但是他们能够操作这些密钥, 利用加载到代理上 的身份信息通过认证.

 -b bind_address
         在拥有多个接口或地址别名的机器上, 指定收发接口.

 -c blowfish|3des|des
         选择加密会话的密码术.  3des 是默认算法.  3des (triple-des) 用三支不同的密钥做加密-解密-加密三次运算, 被认为比较可靠.
         blowfish 是一种快速的分组加密术(block cipher), 非常安全, 而且速度比 3des 快的多.  des 仅支持 ssh 客户端,
         目的是能够和老式的不支持 3des 的协议第一版互操作. 由于其密码算法上的弱点, 强烈建议避免使用.

 -c cipher_spec
         另外, 对于协议第二版, 这里可以指定一组用逗号隔开, 按优先顺序排列的密码术.  详见 Ciphers.

 -e ch|^ch|none
         设置 pty 会话的 escape 字符 (默认字符: ‘~’).  escape 字符只在行首有效, escape 字符后面跟一个点 (‘.’) 表示结束连接, 跟一个
         control-Z 表示挂起连接(suspend), 跟 escape 字符自己 表示输出这个字符. 把这个字符设为 “none” 则禁止 escape 功能,
         使会话完全透明.

 -f      要求 ssh 在执行命令前退至后台. 它用于当 ssh 准备询问口令或密语, 但是用户希望它在后台进行. 该选项隐含了 -n 选项.
         在远端机器上启动 X11 程序的推荐手法就是类似于 ssh -f host xterm 的命令.

 -g      允许远端主机连接本地转发的端口.

 -i identity_file
         指定一个 RSA 或 DSA 认证所需的身份(私钥)文件. 默认文件是协议第一版的 $HOME/.ssh/identity 以及协议第二版的 $HOME/.ssh/id_rsa
         和 $HOME/.ssh/id_dsa 文件. 也可以在配置文件中对每个主机单独指定身份文件.  可以同时使用多个 -i 选项
         (也可以在配置文件中指定多个身份文件).

 -I smartcard_device
         指定智能卡(smartcard)设备. 参数是设备文件, ssh 能够用它和智能卡通信, 智能卡里面存储了用户的 RSA 私钥.

 -k      禁止转发 Kerberos 门票和 AFS 令牌.  可以在配置文件中对每个主机单独设定这个参数.

 -l login_name
         指定登录远程主机的用户.  可以在配置文件中对每个主机单独设定这个参数.

 -m mac_spec
         另外, 对于协议第二版, 这里可以指定一组用逗号隔开, 按优先顺序排列的 MAC(消息验证码)算法 (message authentication code). 详情以
         MACs 为关键字查询.

 -n      把 stdin 重定向到 /dev/null (实际上防止从 stdin 读取数据).  ssh 在后台运行时一定会用到这个选项. 它的常用技巧是远程运行 X11
         程序. 例如, ssh -n shadows.cs.hut.fi emacs & 将会在 shadows.cs.hut.fi 上启动 emacs, 同时自动在加密通道中转发 X11 连接.  ssh
         在后台运行. (但是如果 ssh 要求口令或密语, 这种方式就无法工作; 参见 -f 选项.)

 -N      不执行远程命令. 用于转发端口. (仅限协议第二版)

 -o option
         可以在这里给出某些选项, 格式和配置文件中的格式一样.  它用来设置那些没有命令行开关的选项.

 -p port
         指定远程主机的端口. 可以在配置文件中对每个主机单独设定这个参数.

 -q      安静模式. 消除所有的警告和诊断信息.

 -s      请求远程系统激活一个子系统. 子系统是 SSH2 协议的一个特性, 能够协助 其他应用程序(如 sftp)把SSH用做安全通路.
         子系统通过远程命令指定.

 -t      强制分配伪终端.  可以在远程机器上执行任何全屏幕(screen-based)程序, 所以非常有用, 例如菜单服务. 并联的 -t 选项强制分配终端,
         即使 ssh 没有本地终端.

 -T      禁止分配伪终端.

 -v      冗详模式. 使 ssh 打印关于运行情况的调试信息. 在调试连接, 认证和配置问题时非常有用. 并联的 -v 选项能够增加冗详程度.
         最多为三个.

 -x      禁止 X11 转发.

 -X      允许 X11 转发. 可以在配置文件中对每个主机单独设定这个参数.

         应该谨慎使用 X11 转发. 如果用户在远程主机上能够绕过文件访问权限 (根据用户的X授权数据库), 他就可以通过转发的连接访问本地 X11
         显示器.  攻击者可以据此采取行动, 如监视键盘输入等.

 -C      要求进行数据压缩 (包括 stdin, stdout, stderr 以及转发 X11 和 TCP/IP 连接 的数据).  压缩算法和 gzip(1) 的一样, 协议第一版中,
         压缩级别 “level” 用 CompressionLevel 选项控制. 压缩技术在 modem 线路或其他慢速连接上很有用, 但是在高速网络上反而
         可能降低速度. 可以在配置文件中对每个主机单独设定这个参数. 另见 Compression 选项.

 -F configfile
         指定一个用户级配置文件. 如果在命令行上指定了配置文件, 系统级配置文件 (/etc/ssh/ssh_config) 将被忽略. 默认的用户级配置文件是
         $HOME/.ssh/config.

 -L port:host:hostport
         将本地机(客户机)的某个端口转发到远端指定机器的指定端口.  工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口,
         一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接.
         可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口.  IPv6 地址用另一种格式说明: port/host/hostport

 -R port:host:hostport
         将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口.  工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口,
         一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接.
         可以在配置文件中指定端口的转发. 只有用 root 登录远程主机 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

 -D port
         指定一个本地机器 “动态的” 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口,
         一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议,
         ssh 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口.  可以在配置文件中指定动态端口的转发.

 -1      强制 ssh 只使用协议第一版.

 -2      强制 ssh 只使用协议第二版.

 -4      强制 ssh 只使用 IPv4 地址.

 -6      强制 ssh 只使用 IPv6 地址.

阿里云-内网穿透示例

ssh -CqTnN -R 9000:127.0.0.1:8081 aliyun

本地转发模式原理

创建本地转发模式的ssh隧道,命令如下

ssh -g -f -N -L forwardingPort:targetIP:targetPort user@sshServerIP

本机上的forwardingPort将会被监听,访问本机的forwardingPort,就相当于访问targetIP的targetPort,ssh隧道建立在本机与sshServer之间

本地转发模式 - 方案示例一

ServerA:10.1.0.1

ServerB:10.1.0.2

A#

ssh -f -N -L 9906:10.1.0.2:3306 [email protected]

上述命令表示从本机(ServerA)建立一个到ServerB(10.1.0.2)的ssh隧道,使用本地端口转发模式,监听ServerA本地的9906端口,访问本机的9906端口时,通讯数据将会被转发到ServerB(10.1.0.2)的3306端口。

本地转发模式 - 方案示例二

ServerAIP:10.1.0.1

ServerBIP:10.1.0.2

ServerCIP:10.1.0.3

ServerA与ServerB上没有开启任何mysql服务。

ServerC中开启了mysql服务,监听了3306端口。

A#

ssh -f -N -L 9906:10.1.0.3:3306 [email protected]

上述命令表示,从本机(ServerA)建立一条ssh隧道连接到10.1.0.2(ServerB),隧道使用本地转发模式建立,转发端口监听在本地的9906端口上,访问本机的9906端口时,数据会被ssh隧道转发到10.1.0.3(ServerC)的3306端口。

远程转发模式原理

创建远程转发模式的ssh隧道,命令如下

ssh -f -N -R forwardingPort:targetIP:targetPort user@sshServerIP

sshServer上的forwardingPort将会被监听,访问sshServer上的forwardingPort,就相当于访问targetIP的targetPort,ssh隧道建立在本机与sshServer之间。

远程转发模式 - 方案示例

B#

ssh -f -N -R 9906:10.1.0.2:3306 [email protected]

上述命令在ServerB中执行,执行后,即可在ServerA与ServerB之间建立ssh隧道,此时,ServerB是ssh客户端,ServerA是ssh服务端,隧道建立后,ServerA中的9906端口会被监听。此刻,我们通过外网IP登录到ServerA,在ServerA中访问本地回环地址的9906端口,即可访问到内网ServerB中的mysql服务。

不过你肯定注意到了,当使用远程转发的命令时,我并没有指定监听ServerA的外网IP,也没有使用"-g选项"开启网关功能,这是因为,即使你在命令中指定了IP地址,最终在ServerA中还是会只监听127.0.0.1的9906端口,你可以在ServerB中尝试一下如下命令

ssh -f -N -R 10.1.0.1:9906:10.1.0.2:3306 [email protected]

即使在ServerB中执行上述命令时指定了IP或者开启了网关功能,ServerA的9906端口仍然只监听在127.0.0.1上,当然,如果你一心想要通过别的主机访问ServerA的9906端口,也可以使用其他程序去反代ServerA的9906端口。
Linux解决ssh tunnels端口不能转发问题
Linux解决ssh tunnels端口不能转发问题

我们需要打开公网服务器网管开关/etc/ssh/sshd_config 修改 GatewayPorts yes

参考资料

  1. SSH隧道、端口转发和内网穿透 https://www.processon.com/view/link/642b8baa3aff4d5813d424b7
  2. ssh使用密钥进行认证 http://www.zsythink.net/archives/2375
  3. ssh代理转发 http://www.zsythink.net/archives/2422
  4. ssh端口转发:ssh隧道 http://www.zsythink.net/archives/2450
  5. ssh反向代理实现内网穿透【亲测可用】https://blog.csdn.net/liuxingyuzaixian/article/details/128705262
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章