web-dev-qa-db-ja.com

SSHトンネル経由でサーバーのIPを使用する

私のセットアップはUbuntuラップトップとUbuntuサーバーです。

ローカルのラップトップに、特定のWebサービスにアクセスする必要のあるプログラムがあります(それを http://someserver.com/someservice12 と呼びましょう)。現在、このサービスには、サーバーのIPからのアクセスのみを許可するファイアウォールがあります。

ラップトップとサーバーの間で使用できるSSHトンネルのタイプはありますか?ラップトップのpythonスクリプトがリクエストを送信するときに http://someserver.com/someservice12 そのサービスは私のサーバーのIPからのリクエストを認識しますか?

私はそれが次のように見えることを知っています:

ssh -N -R 80:localhost:80 user@myserver

しかし、正確にはわかりません。

4
user143278

必要なのは、逆トンネルではなく通常のトンネルです。

ssh -L 80:someserver.com:80 user@myserver

これにより、ラップトップ(localhost)のポート80にリスニングソケットが作成され、myserverのSSHサーバーを介してsomeserver.comにアクセスします。

私は通常、トンネルをオプション-CfNと組み合わせます。-Cは圧縮を有効にし(少しスピードアップします)、-fは認証が完了するとSSHをバックグラウンドに送信します(したがって、必要に応じてパスワードを入力する機会があります) 、-Nは、SSHサーバーでコマンドが実行されないようにします(サーバーにコマンドを送信するために使用できると仮定してSSHをバックグラウンドで実行することは実際には安全ではありません。少し健全なパラノイア/良い習慣です)。

ラップトップとmyserverの間に非常に安全な接続を確立する必要がない場合は、暗号を-cblowfishを使用したblowfishやarcfour128(さらに高速)などの高速なものに変更することもできます。

だから私が使うのはこれです:

ssh -CfNc arcfour128 -L 80:someserver.com:80 user@myserver

これにより、サーバーに開いているコマンドプロンプトを残す代わりに、バックグラウンドに直接入る、すてきで高速なトンネルが得られます。

バックグラウンドに送信する場合、トンネルを解除するときは、最初にps -ef | grep sshのような操作を実行してプロセスIDを見つけ、正しいプロセスIDを強制終了する必要があることに注意してください。

6

Sshが提供するSOCKSプロキシを使用できます。経由で接続

ssh -D 9999 user@myserver

次に、このSOCKSプロキシをpythonスクリプトで使用できます。 rllib2でSOCKS 4/5プロキシを使用するにはどうすればよいですか

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9999)
socket.socket = socks.socksocket

(このコードをスクリプトの先頭に配置します)

1
Uwe L. Korn

私の提案は、以下を使用することです。

ssh -L 8080:localhost:80 user @ server

このように、プログラムを_http://localhost:8080/_に接続することにより、ポート80が特権ポートであることに反することはありません。また、圧縮には_-C_、バックグラウンドには_-f_、端末を開かない場合は_-N_のオプションを使用します。
したがって、_ssh -CfN -L 8080:localhost:80 user@server_は


コメントのフォローアップとして、 tutorialspoint.com から引用させてください。

単純なクライアント:

_import socket               # Import socket module
s = socket.socket()         # Create a socket object
Host = socket.gethostname() # Get local machine name
port = 8080                # Reserve a port for your service.
s.connect((Host, port))
s.close
_

Pythonのネットワーク接続手段を使用しているので、コードにconnect()ステートメントがあると想定しています。

(詳細については、リンクをたどってください。);-)

0
Rainbow Code