私のコンピュータを(サードパーティのサーバーなしで)友達のコンピュータに直接接続しようとしています。私たちはどちらもISPルーターの背後にあり(挑戦的に!)接続を望んでいます。ルータの設定を変更する必要はありません。。
提案に従ってくださいここそしてここ、我々は2種類のTCPホールパンチングを試みた。
myself$ nc -p 7777 public-ip-friend 8888
friend$ nc -p 8888 public-ip-myself 7777
UDPで穴をあける:
myself$ nc -u -p 7777 public-ip-friend 8888
friend$ nc -u -p 8888 public-ip-myself 7777
しかし、それらのどれも動作しません。
この問題をどのように解決しますか?
注:VPS(NATの背後にない)<-->マイホームコンピュータ(まだルータの背後にある)は同じ方法を使用します。
答え1
質問に記載されているコマンドが動作する場合もありますが、動作しない場合もあります。
理由は次のとおりです。
仮定:
- 私のローカルネットワークのコンピュータIP:192.168.1.10
- マイパブリックネットワークIP:203.0.113.10
- 私の友人の公開IP:198.51.100.27
マイコンピュータでこれを行うとき:
myself$ nc -u -p 7777 198.51.100.27 8888
NAT変換の前に、以下を行った。
srcip srcport destip destport
192.168.1.10 7777 198.51.100.27 8888
ただし、ホーム ルータ NAT 変換後、次の結果が表示されます。
srcip srcport destip destport
203.0.113.10 55183(*) 198.51.100.27 8888
つまり、ソース IP は NAT によって書き換えられます。ソースポートもあります。
したがって、私の家のファイアウォールに「穴」が作成されますが(私の友人の198.51.100.27からのトラフィックを許可する)、ポート55183用です。ポートには適用されません7777.
私の友人がこれを行うときに失敗する理由は次のとおりです。
friend$ nc -u -p 8888 203.0.113.10 7777
注(*):場合によっては、ルータはsrcport = 7777を任意のポート(55183など)に書き換える代わりに保持できます。この場合、質問に記載されているソリューションが機能する可能性があります。しかし、これはランダムな行動です!