隐藏防火墙的 ssh 流量

隐藏防火墙的 ssh 流量

是否有可能以某种方式(最好是轻松的方式)隐藏 ssh 流量,使其不被包检查防火墙发现。我考虑过将 ssh 会话嵌入到看似无害的 TLS 会话中。我发现使用 socat 应该可以做到这一点,但我不知道如何运行它。我在 ssh 客户端和服务器上拥有完全的管理员访问权限,但用户空间中的解决方案当然是最好的 :-)

如果有人知道socat,以下是我尝试过的方法(但我也对其他解决方案感到好奇):

服务器:

socat OPENSSL-LISTEN:10000,fork,cipher=aNULL,verify=0 TCP-CONNECT:localhost:22

客户:

ssh -o ProxyCommand='socat STDIO OPENSSL-CONNECT:%h:10000,cipher=aNULL,verify=0' theserver

服务器日志:

socat[27898] E SSL_accept(): Success
socat[27897] E exiting on signal 11

客户端日志:

socat[15953] E SSL_connect(): error:141640B5:SSL routines:tls_construct_client_hello:no ciphers available
ssh_exchange_identification: Connection closed by remote host

根据手册页,aNull 不应该引发此错误。

更新:感谢 Grawity,隧道现已成功建立。之后,我很难发现来自本地主机的连接被阻止(在 /etc/hosts.allow 中设置)。但现在它工作正常。谢谢。

答案1

是的,这是很常见的做法。(尽管在服务器端,stunnel 更为常见。)

但你的主要问题是cipher=aNULL,最近的 TLS 库可能不接受它。(更不用说,防火墙和 IDS 可能会认为这样的连接非常不寻常且可疑。)

而是使用带有自签名证书的常规证书认证 TLS:

openssl req -new -subj "/CN=ponies" -days 365 -extensions v3_req -x509 \
            -out tunnel.crt -newkey rsa:2048 -keyout tunnel.key -nodes

socat OPENSSL-LISTEN:10000,fork,cert=tunnel.crt,key=tunnel.key,verify=0 ...

(这只需要在服务器端完成;客户端默认是未经身份验证的。)

相关内容