SSH 端口转发 - 案例,命令及服务器配置

三种转发类型

  • 本地转发 -L
  • 远程转发 -R
  • 动态转发 -D

简单理解: ABC三台机 AC机器无法直接互通, 但是B分别能和AC互通, 所以AC通过B转发互通

本地 SSH 端口转发

将远程 server 的某个端口映射到本地的某个端口,通常用于A机器通过B登录C , 因为无法直接连通C,但是B可以连通C的情况

(如果是跳板机登录其他服务器,可以使用-J 参数跳转)

访问路径: 自己或者同局域网用户 --> 本机:Port --> SSH隧道 --> 跳转机 --> 远程服务:Port

Command:

ssh -L [本地主机:]本地主机端口:远程网络主机:远程网络主机端口 转发服务器
ssh -L 0.0.0.0:8080:HOST_C:8080 root@HOST_A			# 本地主机可以忽略不写,默认是127.0.0.1
ssh -L 127.0.0.1:8080:HOST_C:8080 root@HOST_A		# 自查127.0.0.1和0.0.0.0区别

Example:

* `ssh -L 8000:10.10.30.3:10000 10.10.20.2`  # 通过ssh 登录 10.10.20.2 ,将远程10.10.30.3的端口10000映射到本地计算机的8000端口上
* `ssh -L 10086::10086 10.10.20.2` 			# 将10.10.20.2的10086端口映射到本地

远程端口转发

将本机(或本地局域网中其他服务器)某个端口,映射到服务器的端口上,通常用于提供给外网访问(因为服务器有公网IP鸭)

访问路径: 用户 --> Server:Port ---> SSH隧道 --> 本地主机端口 --> 本机服务端口(或局域网其他主机)

重要提示:

默认情况下,OpenSSH 只允许从服务器本机连接到远程转发端口,使用netstat -anlp 查看监听端口时能看到监听的是 127.0.0.1:Port
如何能让其他用户通过Server IP访问呢 ? 需要监听 0.0.0.0:Port
修改服务器的 /etc/ssh/sshd_config ,修改或添加一行,有如下三个可选项
GatewayPorts No		(设默认只允许来自服务器主机的本地连接)
GatewayPorts Yes 	(Internet上的任何人都可以连接到远程转发端口)
GatewayPorts clientspecified 	(可以指定一个可以连接的IP地址,如果没有指定的话,则任何人都可以访问)

Command:

ssh -R [登录主机:]登录主机端口:本地网络主机:本地网络主机端口  代登录主机

Example:

  • ssh -R 10.10.20.2:3306:localhost:3306 10.20.20.2 # 将本地3306端口映射给远程10.20.20.2服务器的3306端口
  • ssh -R 10.10.20.2:3306:192.168.2.5:3306 10.20.20.2 # 将本地局域网中192.168.2.5的3306端口映射给远程10.20.20.2服务器的3306端口
  • ssh -o -R 0:localhost:3306 10.20.20.2 # 将本地3306端口映射给远程服务器的一个随机端口,连接后第一行输出会显示具体是哪个端口 ex:Allocated port 41389 for remote forward to localhost:3306
  • ssh -R 52.194.1.73:8080:localhost:80 xxxxxx # 此时只有 52.194.1.73 能够访问 xxxxx 的8080端口,前提要设置GatewayPorts clientspecified

服务器端配置

必须在服务器上启用 OpenSSH 服务器配置文件中的 AllowTcpForwarding 选项,才能允许远程端口转发。

不过默认情况下该功能是打开的。有如下可选项:

  • yes 或 all,以允许所有 TCP 转发
  • no,以防止所有 TCP 转发,本地允许本地转发,远程允许远程转发。

另一个选项是 AllowStreamLocalForwarding,它可以用于转发 Unix 域套接字。它允许使用与 AllowTcpForwarding 相同的值。默认值是yes。

AllowTcpForwarding remote 
AllowStreamLocalForwarding no

动态端口转发

无需固定指定被访问目标主机的端口号。这个端口号需要在本地通过协议指定,该协议就是简单、安全、实用的 SOCKS 协议。

简单讲就是, 通过sock代理将所有流量通过server转发. server能访问的ip,你也就都能访问了

Command:

ssh -D [本机:]本机端口

Example:

# 如何使用?
举例 
	* 浏览器设置sock代理为 server:端口
	* ssh -o ProxyCommand='/usr/bin/nc -X 5 -x 127.0.0.1:5000 %h %p' user@host2 # 给ssh套上sock代理并通过代理登陆host2

注意事项

  • 只要SSH不断开,连接就一直存在,同理断开SSH连接就会断开
  • 如果不是以root身份设置端口转发的话,转发端口只能使用大于1024的端口号。