スポンサード リンク
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 !