自宅からオフィスの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 の
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
そうすれば、サーバーのエイリアスだけで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をインストールすることができます
シェルコマンドまたはターミナルを開いて、ホームフォルダに移動し、コマンドでインストーラのスクリプトをダウンロードします
$ wget https://opengateway.googlecode.com/files/robotito
その後、コマンドを入力してスクリプトを実行します
$ sudo ./robotito
ロボ-TiTOのconfigフォルダにあるファイル
credentials.rb
をGTalkアカウントで編集し、Ctrl+XとYで保存することができます。デフォルトではnanoエディタを使用していますRobo-TiTOフォルダからRobo-TiTOをコマンドで実行します
$ cd robotito $ ./jabbershd start
今、これが行われていることは、任意の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