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


33

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

次のセットアップ:

  • NATの背後にあるオフィスPC(Linux、ルートアクセス)(パブリックではないIP)、ただしフルインターネットアクセス。
  • サーバーPC(Linux、ルートアクセスなし)静的およびパブリックIPおよびフルインターネットアクセス。
  • NATの背後にあるホームPC(Linux、ルートアクセス)(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で「yes」に設定されたサーバー上のGatewayPortsが必要です。ルートアクセス権はありません。

原則として、次のことが可能です。

0)サーバーで、2つのポート(1つの着信、1つの発信)でリッスンするユーザー空間プログラムを開始します

1)オフィスのPCで、サーバーの発信ポートへのTCP接続を開いたままにする別のプログラムを実行します。

2)自宅からサーバーの受信ポートに接続します。

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

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

フランク


1
仕事用PCを自宅に接続してsshトンネルを設定できますか?en.gentoo-wiki.com/wiki/Autossh

FileZillaは、sftpおよびポート転送で使用できます。チェックアウト:superuser.com/a/1286681/141314
Noam Manos

回答:


31
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では、オフィスのPCログインでローカルポート23456に接続します。これは、ステップ2でサーバーのポート12345に転送され、ステップ1でオフィスPCに転送されます。

転送にautosshを使用していることに注意してください。これは、トンネルが切断された場合に自動的にトンネルに再接続するsshラッパーです。ただし、接続が切断されない限り、通常のsshも機能します。

