私は、sshトンネルを存続させるために他の人が書いた次のスクリプトtunnel.sh
に依存しています。
#!/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はサーバーのものと同じである必要があると思いました。しかし、実際には同じではありません(wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
で見つけました)。なんでかしら?トンネルが有効な状態でインターネット上のWebサイトに接続すると、サーバーとの間にトンネルがあるため、サーバーと接続中のインターネットWebサイトの間の中間点になりませんか?
それは必要以上に複雑です:-)
トンネルを開始します。
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_Host
が必要です。ファイル名に%h
を使用せずに絶対ソケットパスを指定する場合でも、sshはリモートホストを指定することを望みます。これが%h
を引数に入れる理由です。 sshがホストを要求する場合、それを使用することもできます。
このタイプのトンネルは、IPアドレス情報を変更しません。それが行うすべてはあなたのコンピュータにポート9999を開いて、そのポートへの接続をssh接続経由でリモートマシン(tim @ server)に転送するように伝えることです。接続が確立されていることをテストする最も簡単な方法は、転送が作成されたポート(例では9999)にtelnetで接続することです。
$ telnet localhost 9999
サーバーを試行しています...
サーバーに接続しました。
エスケープ文字は「^]」です。
「サーバーに接続しました」を受け取った場合。メッセージは、トンネルが稼働していることを意味します。代わりに、「リモートホストに接続できません:接続が拒否されました」と表示された場合、トンネルは稼働していません。
2番目の質問については、ブラウザでは、指示がない限り、ブラウザはトンネルを使用しません。ブラウザーのネットワーク設定で、プロキシ設定を構成し、localhost:9999をsocks5プロキシとして指定すると、Web接続でsshトンネルが使用され、サーバーのIPアドレスから送信されているように見えます。
私の場合(Google Chrome))、少なくともブラウザ内で外部アドレスが変更されます。プロキシ接続の有無にかかわらず、「IPアドレスは何ですか?」.
また、プロキシを設定した後、トンネルを破棄して、トラフィックを引き続き取得できるかどうかを確認してください。これを行うと、chromeは「プロキシサーバーに接続できません」というエラーを返します。
別の方法:リモートホストにトンネリングした後、新しいsshセッションを作成し、tcpdump -A dst port 80
を実行します。次に、いくつかのページを参照すると、ターミナルに関連するトラフィックが表示されます。