多终端网络穿透与连接:
1.业务描述
1.1.实现终端 A 借助自建中继链路,访问远端终端 C 部署的各类服务,具体可访问服务及对应访问方式如下:
(1)SSH 服务:占用22端口,可通过 XShell 等 SSH 客户端建立连接;
(2)SFTP 服务:复用22端口,可通过 WinSCP、XFtp 等文件传输客户端操作文件;
(3)HTTP 网页服务:占用8080端口,直接使用浏览器即可访问;
(4)MySQL 数据库服务:占用3306端口,可通过 Navicat 这类数据库管理客户端连接操作。
1.2.现存问题:
终端 A 与终端 C 网络不通,A 无法直接发起对 C 的网络访问,跨网络环境下常规直连方案无法生效。
1.3.解决方案:
A通过1台或多台中间机器组成的“中继链路”,跳转访问到C。

2.工作模式
2.1.简单转接

2.1.1.网络环境
(1)中间节点B1可直接访问目标设备C;C也可以是部署在B1上的虚拟机
(2)访问端A无法直连C,但可以正常连通B1
2.1.2.中继链路配置
在B1部署、配置 socks 服务,做端口转发:
SSH 转发:本地端口2201,转发至C:22
HTTP 转发:本地端口2801,转发至C:8080
MySQL 转发:本地端口2601,转发至C:3306
2.1.3.A 端最终访问方式
(1)SSH/SFTP:填写B1的 IP、端口2201即可连接
(2)HTTP 网页服务:填写B1的 IP、端口2801通过浏览器访问
(3)MySQL 数据库:填写B1的 IP、端口2601通过数据库客户端连接
适用单中继节点场景,部署最简单,包含两种拓扑:B1、C 为两台独立设备;C 属于 B1 内部虚拟机。
2.2.多通道级联模式

2.2.1.网络环境
(1)最内侧中继B2可直接访问目标C
(2)外层中继B1无法直连C,但可以访问B2
(3)访问端A可直接访问B1
2.2.2.中继链路配置
需要逐层在中继节点配置 socks 端口转发:
B2配置:
SSH 端口2201 → C:22
端口2801 → C:8080
MySQL 端口2601 → C:3306
B1配置:
SSH 端口2201 → B2:2201
HTTP 端口2801 → B2:2801
MySQL 端口2601 → B2:2601
2.2.3.A 端最终访问方式
和简单转接一致,均使用B1IP + 对应端口:
SSH/SFTP:B1:2201
HTTP:B1:2801
MySQL:B1:2601
2.2.4.说明
(1)支持任意数量中继节点B1、B2、B3…链式延伸,每一级都要配置全套服务转发端口,指向下一跳中继
(2)缺点是多级节点端口配置工作量大,更推荐使用下文隧道级联模式降低运维成本
2.3.隧道模式

2.3.1.网络环境
(1)内侧中继B2可直连目标C
(2)外层中继B1不能直连C,可正常访问B2
(3)访问端A可访问B1,A也可以和B1部署在同一台机器
2.3.2.中继链路配置
依托单一隧道端口承载所有业务流量:
B2部署 socks:隧道端口2400,转发本地127.0.0.1:2400
B1部署 socks:
隧道端口2401,转发B2:2400,建立底层传输隧道
SSH 端口2201转发C:22、HTTP2801转发C:8080、MySQL2601转发C:3306,三项业务全部绑定隧道2401传输
2.3.3.A 端最终访问方式
依旧通过B1IP + 业务端口访问:
SSH/SFTP:B1:2201
HTTP:B1:2801
MySQL:B1:2601
2.3.4.适用场景
当内侧节点B2防火墙严格限制对外开放端口、仅能放行少量端口时优先选用;仅需要对外开放隧道端口(如 2400),所有业务流量都通过这一条隧道传输,大幅减少需要放行的端口数量。
2.4.隧道级联模式

