我可以使用 nc 和/或 stunnel 来制作透明 SSL 代理,以便我可以指定传出源端口吗?

我可以使用 nc 和/或 stunnel 来制作透明 SSL 代理,以便我可以指定传出源端口吗?

我尝试了一些不同的变化但似乎无法找到完全可行的方法。

我希望能够跨网络中的特定网关节点“桥接” SSL 连接。特别是,我希望能够进一步控制 TCP 连接的传出源端口。

我可以使用 stunnel 来完成其中的一部分工作——桥接 SSL 连接。我知道我可以使用nc来设置连接的源端口,但是我该如何将这两个连接在一起以允许指定传出连接的源端口?(或者这里有我应该考虑的替代解决方案吗?)


我觉得如果我可以nc作为透明代理工作,那就没问题了,因为我可以用它设置源端口。我觉得我可能只是错过了一些关于nc工作原理的知识。因此,为了提供更多背景信息,以下是我正在尝试的方法。假设我在 1235 上本地运行了一个 SSL 服务器。我想使用 SSL 客户端连接到它,但我想确保连接的传出源端口始终是 1234。(我可以直接连接到客户端,但我被赋予了一个任意的高数字端口;我需要能够指定它。)

我的想法是尝试nc在这里用作桥梁,例如:

# nc -l localhost:1234 | nc localhost:1235

这肯定建立了代理某物-- 我看到流量在正确的端点之间流动 -- 但似乎根本不能很好地处理 SSL。安全链接无法建立,而且我实际上无法使用 openssl 客户端/服务器在两者之​​间进行通信。

我需要做什么才能让它工作?我将尝试确定 stunnel 是否能在这里帮助我;我认为通过他们两个,我可能能够让它工作。


好吧,我尝试了socat一下,似乎确实可以建立连接——但我似乎无法弄清楚如何指定源端口。有什么想法吗?

答案1

使用的管道|是单向的。运行 时nc | nc,第二个连接的输出将转到你的终端;第一个连接的输入是从你的键盘读取的。基本上,它的完整形式是</dev/tty nc | nc >/dev/tty

要创建双向隧道,您必须使用其他东西,例如......

socat tcp-l:localhost:1234 tcp:localhost:1235

(或者创建一个命名管道并使用两个nc,但效率较低。)


然而,这将不是做你想做的事。它不会让 1234 成为第二个连接的源端口;你只会把它作为目的地港口第一的连接,并且两个连接毫无关联:stunnel只是从两个连接接收字节并将它们重新发送到另一端。

如果您只想指定连接的源端口,则更简单:

nc -l 56789 localhost 1235

socat stdio tcp:localhost:1235,sourceport=56789

由于stunnel没有“本地端口”选项,您可以采用上述命令之一并在exec=选项中使用它。

相关内容