自宅からオフィスのLinuxホストのsshポートにアクセスしたい。残念ながら、ホストはNATルーターの背後にあります。そのため、IPアドレスは公開されていません。ただし、残念ながら非ルートアクセスのみである別のインターネットホスト(サーバー)へのアクセスがあります。しばらく検索すると、適切な解決策が見つかりません。
次の設定:
可能な接続:Office PC->サーバー<-自宅のPC
不可能:Office PC <-X- Server -X-> Home PC
ホームPCもサーバーもOffice PCへのアクセスを開始できません。ただし、Office PCとHome PCの両方がサーバーへの接続を開始できます。
リバースSSHトンネルが不可能:リバースssh-tunnelと呼ばれる方法を試しました。残念ながら、これには/ etc/ssh/sshd_configでサーバーのGatewayPortsを「yes」に設定する必要があります。ここでは、rootアクセスがありません。
原則として、それは可能であるべきです:
0)サーバー上で、2つのポート(1つは受信、1つは送信)で待機するユーザー空間プログラムを起動します。
1)オフィスのPCで、TCP接続をサーバーの送信ポートに開いたままにしておく別のプログラムを実行します。
2)自宅からサーバーの受信ポートに接続します。
これには標準的な解決策があるはずです。
これを解決するための最も迅速でクリーンなソリューションは何ですか?
フランク
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc
後で:
you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc
you@homepc$ ssh youatwork@localhost -p 23456
あなたができることはこれです:ステップ1で、リモートポートをオフィスPCからサーバーに転送します(12345
は例として使用され、1024を超えるポートはすべて実行する必要があります)。サーバーの12345に接続すると、officepcのポート22に接続されます。
手順2で、ポート23456をホームマシンからサーバーの12345に転送します(手順1で設定したように、officepc:22に転送されます)。
ステップ3で、ローカルポート23456 オフィスのPCログインでに接続します。これは、ステップ2でサーバーのポート12345に転送され、ステップ1でオフィスPCに転送されます。
転送にautosshを使用していることに注意してください。これは、トンネルが切断された場合にトンネルを自動的に再接続するsshラッパーであるためです。ただし、接続が切断されない限り、通常のSSHも機能します。
脆弱性が存在する可能性があります。serverpc上のlocalhost:12345に接続できるすべてのユーザーがofficepc:22に接続し、ハッキングを試みることができるようになります。 (SSHサーバーを実行している場合は、とにかくデフォルトでオンになっている基本的な保護より上で保護する必要があることに注意してください。少なくともrootログインを無効にし、パスワード認証を無効にすることをお勧めします。例 this を参照してください)
編集:同じ設定でこれを確認しましたが、動作します。 GatewayPorts no
は、ローカルトンネルではなく、一般に公開されているポートにのみ影響します。転送されるポートは次のとおりです。
homepc:
outgoing ssh to serverpc:22
listening localhost:23456 forwarded through ssh tunnel
serverpc:
listening ssh at *:22
incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
outgoing ssh to serverpc:22
incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22
したがって、ネットワークスタックに関する限り、それはそれぞれのループバックインターフェイス(およびssh接続to serverpc)上のすべてのローカルトラフィックです。したがって、GatewayPorts
はまったくチェックされません。
ただし、ディレクティブAllowTcpForwarding
があります。これがno
の場合、転送はまったく許可されないため、ループバックインターフェイスを介しても、このセットアップは失敗します。
注意事項:
autosshと最近のsshを使用している場合、トンネルを維持するためにsshのServerAliveInterval
とServerAliveCountMax
を使用することができます。 Autosshには組み込みのチェック機能がありますが、Fedoraにはいくつかの問題があるようです。 -M0
はそれを無効にし、-oServerAliveInterval=20 -oServerAliveCountMax=3
は接続が確立されているかどうかを確認します。20秒ごとに試行し、3回続けて失敗すると、sshを停止します(autosshは新しい接続を作成します)。
autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
転送が失敗した場合、-oExitOnForwardFailure=yes
を使用してsshトンネルを再起動すると便利です。ポートがすでにバインドされている場合、SSH接続は機能しますが、転送されたトンネルはありません。
オプション(およびポート)に~/.ssh/config
を使用することをお勧めします。そうしないと、コマンドラインが冗長になります。例えば:
Host fwdserverpc
Hostname serverpc
User notroot
ServerAliveInterval 20
ServerAliveCountMax 3
ExitOnForwardFailure yes
LocalForward 23456 localhost:12345
次に、サーバーエイリアスのみを使用できます。
autossh -M0 fwdserverpc
リモートからSSHにアクセスするコンピューターにRobo-TiTOをインストールします。
次のインストール手順は、サイトが移動したため廃止されました。新しいURLは https://github.com/formigarafa/robotito です。
Raspberry Pi、Debian、またはUbuntu Box(Debianパッケージディストリビューション)にRobo-TiTOを簡単にインストールできるように、スクリプト(Raspberry PiのRaspbian OSでテスト済み)を作成しました。これは、Linuxボックスをリモート可能にする手順です。
シェルコマンドを開くか、ターミナルと呼び、ホームフォルダーに移動し、コマンドでインストーラースクリプトをダウンロードします。$ wget https://opengateway.googlecode.com/files/robotito
その後、コマンドを入力してスクリプトを実行します。$ Sudo ./robotito
次に、ファイルを編集できますcredentials.rb
Robo-TiTOのconfigフォルダーからGTalkアカウントを使用して、を押して保存します Ctrl+X そして Y。デフォルトはnanoエディターを使用しています。
コマンドでRobo-TiTOフォルダーからRobo-TiTOを実行する$ cd robotito $ ./jabbershd start
これで、GoogleトーククライアントからSSHを使用できるようになりました。 Robo-TiTO GTalkアカウントをGoogleトークアカウントに追加し、アカウントを使用する前に、お互いにチャットしてテストすることを忘れないでください。
自宅から内部サーバーに、内部サーバーからオフィスのLinuxマシンにsshできる場合、自宅からssh ProxyCommand
を使用して、nc
(netcat)
# ~/.ssh/config on your home machine:
Host internalpc
ForwardAgent yes
ProxyCommand ssh [email protected] exec nc internal.pc.example.com %p
次に、ssh user@internalpc
すると、サーバーマシンを介して自動的に転送され、どちらの側でもポートやトンネルを開く必要はありません。
Piskvorのソリューションは機能し、素晴らしいです。ただし、ログインシェルがハングした状態でターミナルが開いたままになります。あまりクールではありません。
私は常に、サーバーに接続し、cronで実行して接続を維持するために作成したこの小さなスクリプトを使用してきました。
#!/bin/bash
TARGET_Host=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"
#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
grep "ssh $TARGET_Host -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
grep -v grep | \
wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
echo "`date` : establishing connection to $TARGET_Host on port $TARGET_PORT"
screen -m -d ssh $TARGET_Host -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi
おそらく分離された画面と一緒に、よりエレガントなautosshを使用してPiskvorのソリューションを修正することも、バックグラウンドで接続を維持するために-NT ssh引数を使用することもできます。
私には、SSHトンネルの代わりに、VPNを試すべきだと思われます。外部のサーバーを使用してプロキシ経由で動作する種類の Hamachi などです。このようなフリーソフトウェアは他にもありますが、Hamachiが私のお気に入りです。