2.4.1.网络环境
(1)访问端A、目标侧C分属不同私网,仅有内网私网 IP,无法互相直接连通
(2)内网中继B2与C处于同一私网,可互相访问;B2也可直接和C合并为同一台设备
(3)公网中继B1部署在公网,拥有独立公网 IP
(4)A、B2都可以主动向外连接公网B1,但B1无法主动向内访问A、B2的私网地址
2.4.2.中继链路配置
B2部署 socks:托管端口2401,反向连接转发至公网B1:2400
B1部署 socks:
SSH2201→C:22、HTTP2801→C:8080、MySQL2601→C:3306,所有业务流量依托隧道2401传输
2.4.3.A 端最终访问方式
统一使用公网B1的 IP + 业务端口访问:
SSH/SFTP:B1:2201
HTTP:B1:2801
MySQL:B1:2601
2.4.4.适用场景
两端设备都在内网、无公网 IP,借助一台公网服务器做托管中继,实现跨私网穿透访问,是异地内网互通最常用的模式。
2.5.托管隧道模式

2.5.1.网络环境(多层内网隔离)
(1)最内侧中继B3与C在内网 N3,B3可直连C
(2)B2无法访问C,可连通B3
(3)B1无法访问C,可连通B2
(4)访问端A可以正常访问最外层B1
2.5.2.中继链路配置
逐层搭建底层隧道,业务端口仅需在最外层B1配置:
B3:隧道端口2400转发本地127.0.0.1:2400
B2:隧道端口2401转发B3:2400
B1:隧道端口2401转发B2:2401;再配置业务端口2201/2801/2601分别转发 C 的对应服务,全部复用同一条隧道传输
2.5.3.A 端最终访问方式
直接访问最外层B1:
SSH/SFTP:B1:2201
HTTP:B1:2801
MySQL:B1:2601
2.5.4.模式优势
对比普通多通道级联,只需要逐级配置隧道端口,业务转发规则仅需配置一次,大幅降低多层内网场景下的配置维护工作量,多层网络跳转优先选用该模式。
3.运行方式
3.1.Linux版:
3.1.1.执行文件:socks点击下载
3.1.2.配置文件:socks.conf点击下载
3.1.3.操作
(1)部署:下载linux版本的socks文件及socks.conf后,存放于在服务端任意文件夹下
(2)运行:访问socks文件所属目录下,执行./socks & 进行后台启动。
(3)停止:可使用命令 ps -ef | grep socks 查询端口并kill pid
(4)访问:浏览器访问服务端socks地址:http://服务端ip或域名:2300/socks。输入配置文件中的账号密码进行登陆。
3.2.Windows版:
3.2.1.执行文件:socks.exe点击下载
3.2.2.配置文件:socks.conf点击下载
3.2.3.操作
(1)下载:点击前文中windows版文件下载,进行下载socks.exe及socks.conf文件,存放于相同目录下。
(2)运行:双击本地socks.exe或powershell运行: .socks.exe -o log.txt 将日志写入log.txt
(3)使用:浏览器访问http://ip:2800/index.html转发至http://127.0.0.1:本地端口/index.html
(4)停止:运行时,会同步打开黑窗口输出日志,关闭黑窗口即停止运行。
4.socks配置
4.1.socks自带简易http服务,可以从浏览器中通过网页对其进行配置
(1)从socks运行的本机浏览器上进行配置:http://127.0.0.1:2300/socks
(2)从其他机器的浏览器上进行配置:http://IP:2300/socks,IP为socks所在主机的IP地址
4.2.通道(Socket Listen List):当前开启的转发端口
4.3.缺省通道:socks首次运行时缺省打开2个通道端口
(1)admin:端口=2300,用于从浏览器对其进行配置
(2)tunnel:端口=2400,用于支持隧道
4.4.新增通道:在页面中部设置参数后,点击“Insert”即可
(1)Type:必填。协议类型。其中admin、tunnel、hosting为socks用于支持自身功能的特殊协议,其余为普通业务协议,如果所需转发的协议不在列表中,只需要选择“tcp”即可
(2)Listen Port:必填。中转端口号。该端口号不能重复,也不能被系统中其他进程所占用

