登陆

  1. ssh [user]@hostname

常用选项

选项 描述 备注
-f 后台运行ssh隧道
-N 不打开远程shell,处于等待状态
-L 本地机(客户机)的某个端口转发到远端指定机器的指定端口
-R 远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-g 允许远端主机连接本地转发的端口
-p 指定远程主机的端口

端口转发

SSH端口转发,又称为”SSH隧道”。SSH隧道提供了相应的加密及解密服务,保证了数据传输的安全性。

作用

  • 增加数据安全。将不加密的数据通过SSH隧道传输,增加了数据安全性
  • 绕过防火墙

本地端口转发

含 义:将本地主机的某个端口转发到远端指定主机的指定端口。
工作原理:本地主机上分配了一个 socket 侦听 port 端口,一旦这个端口上有了连接, 该连接就经过安全通道转发出去,同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发。只有 root 才能转发特权端口。
应用场景:xxxx

示意图
image.png

选项-L port:host:hostport
结合自己的理解,对上述选项整理如下:
-L [local_host]local_port:remote_host:remote_port <user>@remote_ssh_server_host

示例:

  1. $ssh -L 8888:39.99.190.206:80 admi@39.99.190.206

表示,当访问local_host:local_port时,会被转发到remote_host:remote_port。执行完上述命令后,会自动ssh登陆到remote_ssh_server_host,执行-N参数时则不会登陆(ssh -f -N -L)

可以看到本地主机对8888端口的监听

  1. $sudo netstat -tunple | grep 8888
  2. tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 1000 97880164 19191/ssh
  3. tcp6 0 0 ::1:8888 :::* LISTEN 1000 97880163 19191/ssh

也可以看到本地主机(ssh客户端)和远端主机(ssh服务)成功建立了ssh连接

  1. $sudo netstat -tupe | grep ssh
  2. tcp 0 0 vmware:42150 39.99.190.206:ssh ESTABLISHED centos 335834 118827/ssh

需要注意一个问题,当我们使用上述命令建立隧道时,本地主机127.0.0.1回环地址的8888端口会被监听,这样就会导致只能在本地主机访问8888端口。所以添加上local_host1即可。

  1. $ssh -L 192.168.199.131:8888:39.99.190.206:80 admi@39.99.190.206
  1. $sudo netstat -tunple | grep 8888
  2. tcp 0 0 192.168.199.128:8888 0.0.0.0:* LISTEN 1000 37260680 101104/ssh

还有一种方式是添加-g参数,用于监听本地所有网络接口的指定端口(此时查看监听的ip变为0.0.0.0)

  1. $sudo netstat -tunple | grep 8888
  2. tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1000 331012 116325/ssh
  3. tcp6 0 0 :::8888 :::* LISTEN 1000 331013 116325/ssh

执行完成后:

  • 本地主机上,ssh会端口8888进行监听

远程端口转发

含 义: 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口。
工作原理:在远程主机上分配了一个 socket 侦听 port 端口,一旦这个端口上有了连接,该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机 才能转发特权端口。
应用场景:xxxx

示意图
image.png

选项
-R port:host:hostport

整理如下:
-R [remote_host1]remote_port1:local_host2:local_port2 <user>@remote_host3

  1. $ssh -R 39.99.190.206:8080:192.168.199.131:8888 admi@39.99.190.206

在远端主机39.99.190.206上通过netstat,可以看到ssh服务已对8080端口进行监听。
但只是监听本地回环地址的8080端口。添加参数-g亦然。

  1. $sudo netstat -tunple | grep 8080
  2. tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1000 4739492 153674/sshd: admi
  1. netstat -tunpe
  2. Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
  3. tcp 0 0 192.168.199.131:46202 39.99.190.206:22 ESTABLISHED 1000 27597 4989/ssh
  • /etc/ssh/sshd_config 中 将GatewayPorts配置为 yes,并重启ssh服务即可,sudo service sshd restart
    1. admi@centos~$sudo netstat -tunple | grep 8080
    2. tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1000 5417915 187776/sshd: admi

    动态端口转发

    本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接。
  1. ssh -g -f -N -D 8888 admi@39.99.190.206

本地已对8888端口进行监听

  1. $netstat -tunple | grep 8888
  2. tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1000 37746 8204/ssh
  3. tcp6 0 0 :::8888 :::* LISTEN 1000 37747 8204/ssh

本地ssh已和远端建立ssh隧道

  1. $sudo netstat -tunpe | grep ssh
  2. tcp 0 0 192.168.199.131:53994 39.99.190.206:22 ESTABLISHED 1000 38977 8204/ssh

测试

  1. $curl --socks5 127.0.0.1:8888 www.baidu.com

备注

  1. 开启本地/远程端口转发的命令,都是在本地主机上执行,SSH通道也是本地向远端主动发起连接。

    参考资料

[1] ssh端口转发