最近买的云上mongo数据库但是数据库不支持外网访问,准备做iptables转发但是一直不成功,腾讯云官方给予的解释是受服务器内启动的docker影响 做iptables转发会冲突,所以只能另想办法,我发现使用socat做转发也很好用,所以记录一下开源给大家。
socat介绍:
socat
是一个功能强大的多功能网络工具,它可以在两个数据流之间建立连接,同时可以转换它们的特性。它的名字源自于 "SOcket CAT",意味着它可以像 cat
命令一样,但用于网络连接。
以下是 socat
的一些主要特点和功能:
-
多协议支持:
socat
支持多种不同的协议,包括 TCP、UDP、IPv4、IPv6、UNIX 套接字等。 -
连接两个数据流:
socat
可以连接两个数据流,这两个数据流可以是文件、套接字、管道等。 -
端口转发: 你可以使用
socat
在不同的主机之间进行端口转发,使得网络服务可以在不同主机之间进行通信。 -
代理和中继: 你可以使用
socat
作为代理或中继,将数据流从一个位置转发到另一个位置,这在网络调试和故障排除时非常有用。 -
加密和认证:
socat
支持 SSL 和 TLS 加密,以及基本的认证功能,可以确保数据在传输过程中的安全性。 -
虚拟串口: 在某些情况下,
socat
还可以创建虚拟串口,模拟物理串口的功能,用于串口通信和调试。
总的来说,socat
是一个非常灵活和强大的工具,可以在网络和系统管理、开发和调试等方面发挥重要作用。
tcp端口转发:
注:我在192.168.1.10这台服务器执行下面的命令让端口转发到内网IP:10.106.0.20的6379端口上,执行完下面的命令就可以在访问192.168.1.10:20001端口就可以转发到内网IP的6379端口上,也就可以使用外网访问我们的内网数据库。
socat TCP4-LISTEN:20001,fork TCP4:10.106.0.20:6379 &
执行完命令我们可以使用netstat -lntp 查看本地是否启动一个为20001的端口
然后我们使用命令:telnet 10.106.0.20:6379 27017 测试能否连通服务器如下图表示成功
注:如果是云上服务器记得开启服务器安全组20001端口,和后端服务器允许服务器192.168.1.10访问6379端口。
#TCP4-LISTEN表示监听一个TCP4端口(IPv4),fork表示每个连接都创建一个新进程处理数据流,TCP4:10.106.0.20:6379表示将数据转发到目标主机B的6379端口。这样,所有发送到主机A的20001端口的数据流都会被转发到主机B上的6379端口。会在A主机监听20001端口,所有访问A:20001端口的,会返回B:6379的资源。
UDP端口转发:
除了TCP端口转发,socat还支持UDP端口转发。假设有一台主机A,它的IP地址为192.168.100.10,上面运行着一个DNS服务器,监听在53端口。现在需要将53端口的UDP数据流转发到另一台主机B上的5353端口,可以使用以下命令:
socat UDP4-LISTEN:53,fork UDP4:192.168.100.20:5353 &
其中,UDP4-LISTEN表示监听一个UDP4端口(IPv4),UDP4:192.168.100.20:5353表示将数据转发到目标主机B的5353端口。