将 rot13(或其他加密)应用于端口上的所有转发流量

将 rot13(或其他加密)应用于端口上的所有转发流量

这听起来很愚蠢,但听我说完(尽管可能仍然如此)。

我是一名CS学生。我所研究的大学有一个聪明的想法,即以安全的名义阻止所有入侵的 SSH 和 VPN 流量。然后要求所有人员通过过时且可利用的 OpenVPN 服务器到达防火墙后面。这让我的生活变得困难。我想从家里访问我的实验室服务器。但不能通过旧的 OpenVPN 服务器。

---------------       ---------------            -----------------
| My home PC  | --->  | Firewall    |   -X--->   | Lab server    |
---------------       ---------------            -----------------

整个事情对我来说听起来很愚蠢(我认为有人使用默认密码是一个更大的问题。无论如何)。我决定弄清楚防火墙有多坚固。然后我发现加密我的交通经过罗特13足以欺骗防火墙。

---------------                   ---------------                         -----------------
| My home PC  |->| rot13 | --->  | Firewall     |   ----->  | rot13 | ->  | Lab server    |
---------------                   ---------------                         -----------------

这是我的概念验证:

# Client side:
nc -l -p 2222 | rot13 | nc my_server_ip 2222
# server side:
nc -l -p 2222 -s my_server_ip | rot13 | nc localhost 22

当我连接到localhost 2222.但这是单向链接,因此握手未完成。 (与握手数据包相比,如果没有 握手数据包甚至不会到达rot13)。

问题是,这是一个加密的单向链接。我怎样才能使其双向?到目前为止,我尝试通过管道在 iptables 之间传输数据rot13。但我不能。

笔记

  1. 我不考虑像这样混淆代理,obfsproxy因为这应该很容易。不想使用重型武器。
  2. ROT13 只是用来绕过防火墙的。我知道它很弱。
  3. 这是一个“嗯……我可以这样做吗?”的问题。不是“我应该这样做吗?”

答案1

socat应该做。

socat该工具可以满足您在任何地方(双向)传输任何内容的所有需求。它只需要一对参数,每个参数指定要连接在一起的一个事物。在这种情况下,最有趣的选项是TCP:host:port,TCP-LISTEN:portFD:or OPEN:。每个参数也可以由一对用 分隔的参数组成!!,其中第一个元素将被读取,另一个元素将被写入。

因此,基于 - 的示例的最小扩展nc可能如下所示:

服务器端:

mkfifo in in_rot out out_rot
rot13 < in > in_rot &
rot13 < out > out_rot &
socat TCP:localhost:22 OPEN:in_rot!!OPEN:out &
socat TCP-LISTEN:2222 OPEN:out_rot!!OPEN:in &

这可以通过去掉命名的 FIFO 并使用FD:来引用 Bash 中设置的管道来简化。

正如所写,这只适合单次使用(socat一旦连接关闭就会退出)。您可以无限循环运行它,或者设置一个 systemd.socket单元或类似的东西xinetd来为您监听并在连接时生成此脚本。

客户端可以以非常相似的方式完成(侦听某个本地端口并连接到 2222 上的服务器),或者您可以省略 TCP-LISTEN 部分,而是将整个过程作为 from 运行ProxyCommandssh然后您可以将其进入你的.ssh/config并使用 ssh 就好像没有隧道一样)。

如果您想要的隧道不仅仅是 SSH 连接,请注意,socat还可以TUN:选择为您提供完整的隧道接口,这样您就可以轻松地将其转变为真正的 VPN。

相关内容