web-dev-qa-db-ja.com

NATルーターの背後にあるオフィスホストへのSSHアクセス

自宅からオフィスのLinuxホストのsshポートにアクセスしたい。残念ながら、ホストはNATルーターの背後にあります。そのため、IPアドレスは公開されていません。ただし、残念ながら非ルートアクセスのみである別のインターネットホスト(サーバー)へのアクセスがあります。しばらく検索すると、適切な解決策が見つかりません。

次の設定:

  • NAT(IPは非公開))の背後にあるOffice PC(Linux、ルートアクセス)だが、完全なインターネットアクセス。
  • サーバーPC(Linux、ルートアクセスなし)静的およびパブリックIPおよび完全なインターネットアクセス。
  • NAT(IPは非公開))の背後にある自宅のPC(Linux、ルートアクセス)ですが、完全なインターネットアクセス。

可能な接続: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)自宅からサーバーの受信ポートに接続します。

これには標準的な解決策があるはずです。

これを解決するための最も迅速でクリーンなソリューションは何ですか?

フランク

35
ritter
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のServerAliveIntervalServerAliveCountMaxを使用することができます。 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をインストールします。

  • これにより、どこからでもGoogleトーククライアントアプリからSSHにアクセスできるようになります。
  • パブリックIPアドレスや特別な設定は必要ありません。
  • これは無料でオープンソースであり、もはやアプリケーションサービスを支払う必要はありません。
  • SSHポートを開く必要はありません(コンピューターを安全に保ちます)。
  • トンネリングを開く必要はありません(たとえば、VPNまたはそのようなもの)

次のインストール手順は、サイトが移動したため廃止されました。新しいURLは https://github.com/formigarafa/robotito です。

Raspberry Pi、Debian、またはUbuntu Box(Debianパッケージディストリビューション)にRobo-TiTOを簡単にインストールできるように、スクリプト(Raspberry PiのRaspbian OSでテスト済み)を作成しました。これは、Linuxボックスをリモート可能にする手順です。

  1. シェルコマンドを開くか、ターミナルと呼び、ホームフォルダーに移動し、コマンドでインストーラースクリプトをダウンロードします。

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. その後、コマンドを入力してスクリプトを実行します。

    $ Sudo ./robotito
    
  3. 次に、ファイルを編集できますcredentials.rb Robo-TiTOのconfigフォルダーからGTalkアカウントを使用して、を押して保存します Ctrl+X そして Y。デフォルトはnanoエディターを使用しています。

  4. コマンドでRobo-TiTOフォルダーからRobo-TiTOを実行する

    $ cd robotito
    $ ./jabbershd start
    
  5. これで、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すると、サーバーマシンを介して自動的に転送され、どちらの側でもポートやトンネルを開く必要はありません。

4
Michael

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引数を使用することもできます。

3

私には、SSHトンネルの代わりに、VPNを試すべきだと思われます。外部のサーバーを使用してプロキシ経由で動作する種類の Hamachi などです。このようなフリーソフトウェアは他にもありますが、Hamachiが私のお気に入りです。

2
djangofan