是否有可能以某种方式(最好是轻松的方式)隐藏 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 ...
(这只需要在服务器端完成;客户端默认是未经身份验证的。)