语境

语境

语境

我们管理着一家拥有 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 隧道?

相关内容