[原创]Ssh Tunnel简介


一个个
一个个 2022-10-08 11:39:45 51670
分类专栏: 资讯
Ssh Tunnel,即通常所说的Ssh隧道,其基本原理非常简单,如下图所示:

从图中可以看到,由于防火墙的设置,客户端浏览器Firefox想要直接访问Web服务器Nginx是不行的;但经过ssh工具可在客户端和服务器之间建立一条Ssh隧道,而Firefox直接访问本地的12345端口即可间接的访问到Nginx,这是否很神奇?

怎么做到的?从操作上来说,有两种方法可以做到。
1,在客户端上操作(假设为Linux系统,因此采用ssh命令):
$ ssh -Nf -L 127.0.0.1:12345:192.168.30.163:80 lenky@192.168.30.163

用Firefox访问Web服务端口:http://127.0.0.1:12345/
查看当前连接,客户端的情况:  
lenky@lenky-local:~$ sudo netstat -natp | grep 12345
tcp        0      0 127.0.0.1:12345         0.0.0.0:*               LISTEN      4011/ssh
tcp        0      0 127.0.0.1:12345         127.0.0.1:52194         ESTABLISHED 4011/ssh
tcp        0      0 127.0.0.1:52194         127.0.0.1:12345         ESTABLISHED 2604/firefox
lenky@lenky-local:~$ sudo netstat -natp | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      925/sshd
tcp        0      0 127.0.0.1:12345         0.0.0.0:*               LISTEN      4011/ssh
tcp        0      0 192.168.30.162:57567    192.168.30.163:22       ESTABLISHED 4011/ssh
tcp6       0      0 :::22                   :::*                    LISTEN      925/sshd

即:Firefox(52194) <---> Ssh(12345)

服务器端情况:
   
lenky@lenky-VirtualBox:~$ sudo netstat -natp
激活Internet连接 (服务器和已建立连接的)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3463/nginx: master
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      955/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3185/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      754/cupsd
tcp        0      0 192.168.30.163:22       192.168.30.162:57567    ESTABLISHED 4115/sshd: lenky [p
tcp        0      0 192.168.30.163:47634    192.168.30.163:80       ESTABLISHED 4208/sshd: lenky
tcp        0      0 192.168.30.163:80       192.168.30.163:47634    ESTABLISHED 3464/nginx: worker
tcp6       0      0 :::80                   :::*                    LISTEN      3463/nginx: master
tcp6       0      0 :::22                   :::*                    LISTEN      3185/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      754/cupsd
tcp6       1      0 ::1:45743               ::1:631                 CLOSE_WAIT  847/cups-browsed

即:Ssh(47634) <---> Nginx(80)

整个连接起来就是:
(Firefox(52194) <---> Ssh(12345))客户端 <---> Ssh(192.168.30.162:57567) <---> Ssh(192.168.30.163:22) <---> 服务器(Ssh(47634) <---> Nginx(80))

2,在服务器端操作(假设同样是Linux系统,因此采用ssh命令):
$ ssh -Nf -R 127.0.0.1:12345:192.168.30.163:80 lenky@192.168.30.162

在客户端用Firefox访问Web服务端口:http://127.0.0.1:12345/
查看当前连接,客户端的情况:
   
lenky@lenky-local:~$ sudo netstat -natp | grep 12345
tcp        0      0 127.0.0.1:12345         0.0.0.0:*               LISTEN      4445/sshd: lenky
tcp        0      0 127.0.0.1:52207         127.0.0.1:12345         ESTABLISHED 2604/firefox
tcp        0      0 127.0.0.1:12345         127.0.0.1:52206         TIME_WAIT   -
tcp        0      0 127.0.0.1:12345         127.0.0.1:52207         ESTABLISHED 4445/sshd: lenky
tcp6       0      0 ::1:12345               :::*                    LISTEN      4445/sshd: lenky
lenky@lenky-local:~$ sudo netstat -natp | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      925/sshd
tcp        0      0 127.0.0.1:12345         0.0.0.0:*               LISTEN      4445/sshd: lenky
tcp        0      0 127.0.0.1:12345         127.0.0.1:52207         ESTABLISHED 4445/sshd: lenky
tcp        0      0 192.168.30.162:22       192.168.30.163:55747    ESTABLISHED 4325/sshd: lenky [p
tcp6       0      0 :::22                   :::*                    LISTEN      925/sshd
tcp6       0      0 ::1:12345               :::*                    LISTEN      4445/sshd: lenky

即:Firefox(52207) <---> Ssh(12345)

服务器端情况:
   
lenky@lenky-VirtualBox:~$ sudo netstat -antp
激活Internet连接 (服务器和已建立连接的)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3463/nginx: master
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      955/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3185/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      754/cupsd
tcp        0      0 192.168.30.163:47641    192.168.30.163:80       ESTABLISHED 4344/ssh
tcp        0      0 192.168.30.163:80       192.168.30.163:47641    ESTABLISHED 3464/nginx: worker
tcp        0      0 192.168.30.163:55747    192.168.30.162:22       ESTABLISHED 4344/ssh
tcp6       0      0 :::80                   :::*                    LISTEN      3463/nginx: master
tcp6       0      0 :::22                   :::*                    LISTEN      3185/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      754/cupsd
tcp6       1      0 ::1:45743               ::1:631                 CLOSE_WAIT  847/cups-browsed

即:Ssh(47641) <---> Nginx(80)

整个连接起来就是:
(Firefox(52207) <---> Ssh(12345))客户端 <---> Ssh(192.168.30.162:22) <---> Ssh(192.168.30.163:55747) <---> 服务器(Ssh(47641) <---> Nginx(80))

上面用到的ssh命令的格式说明如下(更具体的介绍请看man手册):
ssh -C -f -N -g -L [bind_address:]listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -R [bind_address:]listen_port:DST_Host:DST_port user@Tunnel_Host
其中-L和-R的参数格式为[要打开的监听IP:]要打开的监听端口:要映射到的监听 IP:要隐射到的监听端口,监听IPbind_address默认为127.0.0.1。

-f Fork into background after authentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。
-p port Connect to this port. Server must be on the same port.
被登录的ssd服务器的sshd服务端口。
-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 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
-C Enable compression.
压缩数据传输。
-N Do not execute a shell or command.
不执行脚本或命令,通常与-f连用。
-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。

总得来说,Ssh Tunnel通常主要是实现3个基本功能:
1) 数据加密传输:采用了SSH加密。
2) 穿透防火墙:作为通用端口22或443,大多被防火墙放通。
3) 远程接入:这属于第1个功能的延生,在SSL VPN里应用得淋漓尽致。

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=18239
赞同 0
评论 0 条
一个个L2
粉丝 0 发表 13 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2941
【软件正版化】软件正版化工作要点  2860
统信UOS试玩黑神话:悟空  2819
信刻光盘安全隔离与信息交换系统  2712
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1246
grub引导程序无法找到指定设备和分区  1213
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  163
点击报名 | 京东2025校招进校行程预告  162
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  160
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  157
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!