web-dev-qa-db-ja.com

netcatを使用してSSHトンネルを作成する方法は?

2台のマシン間にリバース接続を作成したいのですが、これらはsshを除くすべての接続を妨げている中間のファイアウォールです。 netcatを使用してsshトンネルを作成したいのですが、方法を教えてください。

5
user1028

これを行うためにSSHトンネルを作成する必要はありません。ファイアウォール22がブロックしている可能性が高いため、NetCatにポート22で通信させるだけで済みます。

man nc は、必要なすべての情報を提供します。

2
Rory Alsop

調子はどう?ここに肉とジャガイモがあります:

_nurf@sessmacheen $ ssh -f -L localport:localaddress:remoteport \ 
    user@remoteaddress sleep 10; nc localaddress localport
_

これは、sshdがリモートボックスでリッスンしていることを想定しています。これは、あなたの投稿から推測できます。

OK!したがって、sshには_-f_が渡されます。これは、接続が確立された後にバックグラウンドするだけで、_-L_です。 _-L_を「リンク」として覚えています。トンネルを作成し、ポートをローカルでリモートホストのポートに接続します(それぞれ_localport:localaddress_および_:remoteport user@remoteaddress_パーツ)。

したがって、sshはリモートホストでsshdを使って手を差し伸べて(とにかく10秒間)、他の何かがホールドするのを待って手が伸ばされた状態でローカルに座っています。つまり、_nc localaddress localport_です。出来上がり!

上記の1つのライナーは、接続を確立してからリモートボックスで_sleep 10_を実行する以外は実際には何もしません。 this 記事から完全に除外された、より実用的な例を次に示します。

_## let's pull a back up image  over the wire!                   ##
## first we set up the image for grabbing on the remote machine ##
## by piping it to nc which then starts listening on port 9000  ##

dude@remotebox $ cat backup.ico | nc -l 9000

## and now we tunnel! locally, ssh opens up on 9001, and        ##
## connects to 9000 on the remote machine where nc is waiting   ##
## with cat, ready to go.                                       ##

nurf@sessmacheen $ ssh -f -L 9001:127.0.0.1:9000 dude@remotebox \
    sleep 10; nc 127.0.0.1 9001 | pv -b > backthatthangup.iso;

## this is pretty sweet because after nc gets done with the     ##
## connection, ssh finishes running sleep and closes it so you  ##
## don't have to fool with it.  Nice and tidy.                  ##

## pv is a handy little utility that tracks data across a pipe  ##
## and will show you a progress bar and whatever else you want  ##
_

当然のことながら、この接続を「リバース」で作成するには、あなたが知っているだけで、それを「ラウンド」で逆に行います。必要に応じて、バックワード。仕組みを教えてください!

そうそう、また:ncのoh-so-privilegedセルフがすでにそこに座っているため、sshdは22にバインドしません。したがって、予約済みポート範囲外の任意のポート(つまり、ポート1024を超えるもの)を使用します。 22は予約済みポートの1つであるため、とにかくバインドするにはrootである必要があります。

12
nothankyou

元の投稿のほかに、コンピューターへのrootアクセス権がないこと、およびポート22でリッスンしているデーモンがすでにあることを書いています。

Sudoersグループに所属している場合、nothankyouのソリューションは次のようになります。

Sudo ssh -f -L localport:localaddress:remoteport user @ remoteaddress sleep 10; nc localaddress localport

そうでない場合は、SSHがすでに実行されているマシンのiptables(または同様の)に何らかの方法で(:O)アクセスできます。NCでリッスンする別のローカルポートに他のコンピューターのIPのみをリダイレクトしてみます。

まず、引用されたコードを使用して、または単にNCを使用してリッスンします。

nc -l -p 1234

2番目は、よく知られたソースIPアドレスの場合に、着信トラフィックをポート1234にリダイレクトします。

iptables -A INPUT -s <computer A's ip address> -p tcp --dport 22 -j REDIRECT --to-port 1234

なんらかのルートアクセスとローカルファイアウォールルールへのアクセスの両方がない合理的なケースでは、非ルートプロセスがLinuxの「特権」ポート(<1024)にバインドすることが可能です。以下を使用します。そのための行:

setcap 'cap_net_bind_service=+ep' /path/to/program

詳細については、 StackOverflowからのこの質問 を確認してください。すべての問題を解決できるわけではありませんが、問題のより詳しい説明を提供するまでは、良いヒントのようです。

1
Boaz Tirosh