本帖最后由 银票小当家 于 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和协商端口 |