我尝试了一些不同的变化但似乎无法找到完全可行的方法。
我希望能够跨网络中的特定网关节点“桥接” 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=
选项中使用它。