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

firewall linux nat ssh ssh-tunnel

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

Following setup:

  • NAT(IP not public)の後ろにあるオフィスPC(linux、rootアクセス)で、インターネットにフルアクセス
  • サーバーPC(リナックス、ルートアクセスなし)の静的およびパブリックIPとフルインターネットアクセス
  • NAT(IP not public)の後ろにあるホームPC(linux、rootアクセス)でも、インターネットには完全にアクセスできます

可能な接続方法。Office PC –> Server <– Home PC

できません。Office PC <-X- Server -X-> Home PC

Home PCもServerもOffice PCへのアクセスを開始することはできません。しかし、Office PCとHome PCの両方でServerへの接続を開始することができます

逆SSHトンネルができないReverse ssh-tunnelという方法を試してみました。残念ながら、これは /etc/ssh/sshd_config で GatewayPorts on Server を “yes” に設定する必要があります

原則的には可能なはずです

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

1) 私のオフィスのPCでは、サーバー上の送信ポートにTCP接続をオープンにしておく別のプログラムを実行しています

2) 自宅からServerの着信ポートに接続しています

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

これを解決するための一番手っ取り早くて綺麗な解決策は何でしょうか?

Frank

  40  ritter  2011-04-29


ベストアンサー

youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

Later:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

ステップ1では、オフィスPCからサーバにリモートポートを転送します(12345を例にしていますが、どのポートでも良いのです。)サーバの12345に接続すると、オフィスPCのポート22に接続されるはずです

ステップ2では、自宅のマシンからポート23456をサーバの12345に転送します(ステップ1で設定したようにofficepc:22に転送されます)

ステップ3では、オフィスPCのログインでローカルポート23456に接続します。これをステップ2でサーバのポート12345に転送し、ステップ1でオフィスPCに転送します

autossh を転送に使っていることに注意してください。これは 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

つまり、ネットワークスタックに関する限りでは、それぞれのループバックインターフェース上のすべてのローカルトラフィック (および serverpc への ssh 接続) ですので、GatewayPorts はまったくチェックされません

しかし、AllowTcpForwarding というディレクティブがあります: これが no の場合、この設定は、ループバックインタフェースを越えても転送は一切許可されないため、失敗します

Caveats:

  • 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
    

そうすれば、サーバーのエイリアスだけでOKです

    autossh -M0 fwdserverpc

33  Piskvor left the building  2011-04-29


自宅から内部サーバに、内部サーバからオフィスのLinuxマシンにsshできるのであれば、自宅からはProxyCommandでサーバを経由してnc(netcat)を経由して内部マシンに無言でバウンスすることができます

# ~/.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だけで、サーバマシンを介して静かに転送されます

4  Michael  2011-04-29


リモートでSSHアクセスしたいパソコンにRobo-TiTOをインストールします

  • これでどこでもGoogle TalkクライアントアプリからSSHを使ってアクセスできるようになります
  • 公開IPアドレスや特別な設定は必要ありません
  • これは無料でオープンソースで、もうアプリケーションサービスにお金を払う必要はありません
  • SSHポートを開く必要はありません(パソコンを安全に保つ)
  • トンネリング(VPNとか)を開く必要がない

サイトが移転したため、以下のインストール方法は廃止されました。新しい URL は https://github.com/formigarafa/robotito です

私はスクリプトを作りました(Raspberry Piの私のRaspbian OS上でテスト)ので、簡単にRaspberry Pi、DebianやUbuntuボックス(Debianパッケージディストリビューション)にRobo-TiTOをインストールすることができます

  1. シェルコマンドまたはターミナルを開いて、ホームフォルダに移動し、コマンドでインストーラのスクリプトをダウンロードします

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

    $ sudo ./robotito
    
  3. ロボ-TiTOのconfigフォルダにあるファイルcredentials.rbをGTalkアカウントで編集し、Ctrl+XYで保存することができます。デフォルトではnanoエディタを使用しています

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

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

4  community wiki  None


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

Piskvor の解決策は、よりエレガントな autossh を使って、分離された画面と一緒に使うか、-NT ssh 引数を使ってバックグラウンドで接続を維持できるようにすればいいと思います

3  odinho – Velmont  2011-07-14


私には、SSHトンネルの代わりに、VPNを使ってみてはいかがでしょうか。Hamachiのように、外部のサーバを使ってプロキシを通すことで動作するようなものです。 このようなフリーソフトは他にもありますが、Hamachiは私のお気に入りです

2  djangofan  2011-04-29


タイトルとURLをコピーしました