私のIPが198.51.100.27で、友人のIPが203.0.113.11であるとします。私たちは皆、標準の消費者ISPルーターを介してインターネットに接続します。
サードパーティのサーバーを使用せずに、どのように互いに数バイトを送信できますか?(そしてルータポート転送設定は不要です)
netcat
orについて聞いたことがありますが、ncat
それを使用して友達に「hello world」を送信する方法と、友達が端末でこのメッセージを表示する方法を知りません。
彼はこれをしなければなりません:
ncat -C 198.51.100.27 80 # this IP is mine
そして私:
ncat -l 203.0.113.11 80 < echo "hello world" # this IP is my friend's IP
?
私も確信していませんnetcat
/ncat
それが正しいツールかどうか。chownat
/も見ましたが、pwnat
「hello world」を送受信する簡単な例では、どのように使用するのかわかりません。
メモ:
SSHやSFTPを介して友達のコンピュータに接続したくありません。私は彼に「hello world」を送ったり、お互いに文字を送りたいです。
集中型サーバーなしで直接P2Pにバイトを送信する方法を理解する以外に、明確な目標はありません。したがって、その人がコンソールで見ることができるように1〜2バイトを送っても問題になりません!
答え1
nc -l -p $port
デフォルトでは、1つのホストで実行し、nc $ipaddr $port
適切な値$ipaddr
と特定の値を設定するだけで十分$port
です。ただし、これを行うには、システム間のファイアウォールが接続をブロックしてはいけません。
「どちらも標準のコンシューマーISPルーターの背後にある」と述べました。これは一般に一種のNATを意味する。これは、ルータの背後にあるコンピュータにパブリックIPアドレスがないため、ホストに直接接続することはできませんが、ポートを設定する必要があることを意味します。ルーターの前方。
また、ISPが接続を許可するかどうかに関する質問もあります。さまざまな要因によって、通常のユーザー接続はTCP接続を受信できない可能性があります。
およびリダイレクトの場合は、他のコマンドの出力をパイプにするか、文字列を直接送信する必要がecho
あります。 (これは標準機能ではありません。)echo "message" | nc ...
nc
nc ... <<< "message"
nc
sh
答え2
「クライアント」は「サーバー」パブリックIP(whatismyipサイト検索)を使用し、「サーバー」として機能するルーターが「ポート転送」するポート番号に同意する必要があります。サーバーは自分自身を保護し、その特定のクライアントからの接続のみを受け入れる必要がない限り、クライアントのパブリックIPを知る必要はありません。
答え3
あなたが探しているものTCPホールパンチング。
NATルーター(またはポート転送)を制御できず、サードパーティのプロキシを使用して通信を同期し、NATが「キャリアグレードNAT」ではなく単純NATの場合は、これを行うことができます。ポートには変更は表示されず、IPのみが変更されます(そうしないと、すべてが難しくなります)。ブローカーは実際の通話など何でも構いませんが、自動化には専門的なものが必要です。プロキシの役割は、タスクを同期し、両当事者にパブリックIPを通知することです。 ㅏめまいサーバーは自動化されたソリューションの一部である可能性があります。
基本原則はTCPが元々RFC 793で定義SYN、SYN / ACK、およびACKの一般的な3重手動検査を許可します。または同時SYN + SYN、同時SYN + ACK、およびACKも可能です(参照:前のリンク、図8)。これにより、両方のNATルーターはTCP接続の「リターンストリーム」を開きます。
注:通信はNTPと同期する必要があります。そうしないと、速度が遅いピアのNATルータがRSTを送信し、他のNATルータの「穴」を閉じることがあります。ルータがRSTを再送信するのではなくパケットを破棄しても、問題はありません。多くのホームNATルータはこれらのパケットを破棄するので問題はありません。
例:198.51.100.27の所有者Aがオンラインウェブサイト(「私のIPは何ですか」...)を使用して特定の時間に自分のIPを確認し、netcatの既存のバージョンを使用することに同意した後、203.0.113.11所有者Bに電話します。
Aは次のように入力します。
nc -p 7777 203.0.113.11 8888
一般B同時にタイプ:
nc -p 8888 198.51.100.27 7777
これにより、各ユーザーは確立されたTCP接続を表示します。同じつながる。
これで、Aは「hello world」を自由に入力でき、Bはそれを読みます。
私は実際にstackoverflowについてのより詳細な情報を含む同様の答えをしましたが、解決策として検証しませんでした。https://stackoverflow.com/questions/39545461/tcp-based-hole-punching/39581596#39581596
netcatを使用する代わりに、ソカットオートメーションのために他のものと簡単に統合できるため、優先する必要があります。