特定の静的 IP を持つルーターがあり、a.b.c.d
そのルーターの一方側は Linux サーバーに接続され、もう一方はインターネットに接続されています。
Linux サーバーにインストールされたソフトウェアに、IP アドレスを使用して外部からアクセスすることはa.b.c.d:portxx
正常に機能します。
ただし、サーバー自体から誰かが開いたブラウザが同じソフトウェアにアクセスしようとすると a.b.c.d:portxx
失敗します。localhost:portxx
再試行すると正常に動作します。
したがって、私の診断では、DSL ルーターが愚かであり、それがa.b.c.d
自分自身に起こっていることに気づいていないということです。
これを修正する方法はありますか? できればルーターで何も変更せずに? つまり、Through /etc/hosts
サーバー上の他のメカニズムでパケットa.b.c.d
を再ルーティングできますかlocalhost
?
これによって他の何かが壊れる可能性はありますか?
答え1
問題はルーターにはありません。ルーターは設定されたとおりに動作し、トラフィックの宛先 abcd:portxx を Linux サーバーに変換します。これは機能しませんが、理解するには、ネットワークで何が起こっているかを確認する必要があります。たとえば、Linux サーバーは 192.168.1.2 で、ルーターは LAN ネットワーク上で 192.168.1.1 です。
- サーバーからパケットを送信する
- 送信元 192.168.1.2:1024 送信先 abcd:portxx
- ルータ上で翻訳が行われる(サーバーに戻る)
- 送信元 192.168.1.2:1024 送信先 192.168.1.2:ポートxx
- パケットがサーバーアプリケーションに到着すると、サーバーアプリケーションは応答し、応答パケットを送信します。
- 送信元 192.168.1.2:ポートxx 送信先 192.168.1.2:1024
- パケットはサーバーからクライアント アプリケーションに到着 (滞在) しますが、この接続は認識されません。これは、abcd への接続を開始し、(abcd) からではなく 192.168.1.2 から応答があるためです。つまり、パケットはドロップされます。
考えられる解決策は次の通りです:
1) ルーターで、可能であれば、ローカルネットワークからNATされたパブリックIPに来るパケットからSNATを設定します。Linuxルーターをお持ちの場合は、何かを試してください。
iptables -t nat -I PREROUTING -s 192.168.0.0/24 -d a.b.c.d -j SNAT --to-source 192.168.1.1
内部ネットワークからルーターを通過するパケットの送信元パケット アドレスを変更し、サーバー アプリケーションは 192.168.1.1 に応答し、応答を受信すると SNAT ルールによって、パケットがサーバー上のクライアント アプリケーションに正しくマップされます。このソリューションは、すべての内部ネットワーク コンピューターで機能しますが、サーバーでは、すべての要求がルーター アドレス 192.168.1.1 から送信されていることがわかります。
2) サーバーでは、iptablesでトラフィックをリダイレクトできます。
iptables -t nat -I OUTPUT -d a.b.c.d -p tcp --dport portxx -j REDIRECT --to-ports portxx
サーバーからの送信接続をサーバーのローカル ポートにリダイレクトします。これがあなたのケースにとって最善の解決策になると思います
3) サーバーに abcd アドレスを追加すると、場合によっては解決できますが、サーバー デーモン (アプリケーション固有) がすべての IP アドレスをリッスンしなかったり、他のアドレスに対して別の応答を返すことがあります。
4) IPアドレスではなくホスト名を使用している場合は、Linuxサーバーの/etc/hostsを再定義できます。これは最も簡単で、役立つこともあります(DNSの戻り値:linuxserver abcd)。/etc/hostsに次の行を記述します。
192.168.1.2 linuxserver
Linuxサーバーから「linuxserver」への接続は192.168.1.2に直接接続されます。