关于ssh连接底层(通信部分)探究,以及内网穿透相关实践

背景: 前端时间在某乎上看到一个话题,产生一点疑问,遂动手实践复现了一波,不得不说,csdn的环境真烂,要不是我基本的文章都在这里我就滚蛋了,等我抽时间把这些东西都迁移下,我就换平台!哈哈哈哈哈哈哈哈哈

链接如下

iptables 配置DNAT连接ssh ,为什么仍然提示端口拒绝? - Kingdo的回答 - 知乎

https://www.zhihu.com/question/496138274/answer/2206343604

链接简述:

通过外部机子链接内网的虚拟机,通过在虚拟机承载的实体机上做dnat设置将包路由到容器内,打通整个链路即可建立ssh链接。

文章需要基础知识如下(包括但不限于):

  • 路由(针对包转不同的机子,你可以理解为各个不同主机之间包的走向)
  • linux(这个实在是没啥好说的,只是我是在linux机子里做的实验所以可能会稍微涉及到一点点的命令,影响不大。)
  • iptables(可以理解为防火墙,可针对包拦截放行,或改源目的ip)
  • ssh(了解功能即可)
  • 网络/命令行抓包工具tcpdump详解-CSDN博客
  • 双网卡的路由逻辑(根据本地路由表走,如果没有匹配路由,走默认路由)

测试背景:

docker容器内的路由表如下

虚拟机路由表如下

虚拟机nat转发表如下

postrouting链为空

存在的问题:

环境如上,我从物理机192.168.133.1发起ssh请求,按照文章最开始引出文章的意思,这个时候这个链路应该是不通的,但是我目前按照如上的规则测试结果如下

容器抓22端口的包如下

ssh结果如下

可以看到是通了,但是按照文章引入的意思来说应该是通不了的。为什么呢?

原理与解答:

按照引入的文章意思转发的路径会变为

bash 复制代码
物理机:         192.168.133.1------------>192.168.133.128:11123
虚拟机(dnat):  192.168.133.1------------>172.17.0.2:20
容器:           192.168.133.1------------>172.17.0.2:20

然后按照原文章的意识是通不了的,但是为什么我这边会通呢,其实仔细看我容器机子的路由表以后就会发现我里面有两条路由,一个同网段的,还有一个默认路由,好,关键来了。

由于有一个默认路由的存在即使容器找不到133.1的目的主机,但是他会将这个包匹配路由表,然后走的默认路由(同网段路由指定是匹配不上),然后这个时候,由于包通过默认路由到达虚拟机以后,这个时候其实虚拟机是认识这个地址的,并且本地有dnat的转化记录,所以这个时候会将根据dnat将源地址修改在发往133.1。这个包由于在虚拟机上做了修改以后到达133.1的源地址是133.128所以这个时候其实阴差阳错的都对上,所以会导致ssh可以连接,然后容器其实连外网都ping不同的情况。

好了思路很清楚,这边将回报的路线梳理下,如下:

bash 复制代码
容器:           172.17.0.2:20          ------------>    192.168.133.1
虚拟机(dnat):  192.168.133.128:11123  ------------>    192.168.133.1
物理机:         192.168.133.128:11123  ------------>    192.168.133.1

猜想:盲猜开篇引出的文章里的实体机的虚拟机是没有设置默认路由的,如果设置了应该是可以走通的,或者是设置的网卡不对。

解决方式:1.设置默认路由,将逻辑链路走通

2.根据文章设置地址伪装。

总结:只要将路由走通,连接一般是能正常的。

相关推荐
啵啵鱼爱吃小猫咪3 小时前
Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程
linux·运维·ubuntu
Piko6144 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
ljs6482739514 小时前
Linux运维实操:vi编辑器永久配置静态IP(CentOS系列)
linux·运维·编辑器
2301_780303904 小时前
网络安全、自动化运维、ERP、CRM、MES
运维·web安全·网络安全·自动化·安全威胁分析
AOwhisky5 小时前
Python 学习笔记(第三期)——流程控制:条件判断与循环结构
运维·笔记·python·学习·云原生·流程控制·循环
IpdataCloud5 小时前
AI生成的Avalon恶意框架怎么防?用IP离线库识别模块化C2通信
运维·人工智能·网络协议·tcp/ip·ip
极客先躯5 小时前
高级java每日一道面试题-2026年03月30日-实战篇[Docker]-如何监控容器的网络流量?
java·运维·docker·容器·prometheus·高级面试
Waay6 小时前
Linux 三个核心环境变量配置文件、作用域、生效方式完整梳理
linux·运维·学习·云原生·容器
Piko6146 小时前
锐捷交换机 DHCP Server部署
运维·网络·笔记
jieyucx6 小时前
Shell实战:无限循环监控Nginx服务,异常自动重启+双份日志留存
linux·运维·nginx·自动化·shell