(1)Forward IP:必填。前转目标IP地址,或下1跳socks的IP地址;
(2)Forward Port:必填。前转目标端口,或下1跳socks的中转端口;
(3)Tunnel:可选。如果前转的目标地址不是本机直达,而是通过隧道模式穿越其他中继结点,则填写所使用的隧道号,即当前socks通道中协议类型为tunnel、hosted的通道的“Listen Port”值;
(4)External IP:可选。仅对于ftp、iiop、tunnel协议,如果本机在防火墙内,其外网访问IP与自身IP地址不一致时,应在此处填写其外网访问IP。其他情况无需填写;
(5)nternel IP:可选。仅对于ftp协议,如果本机在防火墙外,其在防火墙内映射IP与自身IP地址不一致时,应在此处填写其墙内映射IP。其他情况无需填写;
(6)Description:可选。该通道的简要描述,便于区分各通道用途。
4.5.编辑通道
(1)点击某个通道的“Forward”栏,在页面中部可编辑通道的部分参数包括Type、Forward IP、Forward Port、tunnel、Description,之后点击“Modify”即可
(2)通道的”Listen Port”值不能修改,需要变更时,需先删除该通道,然后新增
(3)部分由socks内部派生的通道无法编辑,只能查看,包括hosted、ftp-U、ftp-D、iiop等
4.6.关闭(删除)通道
在上面的通道列表中,选中需要关闭的通道,点击“Shutdown”即可
4.7.活跃信道(Socket Connection List)
列出当前正在使用某一通道进行通信的活跃连接信息
4.8.断开(关闭)信道
下方表格中,选中需要断开的信道,点击“Shutdown”即可
4.9.自解析通道
(1)某些协议的通道,其前转目标IP和端口在配置时无需确定,而是从信道中动态提取真实的前转目标IP和端口
(2)配置方法:
Forward IP = 127.0.0.1
Forward Port = Listen Port
Tunnel = 0,即不借助其他隧道
(3)支持自解析通道的协议类型包括:
admin:socks直接解析信道中的HTTP请求,返回其自身配置页面,不进行前转
tunnel:从信道中提取前转目标的类型、IP、端口和隧道号
http:本通道可用作浏览器的HTTP代理,从信道HTTP Header中的Host指令中提取实际访问的Web服务器地址
ftp:本通道可用作FTP代理,从信道的SITE指令中提取实际访问的FTP服务器地址
telnet:本通道可用作访问多个telnet服务器,连接时用户在提示“Host: ”后输入真实服务器地址
4.10.admin通道
(1)admin通道用于对socks进行配置管理
(2)admin的3种配置模式:
自解析模式:管理当前socks
自解析通道,默认端口号=2300
访问方式:http://IP:Port/socks
更换端口的方法:Port1 ==> Port2
打开网址:http://IP:Port1/socks
新建类型为admin、端口为Port2的自解析通道
打开网址:http://IP:Port2/socks
关闭端口号为Port1的admin通道
虚拟端口转发模式:管理其他socks
Forward IP、Forward Port、Tunnel指向其他socks
Listen Port = 0,即不占用额外端口
从当前socks页面内,点击“Listen on”栏链接打开对方管理页面
实体端口转发模式:管理其他sock
Forward IP、Forward Port、Tunnel指向其他socks
Listen Port 为有效端口
可以从当前socks页面内点击”Listen on”栏链接打开对方管理页面
也可以直接输入URL打开:http://IP:Port/socks
4.11.tunnel通道
(1)tunnel通道用于创建端到端隧道,优点:
当存在多个中继结点B1,B2,B3,...时,业务通道(ssh、ftp、http等)只需在B1上配置和修改,无需在后续的B2,B3,...上逐一配置,减轻配置和修改的工作量
减少中间结点B2、B3、...需要开启的端口数量,尤其是当B2在防火墙内,对外暴露的端口数量很少时,可达到单端口多路复用的效果
(2)tunnel通道的4种配置模式:
隧道入口模式:
Forward IP、Forward Port指向下1跳结点的tunnel端口,Tunnel=0
在当前socks上配置其他各类业务通道,这些通道的Tunnel值均等于本隧道端口值
隧道中转模式:
Forward IP、Forward Port指向下1跳结点的tunnel端口,Tunnel=0
隧道出口模式:
自解析通道,默认端口号=2400
隧道接驳模式:
该模式为隧道入口模式的一个变种,仅用于一种特殊情形:隧道出口端仍不能直达最终的目标IP,还需要接驳出口端上的其他反向隧道(hosted),才能到达最终目的地
Forward IP、Forward Port指向下1跳结点的tunnel端口,Tunnel=在隧道出口端需要接驳的其他隧道端口,该隧道端口一般为反向隧道端口(hosted)
4.12.特殊配置
(1)FTP通道
FTP协议与常规TCP差别:
除了占用常规的21端口(控制端口)外,在目录列表、文件上传、文件下载过程中,需要动态占用另一端口(数据端口)
FTP数据端口支持Active/Passive两种端口模式,由客户端和服务器协商,Active模式由客户端创建数据接收端口,服务端主动连接客户端;Passive相反(简称PASV)
socks配置时只需要配置控制端口的转发通道,数据端口由socks根据协议内容自动按需分配和释放,无需干预
使用FTP客户端中,应在服务器属性(一般在“高级设置”)中,强制使用PASV模式
如果socks位于防火墙内,外网地址与本机地址不一致,需填写通道的External IP为外网IP地址,以便FTP客户端可以正确通过该IP连接数据端口
(2)HTTP通道
假设要访问的Web服务器为C,端口为8080;现准备使用服务器B的2800端口为其中转
如果Web服务器其返回的HTML页面中无下面的特殊情形,则可以简单配置http类型的中转通道,Forward IP = C,Forward Port = B;之后,在浏览器中输入URL即可访问C上的Web服务: http://B:2800/
特殊情形包含如下几类:
页面内包含类似”http://C:8080/”形式的完整URL。此时浏览器将无法顺着该链接打开页面或者调用后台API
Web服务程序检查Web请求,只对主机名称为“C:8080”时才能正确响应,对“B:2800”无法返回正确网页
解决方法:使用浏览器的HTTP代理机制
将该http通道配置为自解析通道,即Forward地址为:127.0.0.1:2800
在浏览器的代理设置中,设置HTTP代理为B:2800(Windows系统中,代理设置一般位于“控制面板”-->Internet属性-->连接-->局域网设置-->高级-->HTTP)
在浏览器地址栏直接输入目标URL,可正确打开网页及后续链接: http://C:8080/
socks暂不支持”https://”形式的HTTP代理
4.13.中转端口分配原则
(1)初始至少创建以下2个自解析通道(建议使用socks初次运行时默认开启的2个通道)
admin: 2300 ==> 127.0.0.1:2300
tunnel: 2400 ==> 127.0.0.1:2400
如果该socks只转接到单台主机上的服务端口
可以直接使用目标端口值作为中转端口值,以便在客户端使用缺省端口。无需记忆端口值,例如:
mysql : 3306 ==> C:3306
http : 8080 ==> C:8080
但对于某些协议类型,该端口在中转结点上已经被系统其它服务所占用,如ssh(22);或者该端口虽未占用,但需为未来的本机服务预留,如http(80);则需要更换中转端口,例如:
ssh : 2200 ==> C:22
http : 8080 ==> IP:80
另外,如果需要转接的目标端口值小于1024,为了使用与之相同的中转端口,在Linux/Unix系统上,需要以root身份运行socks,可能带来安全风险。此时也建议将中转端口更换为1024以上的值,例如:
smtp : 2500 ==> C:25
(2)推荐采用的中转端口值范围为:2000 ~ 2999,理由:
大于1024
不与常规的各种服务端口冲突
在防火墙上配置接入端口访问规则时,连续的端口号可以简化规则配置
如果该socks需要转接到同一子网/不同子网的多台主机,应按照一定的规律来进行中转端口的分配,便于统一管理。以2000~2999之间的端口范围,即2XYZ为例,推荐如下机制:
2X用于区分协议:(参见附表)
YZ用于区分不同的目标主机
当需要转接多个子网时,Y用于区分子网,Z用于区分子网内的主机
| 2X | 协议/业务 | 示例 |
| 20 | telnet及远程桌面 | telnet : 2000 ==> 23 vnc : 2201 ==> 5900 |
| 21 | FTP | ftp : 2100 ==》 21 |
| 22 | SSH及Windows远程桌面 | ssh : 2200 ==> 22 winterm : 2202 ==> 3389 |
| 23 | socks管理 | admin : 2300 ==> 2300 |
| 24 | socks隧道 | tunnel : 2400 ==> 2400 |
| 25 | 邮件类 | smtp : 2500 ==> 25 pop : 2501 ==> 110 |
| 26 | 数据库类 | mysql : 2600 ==> 3306 oracle : 2601 ==> 1521 |
| 27 | 应用自定义 | |
| 28 | HTTP | 2800 ==> 80 2801 ==> 8080 |
| 29 | 应用自定义 |
4.13.远程运维典型示例