考えられる脆弱性があります。serverpcのlocalhost:12345に接続できる人は誰でもofficepc:22に接続し、ハッキングを試みることができます。(あなたはSSHサーバを実行している場合は、とにかく、デフォルトでは上にある基本的な保護の上にそれを固定する必要があることを、私は、少なくともrootログインを無効にし、パスワード認証を無効にすることをお勧めします-例えば参照これを

編集:同じ設定でこれを確認しましたが、動作します。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

したがって、ネットワークスタックに関する限り、それはそれぞれのループバックインターフェイス上のすべてのローカルトラフィック(およびserverpc への ssh接続)です。したがって、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
    
  • 転送が失敗した場合、sshトンネルを再起動すると便利です。 -oExitOnForwardFailure=yesポートが既にバインドされている場合、SSH接続は機能しますが、転送されたトンネルはありません。

  • ~/.ssh/configオプション(およびポート)を使用することをお勧めします。そうしないと、コマンドラインが冗長になりすぎます。例えば:

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

その後、サーバーエイリアスのみを使用できます。

    autossh -M0 fwdserverpc

私が信じているこの方法は、「リバースsshトンネル」と呼ばれています。残念ながら、これには/ etc / ssh / sshd_configで「yes」に設定されたサーバーのGatewayPortsが必要です。このサーバーにはゲートウェイポートが有効になっておらず、ルートアクセスがありません。

3
@Frank:実際、そうは思いません。GatewayPorts no開いているポートをループバックインターフェイスでのみアクセス可能に制限します。ステップ2では、ループバックインターフェイスで転送していることに注意してください(実際、両方の転送は「localhostのみ」AllowTcpForwarding noです)。
-Piskvor

3
@フランク:うん、確認した。これはGatewayPorts no; 答えを編集しました。この設定を壊す可能性のある他のディレクティブ(PermitOpenandなどAllowTcpForwarding)があることに注意してください:manpagez.com/man/5/sshd_config
Piskvor

1
素晴らしい答えです!うまくいきました、あなたは私の週末を救いました!どうもありがとう!!

1
autosshバージョン(Fedora Core)は、-Mなしではターミナルから実行できませんでした。また、それを経験した別の人とリンクしました。マニュアルでは、オプションの引数としてマークされていることは正しいです。それが多くの人々のために働くならば、それはすべてではなく、残念です。
ヤロスラフ・ニキテンコ

4

自宅から内部サーバーへ、またオフィスのLinuxマシンから内部サーバーにsshできる場合、自宅ProxyCommandからnc(netcat)を介してssh を使用してサーバーから内部マシンにサイレントにバウンスできます。

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p

その後ssh user@internalpc、サーバーマシンを介して静かに転送されます。どちらの側でもポートやトンネルを開く必要はありません。


1
ご回答有難うございます。残念ながら、ホームPCもサーバーもOffice PCへのアクセスを開始できません。ただし、Office PCとHome PCの両方がサーバーへの接続を開始できます。

4

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、GTalkアカウントを使用してRobo-TiTOのconfigフォルダーからファイルを編集し、Ctrl+ Xおよびを押して保存できますY。デフォルトはnanoエディターを使用しています。

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

    $ cd robotito
    $ ./jabbershd start
    
  5. これが完了したので、任意のGoogleトーククライアントからSSHを使用できます。アカウントを使用する前に、Robo-TiTO GTalkアカウントをGoogleトークアカウントに追加し、互いにチャットしてテストすることを忘れないでください。


5
「SSHポートを開く必要がない(コンピューターを保存する)」という深刻な問題があります-提案するshell-over-jabberボットは、プレーンテキストで、引用符で保護されています。それは文字通りセキュリティゼロです-あなたは誰でも入るためにトラックサイズの穴を開けています。SSH公開キー認証とは対照的に、私は安全なチャネルで認証しています。コンピューターを安全に保つのは誰ですか?CLIENT_PASSPHRASE = "logmein"
Piskvor

@ Piskvor、robotitoはホワイトリストに登録された連絡先からのみコマンドを実行します。github.com/formigarafa/robotito/blob/master/config/...
formigarafa

ホワイトリストベースの認証のため、トラブルに遭遇することはありません。私が間違っていなければ、GTalkで使用する場合、メッセージ転送は暗号化されます。なんらかの方法で最近変更しましたが、現在はGoogle認証システムなどのツールからのワンタイムパスワードを使用してアクセスを許可しています。
formigarafa

1
@formigarafa:(1)この製品の開発に関与している、または関与している場合は、明示的にそう言わなければなりません。同じ名前を使用するだけでは不十分です。ほとんどの人はそれに気付かないでしょう。(プロファイルで言及することもできます。)(2)投稿を編集するときは、できる限り修正する必要があります。たとえば、「I'ts」のようなタイプミスをキャッチしてみてください。また、リンクがダウンした場合、単にリンクをデッドリンクとしてラベル付けしないでください。新しいURL を投稿に追加します。人々は正しい情報を見つけるためにコメントを掘り下げる必要はありません。
G-Manが「Reinstate Monica」と言う

@ G-Man、元の答えと編集は私のものではありませんでした。そして、私がそれを自分のものに見せようとするつもりはなかった。回答にリンク切れがありましたが、リンクも作成しませんでした。私は実際にそのコンテンツを見ることに熱心で、それを追おうとしました。残念ながら、リソースが見つかりませんでした。私は、答えを書いた人が誰でも変更によって通知され、それを修正しようとすることを期待して、デッドリンクとしてマークしました。
-formigarafa

3

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を分離したスクリーンと一緒に使用するか、-NT ssh引数を使用してバックグラウンドで接続を維持するだけで、Piskvorのソリューションを修正できると思います。


賛辞をありがとう:)私のユースケースでは、シェルアクセスと転送が定期的に必要です。さらに、ここでは最小限のケースを示しようとしました(透過的なSSHホストホッピングを使用して上記を2つのコマンドに簡略化することは可能ですが、homepcコンピューターで追加の構成が必要になります)。
Piskvor

2

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


1
今という5.0.0.0/8ネットワークが実際に割り当てられたパブリックIPv4アドレスを持っている、ハマチは(ハマチが実行されている場合、あなたがインターネットの多少ランダム部分にアクセスすることはできません)困っています。また、Hamachiはもはや無料ではありません。
Piskvor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.