SSH端口转发

SSH是远程终端登录协议,并逐渐取代telnet(基于TCP 32号端口),而ssh是基于TCP的22号端口;


SSH端口转发技术:

在SSH加密的通道上传输其他协议数据,即其他协议的数据通过SSH端口进行转发,SSH链接作为其他协议传输的通道(隧道),这种方式叫做SSH端口转发,或SSH隧道


SSH端口转发技术的作用

加密数据传输:可以让一些本来没有加密的应用层协议在加密的通道中安全的传输

突破防火墙限制:怎么理解? 


SSH端口转发的分类:

本地转发(local forwarding)

-f :在后台执行,不占用终端

本地转发中的本地是指将本地的某个端口转发其他主机的某个端口,这样当我们的程序链接本地的这个端口时,其实间接连接上了其他主机的某个端口,当我们发数据包到这个端口时数据包就自动转发到了那个远程端口上;

因为http协议本身并不是加密的,

-Nf:在后台执行

-L:执行一个本地转发

10.10.10.1:7788:10.10.10.2:80 :在本机10.10.10.1开启7788端口访问10.10.10.2 上80端口的资源

10.10.10.2:跟谁建立通道呢?跟10.10.10.2这台主机建立一个通道,前提时10.10.10.2这个主机能够访问10.10.10.2:80上的资源(也就是本地想要访问的资源)

[root@router~]#elinks --dump 10.10.10.2

    this is 10.10.10.2 web

在服务器端:

[root@server2 ~]tail /var/log/httpd/access_log


10.10.10.1 - - [29/Mar/2014:15:39:57 +0800] "GET / HTTP/1.1' 200 23 "-" "Elinks/0/11/1 (textmode; Linux; -)"


[root@router ~]ssh -Nf -L 10.10.10.1:7788:10.10.10.2:80 10.10.10.3

root@10.10.10.3's password:

[root@router ~] 可以发现此时并没有

[root@router ~]netstat -nt

Proto    Recv-Q   Send-Q  Local   Address                Foreign  Address          State

tcp      0               0         10.10.10.1:49048                10.10.10.3:22             ESTABLISHED

tcp       0              132   ::ffff:10.10.10.1:32              :ffff:10.10.10.249:59944 ESTABLISHED

[root@router ~]netstat -ntpl | grep 7788

tcp 0 0 10.10.10.1:7788   0.0.0.0:*   LISTEN    10222/ssh

如果在输入命令的时候省略了10.10.10.1:7788则会在这里显示127.0.0.1

[root@router ~]elinks --dump 10.10.10.1:7788 此时访问的时本机的7788端口

this is 10.10.10.2 web

[route@server2~]tail /var/log/httpd/access_log

10.10.10.3 - - [29/Mar/2014:15:42:39 +0800] "GET / HTTP/1.1" 200 23 "-" "Elinks/0.11.1 (textmode;Linux; -)"


这里要说明一点:其实在.1访问.2这个网站的时候,只有一段是数据安全的,就是.1和.3之间的SSH通道是数据加密的,但是.3去访问.2的时候,两者之间的数据并没有加密



做完实验之后如何杀死进程?

[root@router~]#ps aux | grep ssh

[root@router~]#kill -g 10222

检查一下:

[root@router~]#netstat -ntpl | grep 7788




SSH 本地端口转发:实现绕过防火墙限制

C不允许A访问,但是允许B访问,通过SSH本地转发实现A访问C


[root@server3~]elinks --dump 10.10.10.3

 this is 10.10.10.3 web

[root@server2~]elinks --dump 10.10.10.3

 this is 10.10.10.3 web


然后现在在server3上面做访问限制:

[root@server3~]iptables -A INPUT -s 10.10.10.1 -j REJECT


[root@router~]elinks --dump 10.10.10.3

Elinks:拒绝链接


然后再.1和.2之间建立号一个通道


[root@router~]#ssh -Nf -L :7788:10.10.10.3:80 10.10.10.2

[root@router~]#netstat -nt

tcp   0 0 10.10.10.1:40891           10.10.10.2:22             ESTABLISHED

[root@router~]#netstat -ntpl | grep 7788

tcp   0   0 127.0.0.1 :7788   

[root@router~]# elinks --dump 127.0.0.1 :7788

 this is 10.10.10.3 web

[root@server3~]#tail /var/log/httpd/access_log

10.10.10.2   



远程转发(remote forwarding)

远程转发和本地转发本质上是一样的,主要区别在于需要转发的端口是在远程主机还是在本地主机上


SSH远程端口转发:实现访问内网的资源

内网通过SNAT可以访问外网,外网无法直接访问内网,内网主机通过SSH远程转发实现外网主机访问内网资源

ssh -Nf -R 192.168.1.150:7788:10.10.10.2:80 192.168.1.150

ssh服务器监听7788端口


[root@router~]# iptables -nL -t nat

如何去除限制

[root@server3~]#iptables -D INPUT 1

[root@server3~]#iptables -nL


我再来梳理一下:

在内网[root@server3~]# ssh -Nf -R 192.168.1.150:7788:10.10.10.2:80 192.168.1.150

在外网[root@localhost~]#elinks --dump 127.0.0.1:7788

在内网[root@server2~]#tail /var/log/httpd/access_log



动态转发(dynamic forwarding)

  如果我们想用一个本地端口访问不同的外部服务,那就要将ssh作为socks代理服务,socks也是一种网络协议,它用于客户端和服务器之间数据传输的代理服务

 这种动态转发很类似于一种代理服务器的效果;

防火墙允许内网主机A访问外网,禁止主机B访问外网,在内网主机B上通过SSH动态转发实现主机A访问外网


ssh -Nf -D 10.10.10.3:7788 10.10.10.2


[root@router~]#iptables -A FORWARD -s 10.10.10.3 -p tcp -dport  80 -j REJECT







### 如何在 VSCode 中设置 SSH 端口转发 #### 配置端口转发的基础设定 为了使 Visual Studio Code (VS Code) 能够记住已经转发的任何端口,在设置编辑器中应当选中 "Remote: Restore Forwarded Ports" 或者是在 `settings.json` 文件里添加 `"remote.restoreForwardedPorts": true`[^1]。 #### 实现多级跳转开发环境的具体操作 对于更复杂的场景,例如通过机器 A 使用 VSCode 连接到服务器 B 并进行端口转发,之后再由主机 Host 利用 VSCode 连接回机器 A 来完成进一步的端口重定向工作,则可以按照以下方式配置: - **第一步连接**:先从本地计算机启动 VSCode,并使用 Remote-SSH 扩展来建立与目标服务器之间的安全 Shell(SSH)会话。 - **第二步端口映射**:接着可以在 VSCode 的集成终端内执行命令来进行必要的端口映射。假设要将远端服务器上的 22 号端口映射到本机上开放的一个新端口号(如5000),那么可以通过图形界面中的端口管理面板轻松实现这一点;也可以直接运行相应的 shell 命令手动指定参数完成相同的功能[^2]。 - **第三步再次连接**:最后一步是从另一台设备或者同一台电脑的不同实例重新打开 VSCode ,并通过修改过的 SSH 配置文件尝试登录至之前定义好的虚拟地址——即指向 localhost 和自定义端口组合而成的目标位置。此时应确保 `.ssh/config` 文件中有如下条目: ```bash Host serverB HostName localhost User root # 如果适用的话,请替换为实际使用的用户名 Port 5000 ``` 这样做的好处是可以简化跨网络边界的工作流程,允许开发者在一个更加直观友好的环境中处理远程资源和服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值