最新版は以下に記載しました。
https://hana-shin.hatenablog.com/entry/2022/04/13/223216
#1 sshポートフォワードとは?
あるポートで受け取った通信を別のポートに転送する処理のことです。
ポートフォワードを使うことで、暗号化機能を備えていないアプリケーションの通信を
sshが間に入って中継することで、暗号化を行うことができます。
#2 環境
VMware Workstation 14 Player上の仮想マシン(2台)を使いました。
client,serverはホスト名です。
192.168.3.0/24
.50 .20
client ------------------------------------- server
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版数は、サーバ、クライアントともに以下のとおりです。
[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の版数は以下のとおりです。
[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