67549


下記のようにsshのポート転送を利用し、clientからsever_1（踏み台）経由でsever_2とTCPでの接続をする場合の  
sever_1とsever_2のやり取りの部分がいまいちわかりません。

clientとsever_1の間でsshでの接続を確立し、それを利用してsever_1にTCP接続する。  
そのあと、sever_1からsever_2にTCP接続されると思いますが、sever_1はどのようにしてsever_2に接続しているのでしょうか。sever_1からsever_2に対してのTCP接続を詳しく解説していただける方がいらっしゃれば、どうぞよろしくお願いします。

sever_1からsever_2にリクエストをリレーする部分の挙動がわかりません。

[code]

    client <->  sever_1 <-> sever_2
    
    
[/code]


CC BY-SA 4.0
2020-06-10T22:59:48.333
67517
2020-06-11T14:17:57.787
34792
question
ssh
ssh ポート転送機能がわかりません


まず、クライアントからsever_1にSSHで接続し、シェルを操作できるようにしますよね？  
そこから、sever_2にSSHで接続すればいいのです


CC BY-SA 4.0
2020-06-11T01:18:40.147
67521
2020-06-11T01:18:40.147
27481
67517
answer


ポート転送 (ポートフォワーディング) を利用する際は、`ssh` コマンドを実行時に接続先として踏み台サーバと共に "最終的な接続先"
もオプションで指定するので、この情報を元に踏み台サーバが良しなに処理してくれる…という説明で伝わりますか？

**実行例:**

[code]

    $ ssh -L 22:server2:80 server1
    
[/code]


CC BY-SA 4.0
2020-06-11T05:00:26.720
67527
2020-06-11T05:00:26.720
3060
67517
answer


SSHのポート転送で、sever_1経由でsever_2へSSH接続する方法です。

[code]

    ssh ユーザ名@sever_2 -L 適当なポート:ユーザ名@sever_1:22
    
[/code]

SSHのポート転送ではありませんが、sever_1経由でsever_2へSSH接続する別の方法です。

[code]

    ssh -o ProxyCommand='ssh ユーザ名@sever_1 -W %h:%p' ユーザ名@sever_2
    
[/code]

以下の環境で試してみました。PW認証です。  
ローカル：WSL(ubuntu)  
sever_1：CENTOS8  
sever_2：CENTOS8


CC BY-SA 4.0
2020-06-11T05:42:11.033
67531
2020-06-11T05:48:17.567
2020-06-11T05:48:17.567
35558
35558
67517
answer


手順、コマンドではなく、通信の流れを知りたいということでしょうか？

例えば、HTTP (暗号化なし) を `LocalForward` することを考えます。  
client から server_1 に `-L 8080:server_2:80` とした場合、client - server_1
間の暗号化接続が確立します。  
(client の ssh プロセス、server_1 の sshd プロセスが起動)

[code]

        [client]$ ssh -f -N -L 8080:server_2:80 server_1
    
    client(ssh) ======(暗号化)======> server_1(sshd)
    
[/code]

client から 127.0.0.1:8080 へアクセスすると、LocalForward で起動済みの server_1 の sshd から新たに
server_2 の 80 番ポートへ新規接続し、client からのパケットが転送されます。

client - server_1 間は暗号化された経路(トンネル)を通ります。  
server_1 - server_2 間は暗号化されません。

[code]

        [client]$ curl http://127.0.0.1:8080/
    
    client(ssh) ======(暗号化)======> server_1(sshd)
    curl ---(HTTP/暗号化トンネル)--->                --(HTTP)--> server_2(httpd):80
    
[/code]

HTTP 通信の終端は client(curl) と server_2(httpd) で、server_1 は TCP パケットを中継しているだけです。  
server_2 から見ると、接続元は server_1 となり、server_1 の sshd はプロキシのように振る舞うとも言えます。

ちなみに、SSH を LocalForward すると、client - server_1 間は二重に暗号化されます。

[code]

        [client]$ ssh -f -N -L 10022:server_2:22 server_1
        [client]$ ssh -p 10022 user@127.0.0.1
    
    client(ssh) ======(暗号化)======> server_1(sshd)
    ssh ----(SSH/暗号化トンネル)---->                --(SSH)---> server_2(sshd):22
    
[/code]


CC BY-SA 4.0
2020-06-11T13:15:47.820
67549
2020-06-11T14:17:57.787
2020-06-11T14:17:57.787
4603
4603
67517
answer