Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?
@hana_shin

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

More than 1 year has passed since last update.

1 sshポートフォワードとは?

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

2 環境

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

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

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

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版数は、サーバ、クライアントともに以下のとおりです。

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の版数は以下のとおりです。

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

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

ここでは、ncコマンドを使って、ポートフォワーディングを試してみます。
なお、ここで使用するコマンドは、下記を参照してください。
nc:ここ(ncコマンドの使い方)を参照してください。
lsof:ここ(lsofコマンドの使い方)を参照してください。
tcpdump:ここ(tcpdumpの使い方)を参照してください。

3.1 接続手順

サーバ(nc)は、11111番ポートでListenします。

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

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

クライアント側
[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"と入力します。

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

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

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

3.2 ポートフォワーディング中の状態

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

クライアント側
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)

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

サーバ側
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です。

ポートフォワーディング未使用
[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")は暗号化されていることがわかります。

ポートフォワーディング中
[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対応
21.7. ssh ポートフォワード機能の活用
SSHポートフォワーディング(トンネリング)とは
SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】
SSH ポートフォワーディング

“Jump in” with ssh and netcat

16
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定でしたが、コロナ終息しないので断念。2021はぜひ行きたい!。取得済資格:ネットワークスペシャリスト、オンライン情報処理技術者。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
16
Help us understand the problem. What is going on with this article?