web-dev-qa-db-ja.com

ファイアウォールから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

clientlog:

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
The Omitter

はい、これは一般的に行われます。 (サーバー側では、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 ...

(これはサーバー側でのみ実行する必要があります。クライアントはデフォルトで認証されていません。)

2
user1686