CentOS发行版自带了小程序socat,可以按照设定策略,进行各种端口转发。
官网:
http://www.dest-unreach.org/socat/
1.实战
以穿网拉取内网设备RTSP流为例
#公网设备(假设IP是100.100.100.100)
socat -d tcp-listen:9997,reuseaddr,bind=0.0.0.0,fork tcp4-listen:9996,bind=0.0.0.0,reuseaddr,retry=100
#内网设备(假设IP是192.168.1.100)
socat -d tcp:100.100.100.100:9996,forever,intervall=0.1,fork tcp:localhost:554
此时使用RTSP客户端拉取 rtsp://100.100.100:9997/realmonitor ,可以获取内网设备的码流。
支持多路连接,因此用来转接WEB服务(包括websocket)也是可以的(已验证)。
2.原理解析
1) 公网设备侧的socat的意思是,监听TCP 9997端口,当有用户连接时,监听TCP 9996端口,并负责两边的数据周转。
2) 内网设备侧的socat的意思是,每隔0.1秒(100毫秒)尝试连接公网设备的TCP 9996端口。当连接成功时,主动连接本地554端口(RTSP服务端口),并负责两边数据周转。
3) 对比直接拉取终端流,延时没有明显增大。从客户端的抓包数据来看TCP瞬间建立,第一个信令请求的反馈在80毫秒后到达(符合100毫秒尝试连接一次的机制表现)。
3.参考资料
https://www.cnblogs.com/iamlehaha/p/6540695.html
https://blog.csdn.net/flaming999/article/details/52289775