2台のマシン間にリバース接続を作成したいのですが、これらはsshを除くすべての接続を妨げている中間のファイアウォールです。 netcatを使用してsshトンネルを作成したいのですが、方法を教えてください。
これを行うためにSSHトンネルを作成する必要はありません。ファイアウォール22がブロックしている可能性が高いため、NetCatにポート22で通信させるだけで済みます。
man nc は、必要なすべての情報を提供します。
調子はどう?ここに肉とジャガイモがあります:
_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である必要があります。
元の投稿のほかに、コンピューターへの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からのこの質問 を確認してください。すべての問題を解決できるわけではありませんが、問題のより詳しい説明を提供するまでは、良いヒントのようです。