リモート ボックスで開発を行う必要があります。幸い、シェル アクセスはありますが、AllowTcpForwarding が false に設定されているゲートウェイを通過する必要があります。
ドキュメントをちょっと見てみたところ、次のように書いてありました。
AllowTcpForwarding TCP 転送を許可するかどうかを指定します。デフォルトは「はい」です。TCP 転送を無効にしても、ユーザーがシェル アクセスも拒否されない限り、セキュリティは向上しません。ユーザーはいつでも独自の転送プログラムをインストールできるためです。
独自のフォワーダーをインストール(または構築)するにはどうすればいいでしょうか?ここでの私の目標は、Pycharm を使用したリモート通訳SSH 経由でローカル ポートにバインドし、そのデータを SSH 経由で送信し、ゲートウェイ経由で、コードが実際に実行される開発ボックスに送信します。この作業には、nc やその他の UNIX ユーティリティを何らかの方法で利用できると思います。
次のようにすればリモートボックスに ssh できることがわかります。
ssh -t user1@gateway ssh user2@devbox
しかし、明らかにこのオプションはpycharmでは利用できません。ローカルポートを開いて、
ssh -p 12345 localhost
(or variant)
user2@devbox に接続します。これにより、リモート インタープリターがポートを使用してリモート ボックスに接続するように構成できるようになり12345
ますlocalhost
。
答え1
実行できる限りsocat
ローカルで およびgateway
(または および のみbash
、cat
最後gateway
の例を参照)であり、ないpty を使用して 8 ビット クリーンにすると、ssh 経由でトンネルを確立できます。次の 4 つの例は、前の例を改良したものです。
一度だけ動作する基本的な例
(フォークすると、トンネルごとに 1 つの ssh 接続が必要になるため、好ましくありません)。socat が:
exec コマンドを受け入れるようにエスケープする必要があります。
- 用語1:
$ socat tcp-listen:12345,reuseaddr exec:'ssh user1@gateway exec socat - tcp\:devbox\:22',nofork
- 用語2:
$ ssh -p 12345 user2@localhost
- 用語1:
user1@gateway's password:
- 用語2:
user2@localhost's password:
1番目と2番目のアドレスを逆にするとソケットがすぐに使用可能になる
socat
責任を負い続けなければならないので、いいえnofork
:
- 用語1:
$ socat exec:'ssh user1@gateway exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr user1@gateway's password:
- 用語2:
$ ssh -p 12345 user2@localhost user2@localhost's password:
を使ってControlMaster
ssh
ゲートウェイへの単一の SSH 接続のみを使用してフォークできるため、通常のポート転送と同様の動作が実現します。
- 用語1:
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway user1@gateway's password:
- 用語2:
$ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket user1@gateway exec socat - tcp\:devbox\:22'
- 用語3:
$ ssh -p 12345 user2@localhost user2@localhost's password:
のみbash
でcat
利用可能gateway
使用することでbash
の組み込みTCPリダイレクト、および 2 つの半二重cat
コマンド (全二重の結果用) では、リモートまたはさえ必要ありませんsocat
。netcat
ネストされエスケープされた引用符の複数のレイヤーの処理は少し扱いにくいため、リモート スクリプトを使用することで、より適切に実行したり、簡素化したりできます。出力のみにbash
分岐するように注意する必要があります。cat
- 用語1(変更なし):
$ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway user1@gateway's password:
- 用語2:
$ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket user1@gateway '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
- 用語3:
$ ssh -p 12345 user2@localhost user2@localhost's password:
答え2
ProxyJump を Bash に置き換える
上記のアイデアは良いですね!これが私の一般的なssh_configバージョンです。プロキシジャンプ動かないなぜならTCP転送を許可するno に設定されており、デフォルトのシェルは BASH です。
ProxyCommand=ssh -T user1@gateway "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
- -T擬似端末割り当てを無効にする
- 実行者新しいプロセス(bash)は作成されません
- 3<>利用可能なファイル記述子へのリダイレクトです
- /dev/tcp/...bash に対応する TCP ソケットを開くように要求します。
- %hそして%pOpenSSHクライアントによって次のように評価されます開発ボックスそして22
- 2<&-STDERRを閉じます(/dev/nullにリダイレクトすることもできます)
- 猫 <&3 &選択されたファイル記述子3をバックグラウンドで読み取ります
- 猫 >&3フォアグラウンドでファイル記述子を書き込む
- $を殺せ!「読書」を殺すだろう猫 <&3接続を閉じたり切断したりするときに、コマンドはバックグラウンドで実行されます。そうでない場合は、コマンドは実行され続けます。
ジャンプ サーバーで ProxyJump が無効になっている場合に ProxyJump を置き換えることはできますが、追加の暗号化レベルなしでそこに秘密鍵を転送したり、パスワードを入力したりすることは本当にしたくありませんでした。他の SSH_AUTH_SOCK をルートとして使用したり、キーストロークでターミナル セッションを完全に記録したりすることは、どちらも実際に可能です。
ただし、自分に適用されるポリシーに違反しないように常に注意してください。
答え3
ああ、Netcat を忘れるところでした!
ジャンプ ホストに Netcat (任意のバージョン) がある場合は、通常、次のように設定で ProxyJump の代わりに Netcat を使用できます。
ProxyCommand=ssh -T user1@gateway "exec nc %h %p"
またはコマンドラインから:
ssh user2@devbox -oProxyCommand="ssh -T user1@gateway 'exec nc devbox 22'"
答え4
別のポートで実行するために別の sshd を設定するだけです。
設定を編集して、tcpforwarding が許可されるようにします。
cp /etc/ssh/sshd{,-second}_config
sshd-second_configを編集する
Port 22220
cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshd-second.service
/etc/systemd/system/sshd-second.service を次のように変更します。
Description=OpenSSH server second instance daemon
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
ExecStart 行はリリースによって異なる場合があります。
systemctl daemon-reload
systemctl enable sshd-second.service --now
詳細は以下をご覧ください:
https://access.redhat.com/solutions/1166283
これで、必要なものを何でも転送できるはずです。