tunnel.sh
SSHトンネルをアクティブに保つために他の人が作成し、スクリプトを使用します。
#!/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/<.*$//'
)。理由を知りたいです。トンネルがアクティブな状態でインターネット上のウェブサイトにアクセスするとき、私とサーバーの間のトンネルのためにサーバーは私に接続されているインターネットウェブサイトの中間点ではありませんか?
答え1
これは必要以上に複雑です:-)
トンネルを開始します。
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は変更されません。あなたがしなければならないのは、リモートホストを介して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_HOST
。%h
ファイル名に使用せずに絶対ソケットパスを指定しても、sshは依然としてリモートホストを指定する必要があります。それで私は%h
主張を広げました。 sshがホストを要求し、仕事を体系的に維持する場合でも、これを使用できます。
答え2
このタイプのトンネルはIPアドレス情報を変更しません。これは、コンピュータにポート9999を開き、SSH接続を介してそのポートの接続をリモートコンピュータ(tim@server)に転送するように指示することです。接続が確立されたかどうかをテストする最も簡単な方法は、転送が生成されたポート(例では9999)にTelnetで接続することです。
$ telnet localhost 9999サーバーを試しています
...
サーバーに接続しました。
エスケープ文字は「^]」です。
「サーバーに接続しました」というメッセージが表示された場合。これはトンネルが動作していることを意味します。代わりに、「リモートホストに接続できません。接続が拒否されました」というメッセージが表示された場合、トンネルは開始されません。
2番目の質問の場合、あなたのブラウザはあなたが指定しない限り、ブラウザはトンネルを使用しません。ブラウザのネットワーク設定でプロキシ設定を構成し、localhost:9999をソックス5プロキシとして指定できます。これにより、Web接続はSSHトンネルを使用し、サーバーのIPアドレスとして表示されるはずです。
答え3
私の場合(Ubuntu 14.10のGoogle Chrome)、少なくともブラウザ内で外部アドレスが変更されました。ただGoogleで「私のIPアドレスは何ですか?」プロキシを使用または使用せずに接続します。
また、プロキシを設定した後にトンネルを破壊し、まだトラフィックが発生していることを確認してください。これにより、Chromeが「プロキシサーバーに接続できません」というエラーが返されます。
別の方法:リモートホストにトンネリングした後、新しいSSHセッションを作成して実行しますtcpdump -A dst port 80
。その後、ページに移動すると、端末に関連するトラフィックが表示されます。
答え4
これが最善の解決策です:
#!/bin/bash
export SSH_HOST=
export SSH_PORT=
if ps -lef | grep ssh | grep $SSH_PORT
then
echo "Starting SSH tunnel"
ssh -f -N -D $SSH_PORT -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"
else
echo "Stopping SSH tunnel"
ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST
fi
exit
トンネルが稼働していることを確認し、トンネルを開閉します。