登陆
ssh [user]@hostname
常用选项
| 选项 | 描述 | 备注 |
|---|---|---|
| -f | 后台运行ssh隧道 | |
| -N | 不打开远程shell,处于等待状态 | |
| -L | 本地机(客户机)的某个端口转发到远端指定机器的指定端口 | |
| -R | 远程主机(服务器)的某个端口转发到本地端指定机器的指定端口 | |
| -g | 允许远端主机连接本地转发的端口 | |
| -p | 指定远程主机的端口 |
端口转发
SSH端口转发,又称为”SSH隧道”。SSH隧道提供了相应的加密及解密服务,保证了数据传输的安全性。
作用
- 增加数据安全。将不加密的数据通过SSH隧道传输,增加了数据安全性
- 绕过防火墙
本地端口转发
含 义:将本地主机的某个端口转发到远端指定主机的指定端口。
工作原理:本地主机上分配了一个 socket 侦听 port 端口,一旦这个端口上有了连接, 该连接就经过安全通道转发出去,同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发。只有 root 才能转发特权端口。
应用场景:xxxx
示意图 
选项:-L port:host:hostport
结合自己的理解,对上述选项整理如下:
-L [local_host]local_port:remote_host:remote_port <user>@remote_ssh_server_host
示例:
$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端口的监听
$sudo netstat -tunple | grep 8888tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 1000 97880164 19191/sshtcp6 0 0 ::1:8888 :::* LISTEN 1000 97880163 19191/ssh
也可以看到本地主机(ssh客户端)和远端主机(ssh服务)成功建立了ssh连接
$sudo netstat -tupe | grep sshtcp 0 0 vmware:42150 39.99.190.206:ssh ESTABLISHED centos 335834 118827/ssh
需要注意一个问题,当我们使用上述命令建立隧道时,本地主机127.0.0.1回环地址的8888端口会被监听,这样就会导致只能在本地主机访问8888端口。所以添加上local_host1即可。
$ssh -L 192.168.199.131:8888:39.99.190.206:80 admi@39.99.190.206
$sudo netstat -tunple | grep 8888tcp 0 0 192.168.199.128:8888 0.0.0.0:* LISTEN 1000 37260680 101104/ssh
还有一种方式是添加-g参数,用于监听本地所有网络接口的指定端口(此时查看监听的ip变为0.0.0.0)
$sudo netstat -tunple | grep 8888tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1000 331012 116325/sshtcp6 0 0 :::8888 :::* LISTEN 1000 331013 116325/ssh
执行完成后:
- 本地主机上,ssh会端口8888进行监听
远程端口转发
含 义: 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口。
工作原理:在远程主机上分配了一个 socket 侦听 port 端口,一旦这个端口上有了连接,该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机 才能转发特权端口。
应用场景:xxxx
示意图
选项
-R port:host:hostport
整理如下:
-R [remote_host1]remote_port1:local_host2:local_port2 <user>@remote_host3
$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亦然。
$sudo netstat -tunple | grep 8080tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1000 4739492 153674/sshd: admi
netstat -tunpeProto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program nametcp 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 restartadmi@centos~$sudo netstat -tunple | grep 8080tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1000 5417915 187776/sshd: admi
动态端口转发
本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接。
ssh -g -f -N -D 8888 admi@39.99.190.206
本地已对8888端口进行监听
$netstat -tunple | grep 8888tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1000 37746 8204/sshtcp6 0 0 :::8888 :::* LISTEN 1000 37747 8204/ssh
本地ssh已和远端建立ssh隧道
$sudo netstat -tunpe | grep sshtcp 0 0 192.168.199.131:53994 39.99.190.206:22 ESTABLISHED 1000 38977 8204/ssh
测试
$curl --socks5 127.0.0.1:8888 www.baidu.com
备注
[1] ssh端口转发
