【Python】sshtunnelをインストールしてSSHトンネルを実現

【Python】sshtunnelをインストールしてSSHトンネルを実現 プログラミング

「PythonでSSHポートフォワーディングを行いたい」
「Pythonで多段SSHを行いたい」

このような場合には、Pythonライブラリのsshtunnelを利用します。
sshtunnelを使えば、PythonでSSHトンネルを実現できます。

本記事の内容

  • sshtunnelとは?
  • sshtunnelのシステム要件
  • sshtunnelのインストール
  • sshtunnelの動作確認

それでは、上記に沿って解説していきます。

sshtunnelとは?

sshtunnelとは、PythonでSSHトンネルを実現するためのライブラリです。
ここでは、SSHトンネルという用語は次の機能を意味します。

  • SSHポートフォワーディング
  • 多段SSH(踏み台サーバー経由)

そして、sshtunnelには次の二つの利用方法があります。

  • CLI(コマンドラインツール)
  • API

CLIに関しては、それほど意味を感じません。
CLIで使うなら、普通にSSHコマンドを利用すればいいだけです。

それよりも、ここではAPIとしての利用方法に着目します。
sshtunnelをAPIとして用いれば、SSHトンネルがPythonで可能となります。

SSHトンネルがPythonで可能になれば、SSHコマンドを利用する必要がありません。
つまり、Python単体で処理が完結するのです。

システムにおける登場人物が少ないのは、それだけで正義です。
トラブル時の原因追及が、圧倒的にやりやすくなります。

もちろん、システム移行の際にもそれだけ手間が減ります。
Pythonのスクリプトを設置するだけで済むなら、そんないいことはありません。

このようなことが、sshtunnelを使えば可能になります。

以上、sshtunnelについての説明でした。
次は、sshtunnelのシステム要件を確認します。

sshtunnelのシステム要件

現時点(2021年9月末)でのsshtunnelの最新バージョンは、0.4.0となります。
この最新バージョンは、2021年1月11日にリリースされています。

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

そして、サポート対象となるPythonのバージョンは以下。

  • Python 2.7
  • Python 3.4
  • Python 3.5
  • Python 3.6
  • Python 3.7
  • Python 3.8

以下は、Pythonの公式開発サイクルとなります。

バージョンリリース日サポート期限
3.62016年12月23日2021年12月
3.72018年6月27日2023年6月
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月

開発サイクルと比較すると、sshtunnelは頑張り過ぎかもしれません。
もう、次の3つはサポートを切り捨ててもよいはずです。

  • Python 2.7
  • Python 3.4
  • Python 3.5

ライブラリによっては、Python 3.6のサポートを打ち切っているモノもあります。
このような状況から、sshtunnelの開発者が頑張り過ぎと表現しています。

なお、Python 3.9がサポート対象に入っていませんが、問題ありません。
私は、下記のPythonで検証しています。

>python -V 
Python 3.9.7

一般的にPython 3.6で動けば、それ以降のバージョンでも問題なく動くはずです。
ちなみに、Python 3.9.7へのアップグレードは次の記事で解説しています。

以上、sshtunnelのシステム要件についての説明でした。
次は、sshtunnelをインストールします。

sshtunnelのインストール

まずは、現状のインストール済みパッケージを確認しておきます。

>pip list 
Package    Version 
---------- ------- 
pip        21.2.4 
setuptools 58.1.0

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、sshtunnelのインストールです。
sshtunnelのインストールは、以下のコマンドとなります。

pip install sshtunnel

インストールは、すぐに終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。

>pip list 
Package      Version 
------------ ------- 
bcrypt       3.2.0 
cffi         1.14.6 
cryptography 3.4.8 
paramiko     2.7.2 
pip          21.2.4 
pycparser    2.20 
PyNaCl       1.4.0 
setuptools   58.1.0 
six          1.16.0 
sshtunnel    0.4.0

SSH関係のパッケージが、インストールされている印象です。
関連記事は、以下。

以上、sshtunnelのインストールについて説明しました。
最後は、sshtunnelの動作確認を行います。

sshtunnelの動作確認

sshtunnelを用いて、SSHポートフォワーディングを行います。
SSHポートフォワーディングについては、次の記事で説明しています。

上記の記事では、DB接続を行っています。
ここでは、Webサーバーにアクセスしましょう。

前提条件として、SSHでアクセス(パスワード認証)できるWebサーバーが必要です。
Webサーバーのインストールが必要な場合は、次の記事が参考になります。

準備ができたら、次のプログラムをtest.pyに保存します。
もちろん、各自の環境に合わせてIPなどを設定する必要があります。

下記プログラムにより、リモートマシンの80番ポートをローカルマシンの9999番ポートに転送します。
Webサーバーが80番ポートで動くことは前提です。
そうじゃないなら、「80」を変更してください。

from sshtunnel import SSHTunnelForwarder 
from time import sleep 
REMOTE_SERVER_IP = "リモートマシンのIP" 
REMOTE_SSH_USERNAME = "リモートマシンのSSHアカウントユーザーID"
REMOTE_SSH_PASSWORD = "リモートマシンのSSHアカウントパスワード" 
server = SSHTunnelForwarder( 
    REMOTE_SERVER_IP, 
    local_bind_address=('localhost', 9999), 
    ssh_username=REMOTE_SSH_USERNAME, 
    ssh_password=REMOTE_SSH_PASSWORD, 
    remote_bind_address=('127.0.0.1', 80) 
) 
server.start() 
# ローカルマシンの開放したポートを表示 
print(server.local_bind_port) 
try: 
    while True: 
        sleep(1) 
except KeyboardInterrupt: 
    server.stop() 
    print('STOP')

REMOTE_SERVER_IPに設定したIPアドレスにブラウザでアクセスします。

index.htmlが上記のように表示されます。
ここまでは、別に何と言うことはありません。
当たり前のことです。

では、次に「http://localhost:9999」にアクセスしてみましょう。

もちろん、こうなりますよね。
※ローカルマシンでWebサーバーをポート9999番で公開している場合は除きます

では、ここで次のようにtest.pyを実行しましょう。

python test.py

実行すると、「9999」と表示されます。
もしエラーが出るなら、SSHアカウントの情報を見直しましょう。

「9999」と表示された場合は、再度ブラウザで「http://localhost:9999」にアクセスします。
そうすると、次の画面が表示されます。

見事にローカルマシンの9999番ポートでリモートマシンの80番ポートにアクセスできています。
なお、SSHポートフォワーディングを終了するにはtest.pyを「Ctrl + C」で強制終了します。

>python test.py 
9999 
STOP

「STOP」と表示されたら、もう「http://localhost:9999」にはアクセスできません。

以上、sshtunnelの動作確認を説明しました。

タイトルとURLをコピーしました