场景描述
在客户内网中部署有2台主机
C1:应用服务器,Linux系统,Web服务+MYSQL
C2:采集设备,Windows系统
C1和C2在内网中,外部无法访问
客户现场有1台Windows电脑B2(或者运维人员自带的笔记本),其具备上Internet能力,同时可连到内网访问C1/C2
公网上有1台厂家托管的Linux服务器B1,其具备公网地址,但是防火墙安全限制,只能访问该服务器的22、2400端口
现运维人员在公司内,其电脑A可以上网,欲对C1、C2进行各类运维操作:
通过浏览器访问C1上的Web服务
通过XShell登录C1
通过XFtp向C1上传文件
通过Windows远程桌面登录C2
通过Navicat访问C1的数据库
4.14.各主机配置过程
C1:无需特殊配置
C2:开启Windows远程桌面服务
B2:
安装和运行Windows版socks
打开本机浏览器,输入URL访问管理页面:http://127.0.0.1:2300/socks
增加通道:hosting : 2402 = B1 : 2400
B1:
安装和运行Linux版socks
因B1的2300端口外网不可访问,故无法从A上通过URL(http://B1:2300/socks)对B1进行配置
A:
安装和运行Windows版socks
打开本机浏览器,输入URL访问管理页面:
增加通道:tunnel : 2401 = B1:2400
增加通道:tunnel : 2402 = B1:2400:2402(第2个冒号后为Tunnel参数值,以下同)
增加通道:admin : 2301 = 127.0.0.1:2300:2401
增加通道:admin : 2302 = 127.0.0.1:2300:2402
增加通道:ssh : 2201 = C1:22:2402
增加通道:http : 2801 = C1:80:2402
增加通道:winterm : 2202 = C2:3389:2402
增加通道:http : 2801 = C1:80:2402
增加通道:mysql : 2601 = C1:3306:2402
4.15.远程运维操作
以下操作均在A上完成
管理A上的socks:
在浏览器中输入: http://127.0.0.1:2300/socks
管理B1上的socks:
在A的socks管理页面中,点击通道2301的Listen on栏链接
管理B2上的socks:
在A的socks管理页面中,点击通道2302的Listen on栏链接
用XShell登录C1
主机地址设置为:IP地址 = 127.0.0.1,端口 = 2201
用Xftp登录C2并传输文件
主机地址设置为:IP地址 = 127.0.0.1,端口 = 2201
用远程桌面客户端登录C2
主机地址设置为:127.0.0.1:2202
用浏览器访问C1的Web服务页面
输入URL: http://127.0.0.1:2801/
用Navicat访问C1上的MYSQL数据库
数据库连接地址设置为:IP = 127.0.0.1,端口 = 2601
5.注意事项(非常重要):
5.1.Linux
5.1.1.执行文件需赋予可执行权限
chmod +x socks
5.1.2.配置文件与可执行文件需在统计目录
5.1.3.服务端端口需添加白名单
5.1.4.务必对配置文件进行配置用户名和密码,否则将影响服务启动
admin_user->->登陆账号
admin_password->->登录密码
5.2.Windows
5.2.1.配置文件与可执行文件需在统计目录
5.2.2.保证本地服务端口启动
5.2.3.需能连通服务端,为避免出现不可估计情况,请关闭防火墙,或使用cmd进行telnet测试
扫一扫