自分の管理下にないルーターの背後にあるLinuxボックスでシェルを制御できるようにしようとしています。
私の最初のアイデアは、クライアント(ルーターの後ろのボックス)を自分の制御下にあるサーバーにsshで接続し、次のようにcronから定期的にローカルのsshポートを転送することでした。
client$ ssh -L 40000:localhost:22 root@server
それは私のプライベートで安全性の低いサーバーでは動作しますが、grsecurityで強化されたCentOS、2.6.24.5-grsec-xxxx-grs-ipv4-32([email protected])であるcustomersサーバーでは失敗します。私はgrsecurityについて、特にこのサーバーでどのように構成されているかについては知りません。 AllowTCPForwardingオプションはsshd_configがデフォルトであり、おそらく(RTFMの時点で) 'yes'であり、ssh-vは私に教えてくれます
debug1: Local connections to LOCALHOST:40000 forwarded to remote address localhost:22
debug1: Local forwarding listening on 127.0.0.1 port 40000.
しかし、このサーバーからクライアントにSSHで戻そうとすると、「接続が拒否されました」というメッセージが表示されます。
次のアイデア:
クライアントの場合:
client$ bash -i <in >out 2>err &
client$ ssh root@server 'cat <client.in' >in &
client$ ssh root@server 'cat >client.out' <out &
client$ ssh root@server 'cat >client.err' <err &
サーバー上:
server# cat client.out &
server# cat client.err &
server# cat >client.in
ls
これらすべての{client。、} {in、out、err}は、mkfifoで作成された名前付きパイプです。しかし、どういうわけか、sshは私にとってこのようには機能せず、ネットを超えるものはありません。これは、通常のファイル(名前付きパイプではない)とtail-fで部分的に機能します。しかし、私が感じているよりも、これはあなたがこれを達成する方法ではありません。そして、プレーンファイルが大きくなりすぎて上書きされる心配があります...それはきれいに見えません。
何か案は?私は顧客サーバーにrootを持っていますが、カーネルをインストールして大混乱を引き起こしたくないのです。
[〜#〜] update [〜#〜]
明確化:クライアントボックスは、ルーターの後ろの離れた場所にお客様がインストールしますが、私もお客様も制御できません。したがって、ルーターにはポート転送やダイナミックDNSはありません。ネット上のどこかにプライベートIPを備えた単なるLinuxボックス。私が描いた最初のアイデアは、顧客のサーバーよりも安全性の低いサーバーでうまくいくでしょう。私はgrsecuredのものを使用することになっています。お客様のgrsecuredサーバーから他の場所にSSHで接続できるので、iptablesの問題ではありません。 (nc -lを使用して)リスニングポートを開き、それらに接続することもできます。
ルーターの背後にあるクライアントからサーバーに接続し、高いサーバーポート(40000など)をクライアントのsshポートに転送しているので、最初にホームからサーバーにsshを実行し、次にサーバーからクライアントにsshを実行できます。私が言ったように、クライアントは私のネットワークになく、私の制御下にないルーターの後ろにあります。
私は家に帰るつもりはありません。クライアントは私がこの素晴らしい旅を始めるマシンではありません。ホーム、サーバー、クライアントは3つの異なるネットワーク上にあります。
SSHトンネリングを間違った方法で行っていると思います。そのため、アクセスしようとしているクライアントから、その逆ではなく、効果的にトンネリングを行っています。クライアントに接続してトンネルを確立できないため、-Lを使用できなくなります。
先に進む方法は、GatewayPortsが制御下のサーバーのsshd_configでオンになっている場合、逆トンネルを使用することです。たとえば、次のようになります。ssh -N -R 40000:localhost:22 user@server_under_your_control
Sshポートが他の方向に転送することをお勧めします。すなわち:
client# ssh -R 40000:localhost:22 clientLogin@yourServer
いくつかのSSHキーなどと、ドロップした場合に再起動するためのラッパーがあります。これにより、SSHでyourServer:40000
そしてclient
でシェルを取得します。
最初の解決策について考えてみてください。IPTABLESが接続をブロックしていないことを確認しましたか?たぶん、システムのファイアウォールでそのようなトラフィックを許可する必要があるだけです。
Hamachiを試すこともできます。私はこれを同じ目的で使用します。 Windowsバージョンが開発の主要なラインですが、Linuxバージョンも浮かんでいます。時間があれば、リンクを見つけて編集します。以下のガイドは実際にあなたをそれにリンクするかもしれません。
http://en.wikipedia.org/wiki/Hamachihttp://www.hackitlinux.com/50226711/using_hamachi_on_linux.phphttps:// secure.logmein.com/US/products/hamachi2/download.aspx
ジェームズが言ったことは静的IPで完璧に機能します。持っていない場合は、毎回自分のIPを示すサービス(たとえばdyndns)を使用する必要があります。
例として、ssh -R blahblah user@thisIsMyIp
次に、接続が確立されているかどうかを確認するスクリプトを作成する必要があります。確立されていない場合は、上記のコマンドを実行する必要があります。