语境
我们管理着一家拥有 35 多个记者工作场所的广播电台。所有记者都使用桌面应用程序,连接到某个内部 IP 地址上公开 3306 的 MySQL。
还有其他服务,如端口 53 上的 DNS 解析、用于文件共享的 samba、用于音频流的 ice-cast 和一些其他服务。
我们计划重新设计支持服务。我当时想,与其在新的 IP 或端口上设置新的 MySQL,然后将 35 个工作站重新路由到新系统,不如在现有 IP/端口上放置某种 MySQL 代理/网关,在新端口上运行旧服务器,然后让代理将 que 查询重定向到旧 MySQL 服务器(在新端口上运行)。然后,当我想切换到新系统时,我只需切换代理/网关重定向,而不必更改客户端的配置。
但由于这必须通过具有不同协议的多个服务来完成,我想知道是否有任何开源工具可以作为到达某个端口的“任何东西”的通用 TCP / IP 代理,无论它是什么协议,就像 NAT 所做的那样,但是来自用户空间而不是内核空间。
Netcat。它是一个好的候选者吗?
我想到了netcat
。手册页上说:
nc(或 netcat)实用程序可用于几乎所有涉及 TCP 或 UDP 的操作。它可以打开 TCP 连接、发送 UDP 数据包、监听任意 TCP 和 UDP 端口、进行端口扫描以及处理 IPv4 和 IPv6。
类似 ssh 的隧道
事实上,我认为它与 SSH 隧道非常相似:只需连接到 A:3333 并“透明地”进入 B:7777 即可。不同之处在于这里不涉及 ssh。
例子
在机器 A、端口 3306 上运行服务并使其将所有传入数据“转发”到“机器 B 端口 9999 的远程 IP”,然后从 9999 返回的字节从 3306 吐出。
也许我只需要让“netcat”监听端口 3306 并“创建到 B:9999 的隧道”。
让我困惑的是,手册页说netcat
“-X proxy_version”是设置 socks-4 socks-5 或 http-proxy,我觉得我需要低于这个级别的。我不知道是否netcat
可以“透明地”从这里到那里建立隧道。
在 Docker 中?
如果我能设法只做一个“在端口 X 上监听软件”,那么它甚至可以被 dockerized 并运行任意数量的实例,并且只要它是协议无关的(只传递字节,不做任何额外的事情),一切都会正常工作。docker 容器将nc
在同一个端口(比如端口 5000)中运行,并使用docker run
映射“真实监听端口”。那么也许“目的地”只是一个环境变量。
就像是:
docker run -d -p 3306:5000 -e REMOTE=my-other-mysql-hostname:3307 some-kind-of-proxy
如果需要,我们控制一切
我们控制所有支持服务以及客户端,它是 LAN 上的内部设置,我们拥有访问任何我们想要的站点的 root 权限,并且由于它在防火墙 LAN 上运行,因此不存在涉及来自世界的黑客的安全问题。例如,如果 MySQL 必须将“允许的 IP”更改为执行代理的机器的 IP,而不是客户端的 IP,我们可以毫无问题地做到这一点。
问题
- 为了这个目标我应该运行“netcat”或者类似的东西吗?
- 我可以使用用户空间代理而不是使用 iptables 吗?
- 是否有任何现成的 Docker 映像可以在端口上建立 TCP-IP 隧道?