这听起来很愚蠢,但听我说完(尽管可能仍然如此)。
我是一名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
。但我不能。
笔记
- 我不考虑像这样混淆代理,
obfsproxy
因为这应该很容易。不想使用重型武器。 - ROT13 只是用来绕过防火墙的。我知道它很弱。
- 这是一个“嗯……我可以这样做吗?”的问题。不是“我应该这样做吗?”
答案1
socat
应该做。
这socat
该工具可以满足您在任何地方(双向)传输任何内容的所有需求。它只需要一对参数,每个参数指定要连接在一起的一个事物。在这种情况下,最有趣的选项是TCP:host:port
,TCP-LISTEN:port
和FD:
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 运行ProxyCommand
(ssh
然后您可以将其进入你的.ssh/config
并使用 ssh 就好像没有隧道一样)。
如果您想要的隧道不仅仅是 SSH 连接,请注意,socat
还可以TUN:
选择为您提供完整的隧道接口,这样您就可以轻松地将其转变为真正的 VPN。