pythonでsshtunnelする

creation date 2016/11/21 23:56 last date modified 2016/11/22 00:51 | category: | tags: Python
スポンサード リンク

SSHトンネリングは便利。便利すぎてpythonから制御したくなることもある。 ということで今回はpythonの sshtunnel パッケージを使ってみた。

インストール

$ sudo apt install python3-openssl libssl-dev
$ sudo pip3 install sshtunnel

テスト環境構築

DockerでプライベートネットワークにWebサーバを立てる。 同時にユーザpiyo,パスワードeggでsshにログインできるようにする。

$ docker run --rm -it ubuntu:14.04 /bin/bash
$ apt update
$ apt install -y nginx openssh-server
$ service nginx start
$ service ssh start

$ useradd piyo
$ echo piyo:egg | chpasswd

テストコード1: Webサーバのトンネリング

次のコードを tunnel.py として保存する。 ただし, 172.17.0.3 はDockerコンテナのIPアドレスだ。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    ('172.17.0.3',22),
    ssh_username="piyo",
    ssh_password="egg",
    remote_bind_address=('127.0.0.1', 80),
    local_bind_address=('0.0.0.0', 80)
)

server.start()

実行してアクセスしてみる。 nginxのWelcomeページが帰ってくるはずだ。

$ python3 tunnel.py
$ curl localhost:80

テストコード2:多段接続

次はssh proxyを使って多段接続する。 接続環境は以下を想定する。

localhost -> container2 -> container1
             172.17.0.2  172.17.0.3
              hoge:huga   piyo:egg

次のコードを実行する。 localhost:80 でnginxのWelcomeページが帰ってくる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sshtunnel import SSHTunnelForwarder
import paramiko

server = SSHTunnelForwarder(
    ('172.17.0.3',22),
    ssh_username="piyo",
    ssh_password="egg",
    remote_bind_address=('127.0.0.1', 80),
    local_bind_address=('0.0.0.0', 80),
    ssh_proxy_enabled=True,
    ssh_proxy=paramiko.ProxyCommand("sshpass -p 'huga' ssh -o StrictHostKeyChecking=no hoge@172.17.0.2 nc 172.17.0.3 22")
)

server.start()

Comments !

social