ssh 隧道建立和端口转发

1,861 阅读3分钟

1、动态端口转发

image.png

如上图所示,本地的windows 主机可以和 内网主机(192.168.161.10) 通过 vpn 进行访问。

但是无法访问内部主机2(主要是由于内部主机2没有被vpn服务器放开)

当前要访问目标主机2,使用 ssh 与 192.168.161.10 主机建立隧道,通过隧道来访问内部主机2

1、建立隧道

  ssh -CfNg -D  11180  root@192.168.161.10       

命令的意思是,通过本地 11180 与 192.168.161.10 主机 22 端口建立通信的隧道,

如果成功 192.168.161.10 相当于跳板机

选项:

  • -C:压缩数据传输。

  • -f 后台启用

  • -N 不打开远程shell,处于等待状态

  • -g 启用网关功能

执行如下:

1669463393047.png

2、查看windows 端口占用情况

netstat -ano|findstr 11180

image.png

3、测试访问

1、未通过代理进行访问

image.png

2、配置浏览器代理

image.png

3、配置代理后,已经可以正常访问

1669463900345.png

2、端口转发 portmap 工具

实现功能:

通过 192.168.161.10 主机的 80 端口转发到 192.168.161.174 的 8089 端口

1、下载

wget http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip

image.png

2、解压

unzip lcx_vuln.cn_.zip

image.png

3、修改文件权限

chmod 777 -R lcx_vuln.cn

4、实现转发

./portmap -m 1 -p1 80 -h2 192.168.161.174 -p2 8089

通过 192.168.161.10 主机的 80 端口转发到 192.168.161.174 的 8089 端口

通过 netstat -antp|grep 80 可以看到 80 端口已处于 Listen 状态,如下图所示。

1669464471959.png

5、进行测试

1、已经转发成功

image.png

2、关闭转发 则无法访问

image.png

3、通过ssh 进行本地端口转发

转发到远端:ssh -C -f -N -g -L 本地端口:目标IP:目标端口 用户名@目标IP

将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport

实战1

实现上述 portmap 功能 在161.10主机上执行

ssh -CfNg -L 80:192.168.161.174:8089 root@192.168.161.10 

通过 192.168.161.10 主机的 80 端口转发到 192.168.161.174 的 8089 端口

执行情况如下:

image.png

查看端口占用情况

netstat -antp|grep 80

1669465127954.png

测试如下:

1669465386288.png

实战2

实现本地映射 把windows 本地主机的 端口 11080 映射到 192.168.161.10 主机的 11080 端口 ,这样映射可以绕过防火墙的限制。

在windows 主机上执行

ssh -CfNg -L 127.0.0.1:11080:192.168.161.10:11080 root@192.168.161.10 -p 22

执行情况如下:

image.png

查看windows 主机端口占用情况

netstat -ano|findstr 11080

image.png

通过浏览器访问测试

http://localhost:11080

image.png

4、远程转发 (反向代理,或者内网穿透)

所谓“反向代理”就是让远端启动端口,把远端端口数据转发到本地。

HostA 将自己的 PortA 暴露给外网服务器 HostC:PortC,在 HostA 上运行:

HostA$ ssh -R HostC:PortC:HostA:PortA  user@HostC

那么链接 HostC:PortC 就相当于链接 HostA:PortA。使用时需修改 HostC 的 /etc/ssh/sshd_config,添加:

GatewayPorts yes

那么通过在内网 HostA 上运行 ssh -R 告诉 HostC,创建 PortC 端口监听,把该端口所有数据转发给(HostA)

实战

通过大网ip 119.96.188.36 来做内网穿透。

把 119.96.188.36:11080 端口 映射到 192.168.161.10:11080

在主机 192.168.161.10 上执行

ssh -CfNg -R 119.96.188.36:11080:192.168.161.10:11080 root@119.96.188.36 -p 22

执行结果如下:

企业微信截图_1669507295280.png

在 119.96.188.36 主机上查看

netstat -antp|grep 11080

企业微信截图_16695073522707.png

测试

curl 127.0.0.1:11080

结果如下:

image.png

内网传透还可以使用 frp 可参照下文进行实现。

frp 实现内网穿透