sshトンネルが正常に作成されたかどうかを確認するにはどうすればよいですか?


21

tunnel.shsshトンネルを維持するために、他の人が書いた次のスクリプトに依存しています。

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

永続的なsshトンネルを作成するには、単にを発行しtunnel.shます。トンネルは、tunnel.sh再度発行するまで閉じられません。

sshトンネルが実際に正常に作成されたかどうかを確認するにはどうすればよいのでしょうか?

トンネルの主な用途は、サーバーと同じLAN内の一部のプリンターにドキュメントを印刷することです。プリンターにはLAN内からのみアクセスできます。トンネルを作成した後、印刷では問題は報告されませんが、物理的にそこにいないため、ドキュメントが実際に印刷されたかどうかを確認できません。

トンネルのおかげで今はLANにいるので、外部IPはサーバーのIPと同じになるはずだと思いました。しかし、実際にはそれらは同じではありません(私はそれらを見つけましたwget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//')。なぜだろうか?トンネルが生きている状態でインターネット上のいくつかのWebサイトに接続するとき、サーバーは、私とサーバー間のトンネルのために、接続中のインターネットWebサイトとの中間点ではありませんか?

回答:


25

それは必要以上に複雑です:-)

トンネルを開始します。

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

トンネルを停止します。

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

あなたがする必要があるのはそれだけです。詳細が必要な場合は、以下をスキップしてください。

2番目の質問は、IPです。いいえ、IPは変更されません。リモートホストを介してSOCKSプロキシを作成するだけでした。指示がない限り、システムはこのプロキシを自動的に使用しません。

SSHの説明
トンネルを開始するための引数
-f::sshにバックグラウンド自体を伝えます。正常に起動した場合にのみバックグラウンドになり-oます(以下の引数と協力します)。
-o ExitOnForwardFailure=yes:これは、SOCKSプロキシを設定できない場合に終了するようにsshに指示します。
-N:コマンドを実行しないでください。リモートホストで何もせずに、トンネルを作成したいだけです。
-D 9999:SOCKSプロキシ。
-M:これは、-S引数がここで機能するために必要です。
-S /tmp/ssh_tunnel_%h.sock:これは、制御ソケットに/tmp/ssh_tunnel_HOSTNAME.sockを使用するように指示します。この-Mオプションは、sshがこのソケットをセットアップする必要があり、すでにソケットをリッスンしている別のsshにコマンドを発行しないことを伝えます。このソケットを使用して、sshが既に実行された後に追加のトンネルをセットアップできます。の%h ファイル名の一部としてリモートホストのホスト名を使用します。

トンネルを停止するための引数
-S /tmp/ssh_tunnel_%h.sock::これは明らかです。ただし、-Mを発行しなかったため、sshは既に存在するソケットに接続し、それ自体で何かを行うのではなく、何をすべきかを伝える必要があります。
-O exit:これはの一部です-S。ソケットでリッスンするsshに終了するように指示します。まだここに必要とされます。ファイル名に使用せずに絶対ソケットパスを指定した場合でも、sshはリモートホストを指定する必要があります。これが私が議論に入れた理由です。sshがホストを要求する場合にも使用し、物事を整理します。
$SSH_HOST%h%h


5

このタイプのトンネルは、IPアドレス情報を変更しません。ポート9999を開き、ssh接続を介してそのポートへの接続をリモートマシン(tim @ server)に転送するようにコンピューターに指示するだけです。接続が確立されていることをテストする最も簡単な方法は、転送が作成されたポートにtelnetすることです(例では9999):

$ telnet localhost 9999
サーバーを試行しています...サーバーに
接続しました。
エスケープ文字は「^]」です。

「サーバーに接続しました」というメッセージが表示された場合。メッセージ、つまりトンネルが稼働していることを意味します。代わりに、「リモートホストに接続できない:接続が拒否されました」というメッセージが表示された場合、トンネルは起動していません。

2番目の質問については、ユーザーのブラウザでは、特に指定しない限り、ブラウザーはトンネルを使用しません。ブラウザのネットワーク設定で、プロキシ設定を構成し、localhost:9999をsocks5プロキシとして指定すると、Web接続はsshトンネルを使用し、サーバーのIPアドレスから来ているように見えるはずです。


+1ありがとう!(1)LAN内のプリンターに印刷するとき、ポート9999に行くこと、つまりトンネルを使用することがどのようにわかりますか?他にない?(2)IPアドレス情報を変更するトンネルの種類はありますか?
ティム

@Timは、特定のプリンターが特定のIPアドレスとポートに印刷するように構成されている可能性があります。これは、プリンターのセットアップ方法によって異なります。通常、プリンタを定義するときに両方を指定できます。はい、独自のIP情報が関連付けられたトンネルのタイプがあります。通常、これらに対して個別のtun / tap en.wikipedia.org/wiki/TUN/TAPインターフェースを作成します。このインターフェースには、独自のIPアドレスが接続され、そのアドレスから出て行くすべてのトラフィックは、別のネットワークから来ているように見えます。
ガベ。

ありがとう!Firefoxの設定で、詳細->接続->設定で、手動プロキシ設定を選択し、HTTPプロキシに「localhost」、ポートに「9999」と入力します。その後、FirefoxのどのWebサイトにも接続できません。なぜだろうか?
ティム

@Timそれは少し混乱しています...設定する適切なことは、SOCKSホストであり、HTTPプロキシではありません。私はこれを初めて試したときにこの同じ問題を抱えていました。
ガベ。

1

私の場合(Ubuntu 14.10上のGoogle Chrome)、少なくともブラウザー内で外部アドレスが変更されます。「私のIPアドレスは何ですか?」プロキシ接続の有無にかかわらず。

また、プロキシを設定した後、トンネルを破棄してみて、まだトラフィックを取得できるかどうかを確認してください。これを行うと、chromeは「プロキシサーバーに接続できません」というエラーを返します。

別の方法:リモートホストにトンネリングした後、新しいsshセッションを作成して実行しtcpdump -A dst port 80ます。次に、いくつかのページを参照すると、ターミナルに関連するトラフィックが表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.