sshポートフォワーディングの使い方

最新版は以下に記載しました。
https://hana-shin.hatenablog.com/entry/2022/04/13/223216

#1 sshポートフォワードとは?
あるポートで受け取った通信を別のポートに転送する処理のことです。
ポートフォワードを使うことで、暗号化機能を備えていないアプリケーションの通信を
sshが間に入って中継することで、暗号化を行うことができます。

#2 環境
VMware Workstation 14 Player上の仮想マシン(2台)を使いました。
client,serverはホスト名です。

```console:ネットワーク構成
                     192.168.3.0/24
      .50                                  .20
client ------------------------------------- server 
````

hostsファイルの内容は、サーバ、クライアントともに以下のとおりです。

```console:hostsファイル
[root@server ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.3.50 client
192.168.3.20 server
```


仮想マシンのOS版数は、サーバ、クライアントともに以下のとおりです。

```console:OS版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

[root@server ~]# uname -r
3.10.0-693.el7.x86_64
```

sshの版数は以下のとおりです。

```console:sshの版数
[root@server ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
```


#3 ローカルからリモートへのポートフォワーディング(-L)
ここでは、ncコマンドを使って、ポートフォワーディングを試してみます。
なお、ここで使用するコマンドは、下記を参照してください。
nc：[ここ(ncコマンドの使い方)](https://qiita.com/hana_shin/items/97e6c03ac5e5ed67ce38)を参照してください。
lsof：[ここ(lsofコマンドの使い方)](https://qiita.com/hana_shin/items/cdc58fe8f4f7705c7a8a)を参照してください。
tcpdump：[ここ(tcpdumpの使い方)](https://qiita.com/hana_shin/items/385182b05db96ef4e205)を参照してください。

##3.1 接続手順
サーバ(nc)は、11111番ポートでListenします。

```console:サーバ側
[root@server ~]# nc -4 -kl 11111
```

クライアントの22222番ポートへの接続をサーバの11111番ポートに転送します。

```console:クライアント側
[root@client ~]# ssh -L 22222:server:11111 server
root@server's password:
Last login: Mon Nov 26 18:43:58 2018 from 192.168.3.50
[root@server ~]#
```

ncコマンドを実行します。このとき、ローカルホストの22222番ポートに接続します。
22222番ポートに接続できたら、"12345"と入力します。

```console:クライアント側
[root@client ~]# nc -4 localhost 22222
12345
```

クライアントで入力した文字列が表示されることがわかります。

```console:サーバ側
[root@server ~]# nc -4 -kl 11111
12345
```


##3.2 ポートフォワーディング中の状態
ポートフォワーディング中のプロセス、およびプロセスが使用しているポート番号を確認してみます。


```console:クライアント側
ncプロセスが使用しているポート番号を確認してみます。
44360番ポートから22222番ポートにTCPコネクションを確立していることがわかります。
[root@client ~]# lsof -i4 -a -c nc -Pn
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1629 root    3u  IPv4  44039      0t0  TCP 127.0.0.1:44360->127.0.0.1:22222 (ESTABLISHED)

sshが22222番ポートでListenしています。
ncプロセスが22222番ポートに対して接続してきたため、子プロセスを生成しています。
そして、その子プロセスがncプロセスと44360番ポートを使ってTCPコネクションを確立しています。
[root@client ~]# lsof -i4 -a -i:22222 -Pn
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     1530 root    5u  IPv4  22983      0t0  TCP 127.0.0.1:22222 (LISTEN)
ssh     1530 root    9u  IPv4  44040      0t0  TCP 127.0.0.1:22222->127.0.0.1:44360 (ESTABLISHED)
nc      1629 root    3u  IPv4  44039      0t0  TCP 127.0.0.1:44360->127.0.0.1:22222 (ESTABLISHED)

次に、sshプロセスが使用しているポート番号を確認してみます。
sshは、サーバのsshdプロセス(22番ポート)とTCPコネクションを確立していることがわかります。
[root@client ~]# lsof -i4 -a -p 1530 -Pn
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     1530 root    3u  IPv4  41190      0t0  TCP 192.168.3.50:42590->192.168.3.20:22 (ESTABLISHED) ★サーバとTCPコネクション確立
ssh     1530 root    5u  IPv4  22983      0t0  TCP 127.0.0.1:22222 (LISTEN)
ssh     1530 root    9u  IPv4  44040      0t0  TCP 127.0.0.1:22222->127.0.0.1:44360 (ESTABLISHED)
```

次にサーバ側の状況を確認してみます。

```console:サーバ側
22番ポートを使用しているプロセスを確認してみます。
sshdがListenしています。
また、クライアントのsshプロセスとTCPコネクションを確立していることもわかります(★)。
[root@server ~]# lsof -i4 -a -i:22 -Pn
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     1094 root    3u  IPv4  20017      0t0  TCP *:22 (LISTEN)
sshd     1185 root    3u  IPv4  20139      0t0  TCP 192.168.3.20:22->192.168.3.3:58700 (ESTABLISHED)
sshd     1301 root    3u  IPv4  27152      0t0  TCP 192.168.3.20:22->192.168.3.3:59630 (ESTABLISHED)
sshd    10035 root    3u  IPv4  49788      0t0  TCP 192.168.3.20:22->192.168.3.50:42590 (ESTABLISHED) ★クライアントとTCPコネクション確立

[root@server ~]# lsof -i4 -a -c sshd -Pn
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     1094 root    3u  IPv4  20017      0t0  TCP *:22 (LISTEN)
sshd     1185 root    3u  IPv4  20139      0t0  TCP 192.168.3.20:22->192.168.3.3:58700 (ESTABLISHED)
sshd     1301 root    3u  IPv4  27152      0t0  TCP 192.168.3.20:22->192.168.3.3:59630 (ESTABLISHED)
sshd    10035 root    3u  IPv4  49788      0t0  TCP 192.168.3.20:22->192.168.3.50:42590 (ESTABLISHED)
sshd    10035 root    9u  IPv4  52648      0t0  TCP 192.168.3.20:33236->192.168.3.20:11111 (ESTABLISHED)

[root@server ~]# lsof -i4 -a -c nc -Pn
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      11443 root    3u  IPv4  52647      0t0  TCP *:11111 (LISTEN)
nc      11443 root    4u  IPv4  52649      0t0  TCP 192.168.3.20:11111->192.168.3.20:33236 (ESTABLISHED)
```


上記コマンドの実行結果をまとめたものが、以下の図になります。
図中の`()`内はポート番号を表します。
なお、サーバ側のsshdとncはeth0を介してTCPコネクションを確立しています。

```
               client                                                 server
+-----------------------------------------+    +-----------------------------------------+
|                                         |    |                                         |
|     nc                     ssh          |    |        sshd                     nc      |
| +---------+       +------------------+  |    |  +------------------+       +---------+ |
| |         |       |                  |  |    |  |                  |       |         | |
| | (44360) |       | (22222)  (42590) |  |    |  | (22)     (33236) |       | (11111) | |
| +---------+       +------------------+  |    |  +------------------+       +---------+ |
|   A  |                 |        |       |    |     |          |                |       |
|   |  |                 |        |       |    |     |          |                |       |
|   |  |                 |        |       |    |     |          |                |       |
|   |  +--- localhost ---+        |       |    |     | +--------+                |       |
|   |      (127.0.0.1)            |       |    |     | |+------------------------+       |
|   |                             |       |    |     | ||                                |
|   |                             |       |    |     | ||                                |
+---|-------------------------- (eth0) ---+    +-- (eth0) -------------------------------+
    |                        .50  |                  |  .20
    |                             |                  |
    V                             +------------------+
   端末                               192.168.3.0/24
```


##3.3 送信データの確認

ポートフォワーディング未使用のときの様子をtcpdumpで確認しました。
クライアントで入力した文字列("111...111")が暗号化されていないことがわかります。
1はASCIIコードで0x31です。

```console:ポートフォワーディング未使用
[root@client ~]# nc -4 server 11111
1111111111111111111111111111111111111111

[root@client ~]# tcpdump -i eth0 src host 192.168.3.50 and dst port 11111  -xx -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:16:20.851817 IP 192.168.3.50.43830 > 192.168.3.20.vce: Flags [P.], seq 4027181075:4027181116, ack 742887201, win 229, options [nop,nop,TS val 18385250 ecr 22291092], length 41
        0x0000:  000c 29f0 6ea2 000c 29a8 bf66 0800 4500
        0x0010:  005d a9f3 4000 4006 0911 c0a8 0332 c0a8
        0x0020:  0314 ab36 2b67 f009 e813 2c47 8f21 8018
        0x0030:  00e5 87e6 0000 0101 080a 0118 8962 0154
        0x0040:  2294 3131 3131 3131 3131 3131 3131 3131
        0x0050:  3131 3131 3131 3131 3131 3131 3131 3131
        0x0060:  3131 3131 3131 3131 3131 0a
```

次に、ポートフォワーディング実行中の様子をtcpdumpで確認しました。
クライアントで入力した文字列("111...111")は暗号化されていることがわかります。

```console:ポートフォワーディング中
[root@client ~]# nc -4 localhost 22222
1111111111111111111111111111111111111111

[root@client ~]# tcpdump -i eth0 src host 192.168.3.50 and dst port 22  -xx -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:15:06.715595 IP 192.168.3.50.42590 > 192.168.3.20.ssh: Flags [P.], seq 1298744280:1298744356, ack 3531145080, win 674, options [nop,nop,TS val 18311114 ecr 22202580], length 76
        0x0000:  000c 29f0 6ea2 000c 29a8 bf66 0800 4510
        0x0010:  0080 1b14 4000 4006 97bd c0a8 0332 c0a8
        0x0020:  0314 a65e 0016 4d69 43d8 d278 ff78 8018
        0x0030:  02a2 8809 0000 0101 080a 0117 67ca 0152
        0x0040:  c8d4 9f7c 5af3 d006 5360 7ed4 e4b6 1885
        0x0050:  639c 76b1 3113 52c8 c0f2 c0a6 961f 4bd8
        0x0060:  f7e0 d620 a04c 6b91 c4fd d069 9675 b2e1
        0x0070:  5865 6d3b fd3f 2010 b68c 4a03 6d2f b660
        0x0080:  9288 f7cd e025 6b19 7fc9 e1ce e04e
```


#4 ローカルからリモートへのポートフォワーディング(-R)




#Z 参考情報
[Linux教科書 LPICレベル2 スピードマスター問題集 Version4.5対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB2-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version4-5%E5%AF%BE%E5%BF%9C-%E6%9C%89%E9%99%90%E4%BC%9A%E7%A4%BE%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3/dp/4798151238/ref=sr_1_2?s=books&ie=UTF8&qid=1543219660&sr=1-2&keywords=lpic+2)
[21.7. ssh ポートフォワード機能の活用](https://www.turbolinux.co.jp/products/server/11s/user_guide/x9016.html)
[SSHポートフォワーディング（トンネリング）とは](http://www.koikikukan.com/archives/2016/09/15-000300.php)
[SSHポートフォワード（SSHトンネル）【ローカル・リモート・ダイナミック総集編】](https://www2.filewo.net/wordpress/2014/08/05/ssh%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89%EF%BC%88ssh%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%EF%BC%89%E3%80%90%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%BB%E3%83%AA/)
[SSH ポートフォワーディング](http://www14.plala.or.jp/campus-note/vine_linux/server_ssh/ssh_portforwarding.html)
[
“Jump in” with ssh and netcat](https://backreference.org/2010/02/26/jump-in-with-ssh-and-netcat/)