SSHでポートフォワーディング

## はじめに
最近SSHでポートフォワーディングを使用し、pivotingができるということを知りました。
自分の理解のために検証環境を構築し実際に確認してみたので、備忘録としてこの記事を置いておきます。

## フォーマット

### ローカルポートフォワード
```
ssh -L <local_port>:<target_ip_address>:<target_port> <username>@<remote_ip_address>
```


### リモートポートフォワード
```
ssh -R <remote_port>:<target_ip_address>:<target_port> <username>@<remote_ip_address>
```

## 検証環境
![kensho.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1901407/f806b1f9-c36f-e46d-8c57-c324705574b7.jpeg)

- local
    - ip address
        - 192.168.0.1
    - port
        - 8888
- remote
    - ip address
        - 10.10.10.10
    - port
        - 9999
- target
    - ip address
        - 10.10.10.100
    - port
        - 443
    - 接続時に判別しやすいように443でWebサーバを動作させ、下記文言を表示させます。
    ```
    <h1>This is the target machine!! IP address is <10.10.10.100>.<h1>
    ```
## 検証

### ローカルポートフォワード
192.168.0.1の8888ポートを10.10.10.100の443ポートにフォワーディングしています。

```
ubuntu@ubuntu:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:fb:27:01 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.0.1/24 brd 192.168.0.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fefb:2701/64 scope link
       valid_lft forever preferred_lft forever

ubuntu@ubuntu:~$ ssh -L 8888:10.10.10.100:443 ubuntu@10.10.10.10
```

### 結果
192.168.0.1:8888にcurlしてみると、設置した文言が返ってくることがわかります。
```
ubuntu@ubuntu:~$ curl -k https://localhost:8888
<h1>This is the target machine!! IP address is <10.10.10.100>.<h1>
```


### リモートポートフォワード
10.10.10.10の9999ポートを10.10.10.100の443ポートにフォワーディングしています。
```
ubuntu@ubuntu:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:fb:27:01 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.0.1/24 brd 192.168.0.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fefb:2701/64 scope link
       valid_lft forever preferred_lft forever
ubuntu@ubuntu:~$ ssh -R 9999:10.10.10.100:443 ubuntu@10.10.10.10
```
### 結果
10.10.10.10:9999にcurlしてみると、設置した文言が返ってくることがわかります。
```
ubuntu@ubuntu:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:54:18:20 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 10.10.10.10/24 brd 10.10.10.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe54:1820/64 scope link
       valid_lft forever preferred_lft forever
ubuntu@ubuntu:~$ curl -k  https://localhost:9999
<h1>This is the target machine!! IP address is <10.10.10.100>.<h1>
```

## まとめ
sshのローカルポートフォワードとリモートポートフォワードの違いがわからなかったので検証してみました。
- ローカルポートフォワードはssh接続元のポートからターゲットにポートフォワード
- リモートポートフォワードはssh接続先のポートからターゲットにポートフォワード