私は小さなローカルネットワークを持っています。外の世界で利用できるのは1台のマシンだけです(これは簡単に変更することはできません)。標準ポートに入らないsshリクエストが別のマシンに送られるように設定できるようにしたいと思います。これは可能ですか?もしそうなら、どのように?
ああ、これらのマシンはすべてUbuntuまたはOSXのいずれかを実行しています。
もう1つの方法は、sshトンネリング(クライアント側で発生)を使用することです。
次のようなsshコマンドを実行します。
ssh -L 8022:myinsideserver:22 paul@myoutsideserver
これにより、外部からアクセス可能なマシン(myoutsideserver)に接続し、そのssh接続を介してサーバーのポート22(標準のsshポート)へのトンネルを作成します。このトンネルは、内部からのみアクセスできます。
次に、次のような別のsshコマンドを実行します(最初のコマンドは接続したままにします)。
ssh -p 8022 paul@localhost
ローカルホストのポート8022への接続は、最初のssh接続を介してトンネリングされ、myinsideserverを経由します。
sshポートの転送を許可するには、myoutsideserverで何かしなければならないことがあるかもしれません。私は今それを再確認しています。
編集
うーん。sshのマンページには次のように書かれています。**特権ポートを転送できるのはスーパーユーザーのみです。**
そのようなことは、最初のssh接続がルートとしてなければならないことを私に暗示しています。多分他の誰かがそれを明らかにすることができます。
転送されたポート(この場合は8022)が特権ポート(22など)でない限り、スーパーユーザー特権は必要ないようです。マイクストーンの説明に感謝します。
(この例では、ポート 2222 が内部ホストに接続されると想定しています。$externalip と $internalip は、それぞれ可視マシンと内部マシンの IP アドレスまたはホスト名です。)
プロキシをどの程度永続的にしたいかによって、いくつかのオプションがあります。
ある種の TCP プロキシ。Linux では、着信パケットが処理される前に、宛先を変更したいというのが基本的な考え方です。つまり、宛先 NATを事前にルーティングします。
iptables -t nat -A PREROUTING -p tcp -i eth0 -d $externalip --dport 2222 --sport
1024:65535 -j DNAT --to $internalip:22
SSH を使用して一時的なポート転送を確立します。ここから、再び 2 つのオプションがあります。
透過プロキシ。クライアントは、可視ホスト (ポート 2222 上) を通常の SSH サーバーと見なし、通過していることを認識しません。きめ細かな制御が失われる一方で、利便性が得られます (特に、SSH を使用して VNC または X11 を内部ホストに転送する場合)。
ssh -g -R 2222:localhost:22 $externalip
ssh -p 2222 $externalip
「内部」マシンと「外部」マシンが同じ LAN 上にある必要はないことに注意してください。この方法で世界中にポート転送できます。
最初に外部マシンへのログインを強制します。これは真の「転送」であり、「プロキシ」ではありません。しかし、基本的な考え方は次のとおりです。ユーザーに外部マシンへのログインを強制し (そのため、誰がいつログインできるかを制御し、アクティビティのログを取得します)、そこから内部に SSH で接続できます。雑用のように聞こえますが、内部ホストの名前を使用して外部マシンに単純なシェル スクリプトを設定し、パスワードのない SSH キーペアを組み合わせれば、ユーザーは非常に簡単にログインできます。
/usr/local/bin/internalhost
単純に実行します。ssh $internalip
ssh $externalip internalhost
最初のマシンにログインすると、すぐに内部のマシンに転送されます。このアプローチのもう 1 つの利点は、1 つの IP アドレスで 2 つの SSH サービスを実行すると SSH クライアントが怒るので、キー管理の問題が発生しないことです。
参考までに、サーバーに SSH で接続したいが、キーについて心配したくない場合は、次のようにします。
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
私は自分のシェルに「nossh」というエイリアスを持っているので、それを実行するだけでnossh somehost
すべての重要なエラーが無視されます。これを行うと、セキュリティ情報が無視されることになるため、理論的なリスクがあることを理解しておいてください。
この情報の多くは、私が Barcamp Bangkok で行った派手な SSH トリックに関する講演からのものです。私のスライドを見ることができますが、S5 スライドはバグが多いため、テキスト バージョンをお勧めします。詳細については、「何でも転送: シンプルなポート転送」というセクションを確認してください。OpenSSH を使用した SOCKS5 プロキシの作成に関する情報もあります。はい、できます。OpenSSHはそのように素晴らしいです。
(最後に、内部ネットワークへのトラバースが多い場合は、VPN のセットアップを検討してください。恐ろしいように聞こえますが、OpenVPN は非常にシンプルで、すべての OS で実行されます。SSH だけではやり過ぎだと思いますが、いったん開始すると、 VNC、HTTP、またはその他の処理を実行するためのポート転送によるポート転送; または、心配する内部ホストが多数ある場合は、よりシンプルで保守しやすいものになる可能性があります。)
私はそれを言うつもりだったが、あなたは私を打ち負かしました!とにかく、 -R オプションもあることを追加したかっただけです。
ssh -R 8022:myinsideserver:22 paul@myoutsideserver
違いは、接続しているマシンと接続しているマシンです。私の上司は少し前にこのトリックを教えてくれました。それを知って本当に良かったです...私たちはファイアウォールの内側にいて、マシンへの外部アクセスを許可する必要がありました...彼は別のマシンへの ssh -R によってそれを回避しましたそれはアクセス可能でした...その後、そのマシンへの接続はファイアウォールの背後にあるマシンに転送されたため、使用しているマシンとssh接続しているマシンに基づいて -R または -L を使用する必要があります。
また、転送しているポート (この場合は 8022 ポート) が制限された範囲 (1024 だと思いますが、間違っている可能性があります) を下回っていない限り、通常のユーザーを使用しても問題ないと確信しています。 、これらは「予約済み」ポートであるためです。「制限された」ポートに転送しても問題ありません。そのポートは開かれていないためです(マシンはトンネルを介してトラフィックを送信しているだけで、トンネルの知識はありません)、8022ポートはISです開いているため、そのように制限されています。
編集:トンネルは最初の ssh が開いている間だけ開いていることを覚えておいてください。したがって、タイムアウトするか終了すると、トンネルは閉じられます。
これを行うには、ポートフォワーディングを使用できます。ここを見てください:
http://portforward.com/help/portforwarding.htm
このページには、ポート転送要求を行うようにルーターを設定する方法の説明があります。
http://www.portforward.com/english/routers/port_forwarding/routerindex.htm
Ubuntu では、Firestarterをインストールし、その転送サービス機能を使用して、ネットワーク内のマシンのポート 22 への外部アクセスを使用して、マシンの非標準ポートから SSH トラフィックを転送できます。
OS X では、/etc/nat/natd.plistファイルを編集して、ポート転送を有効にすることができます。
ファイアウォール ルールをいじらずに、~/.ssh/config ファイルを設定できます。
10.1.1.1 が「ゲートウェイ」システムで、10.1.1.2 が「クライアント」システムであると仮定します。
Host gateway
Hostname 10.1.1.1
LocalForward 8022 10.1.1.2:22
Host client
Hostname localhost
Port 8022
次の方法で「ゲートウェイ」への ssh 接続を開くことができます。
ssh gateway
別のターミナルで、クライアントへの接続を開きます。
ssh client