双向地址转换场景UDP流量通过socks代理数据说明
  

银票小当家 20361人觉得有帮助

{{ttag.title}}
本帖最后由 银票小当家 于 2020-12-16 11:41 编辑

双向地址转换场景UDP流量通过socks代理数据说明
作者-WY
背景说明
金融客户内网严格划分区域,有些区域无法联网但又需要访问一些互联网的地址。这时候可以用到SG,此区域控制只有SG可以联网,那些需要上网的终端配置代理指向SG。此次金融客户一个新上业务是视频会议,访问流量是UDP的并且过程需要经过代理。
数据流

访问过程如上图,中间做了双向地址转换,而socks代理udp流量有个协商过程。
数据包分析
下面从实际的数据包分析整个过程


客户端跟SG发起socks协商,前两个包是协商代理认证方式的,一般不用关注


第三个包是客户端发给SG,在Socks Protocol部分表明自己的地址和端口
第四个包是SG发给客户端,在Socks Protocol部分表明自己的地址和端口
后续客户端将视频流数据发给SG协商地址和端口,SG把回包发给客户端地址和端口,客户端要访问的真实视频服务器地址放在socks字段的remote address里,注意其实这个socks字段并不是真实的存在,而是以00 00 00 01开头的数据到22 f6结束总共10个字节,前面几个字节是标记socks后面数据是真实地址。wireshark识别到这个开头数据解析出来socks部分,正常是放在数据包的data部分,有的wireshark版本看不到这一部分。

SG给客户端回包也一样,地址和端口都是前面协商的。
SG接收到客户端的数据包,下一步就根据remote address里的真实目的服务器地址发起访问,可以从下面的数据包看到,客户端发给SG两个包,紧接着SG发给目的服务器两个包,客户端到SG是socks代理数据所以多了10个字节,这10个字节就是上面说的标记socks和记录真实目的IP的。

但是这个场景有个问题,客户端和SG真实地址和协商地址不一样。真实地址都是经过地址转换的,协商的是自己接口真实地址,发送和接收数据都用的接口真实IP这就导致访问失败。
解决方法
目前在客户端和SG上分别做变动:
SG
做定制包,返回给客户端的地址不是接口地址而是客户端看到的DNAT地址(第四个包SG返回指定的IP)
客户端
代理协商的数据包把本端地址改成SNAT后的地址,即SG看到的客户端IP,同时代理端口也做指定(第三个包客户端指定自己的IP和端口)
中间防火墙
做地址转换策略,除了将客户端源IP做SNAT指定转换后的地址外,源端口做保持,目的IP正常DNAT,目的端口放通所有(目前socks5协商阶段第四个包里代理返回的socks protocol代理端口不能指定),通常是针对源IP做一对一的地址转换,源转换成指定IP,源端口不变,目的地址转换端口所有。
这样整个数据流如下:
协商阶段
1)客户端发送给SG
源IP192.168.1.1目的IP192.168.1.2,源端口随机目的端口1080
数据包socks protocol里自己地址和端口172.16.1.1和1001
2)客户端访问SG到达防火墙后
源IP172.16.1.1目的IP172.16.1.2,源端口随机目的端口1080
数据包socks protocol里自己地址和端口172.16.1.1和1001
3)SG返回客户端数据
源IP172.16.1.2目的IP172.16.1.1,源端口1080目的端口客户端
数据包socks protocol里自己地址和端口172.16.1.2和25002
发送数据阶段
1)客户端发送给SG
源IP192.168.1.1目的IP192.168.1.2源端口1001目的端口25002
数据包socks里真实服务器地址10.0.0.1端口8806
2)客户端访问SG到达防火墙后
源IP172.16.1.1目的IP172.16.1.2源端口1001目的端口25002
数据包socks里真实服务器地址10.0.0.1端口8806
3)SG接受数据发送给真实服务器
源IP172.16.1.2目的IP10.0.0.1源端口25002目的端口8806
没有socks字段
4)真实服务器发数据给SG
源IP10.0.0.1目的地址172.16.1.2源端口8806目的端口25002
没有socks字段
5)SG回数据给客户端
源IP172.16.1.2目的IP172.16.1.1源端口25002目的端口1001
数据包socks里真实服务器地址10.0.0.1端口8806
6)SG会数据给客户的到达防火墙后
源192.168.1.2目的192.168.1.1源端口25002目的端口1001
数据包socks里真实服务器地址10.0.0.1端口8806
数据传输完成

注意事项
socks5代理指定目的IP或者域名通过定制SG11.9R1+SG-2019010301实现
udp流量支持通过KB-AC-20190824-201-01实现,打包后需要修改配置指定代理返回的IP
另外过程中有个bug可以利用
如果代理协商过程,第三个包客户端不发自己的IP,协商0.0.0.0,则SG会以实际收到的IP和端口回包,这样就不用在防火墙上做一对一的地址转换,这个小bug可以解决双向地址转换过程中防火墙的配置问题。

这里客户端不发送自己的地址,端口是12247

后续客户端以新的57481端口发送数据,SG也是返回给新的地址加57481端口,不是客户端真实IP和协商端口

打赏鼓励作者,期待更多好文!

打赏
25人已打赏

C罗单手卸AF 发表于 2021-1-6 09:07
  
首先感谢楼主的分享,此场景在实际环境中会经常遇到,楼主将双向地址转换和SOCKS5代理的整个过程进行了讲解,并附上了数据包,在结尾标明了数据流向以及注意事项,让整个访问过程边的清晰明了,期待楼主的下次分享!
JM 发表于 2020-12-23 14:39
  
我又来学习了,感谢分享
8336 发表于 2021-1-12 10:27
  
感谢楼主图文并茂的分享
dhf 发表于 2021-2-23 21:51
  
感谢楼主的精彩分享,有助工作!!!
dhf 发表于 2021-3-1 23:12
  
感谢楼主的精彩分享,有助工作!!!
吃馒头的大豆豆 发表于 2021-3-26 08:45
  
坚持学习,坚持打卡,坚持努力
新手078326 发表于 2021-4-11 11:23
  
学到了 学到了,感谢感谢
新手741261 发表于 2021-4-11 11:48
  
一看就是总结了不少遇到的坑,很有经验。
zjwshenxian 发表于 2021-5-7 14:37
  
支持一下,顺带盖楼。
发表新帖
热门标签
全部标签>
每日一问
技术盲盒
干货满满
每周精选
技术笔记
标准化排查
产品连连看
技术晨报
GIF动图学习
新版本体验
技术咨询
安装部署配置
2023技术争霸赛专题
功能体验
信服课堂视频
玩转零信任
秒懂零信任
自助服务平台操作指引
通用技术
答题自测
每日一记
技术圆桌
在线直播
问题分析处理
用户认证
畅聊IT
专家问答
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
流量管理
运维工具
云计算知识
原创分享
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
2024年技术争霸赛

本版达人

adds

本周建议达人

无极剑圣

本周分享达人

新手25642...

本周提问达人