Linuxサーバー上で実行されているアプリケーションがあります。そのアプリケーションからlocalhost(127.0.0.1):localportにアクセスしようとすると、外部IPに転送されるはずです。ユーザーは、自動的に転送される特定のポートでのみローカルホストにアクセスしようとします。 iptables natテーブルを確認しましたが、localhost自体からlocalhost上のポートにアクセスしていて、ネットワークインターフェイスにまったく触れていないので、PREROUTINGとPOSTROUTINGは正しくありません。疑問に思うOUTPUTテーブルは便利かもしれませんが、いくつかの組み合わせを試したところ、うまくいきませんでした。私は正しいことを使用していますか、それともまったく不可能ですか?
誰かが私を正しい方向に向けることができますか?
私はこれを自分で行うと考えました。
これを実現するには、2つのルールとフラグを設定する必要があります。
ここで使用する例は「telnet localhost XXXX」であり、パケットをExt.er.nal.IP:YYYYに転送する必要があります。
残念ながら、このフラグは最新のLinuxカーネルにのみ存在し、古いカーネルでは使用できません(古いカーネルには代替フラグもありません)。しかし、どのカーネルが利用可能なフラグなのかはよくわかりません。カーネルバージョン3.XXで利用できると思います。このフラグは、ループバックアドレスを適切な送信元または宛先アドレスと見なすためのものです。ソース: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
上記のコマンドは、宛先IPがExt.er.nal.IP:YYYYであるlocalhost:XXXX宛てのパケットを変更します
このコマンドは、ソースIPをマシンのパブリックIPとして変更します。
-s、-d、-i、-oを使用して適切な送信元と宛先のIPおよびインターフェースを追加することで、ルールをもう少し厳密にすることができます。 「man iptables」を参照してください。
John WH SmithとWurtelに感謝します。提案は非常に役に立ちました。
これを達成する最も簡単な方法は、netcat
とinetd
をインストールすることです(Debianにはopenbsd-inetd
にあります)。
/etc/inetd.conf
に行を追加します。
127.0.0.1:1234 stream tcp nowait root /bin/nc nc ex.ter.nal.ip 1234
1234
を実際のポート番号に、ex.ter.nal.ip
を実際の外部IPアドレスに置き換えます。 1分あたり128を超える接続を行う必要がある場合は、.1000
またはいくつかの大きな数をnowait
オプションに追加する必要がある場合があります。これは、暴走接続によってシステムが不必要にロードされるのを防ぐためです。
私はまた、-q 4 -w 10
をnc
オプションとして持っています。これは私の状況で役立ちますが、必要ないかもしれません。
inetd.conf
ファイルを変更した後、inetd
を再ロードします。
この方法でこれを行うと、nc
によって開始されたinetd
がリレープロセスとして使用されます。