web-dev-qa-db-ja.com

Localhost:PortをExternalIP:NewPortに転送する

Linuxサーバー上で実行されているアプリケーションがあります。そのアプリケーションからlocalhost(127.0.0.1):localportにアクセスしようとすると、外部IPに転送されるはずです。ユーザーは、自動的に転送される特定のポートでのみローカルホストにアクセスしようとします。 iptables natテーブルを確認しましたが、localhost自体からlocalhost上のポートにアクセスしていて、ネットワークインターフェイスにまったく触れていないので、PREROUTINGとPOSTROUTINGは正しくありません。疑問に思うOUTPUTテーブルは便利かもしれませんが、いくつかの組み合わせを試したところ、うまくいきませんでした。私は正しいことを使用していますか、それともまったく不可能ですか?

誰かが私を正しい方向に向けることができますか?

8
keerthi

私はこれを自分で行うと考えました。

これを実現するには、2つのルールとフラグを設定する必要があります。

ここで使用する例は「telnet localhost XXXX」であり、パケットをExt.er.nal.IP:YYYYに転送する必要があります。

sysctl -w net.ipv4.conf.all.route_localnet = 1

残念ながら、このフラグは最新のLinuxカーネルにのみ存在し、古いカーネルでは使用できません(古いカーネルには代替フラグもありません)。しかし、どのカーネルが利用可能なフラグなのかはよくわかりません。カーネルバージョン3.XXで利用できると思います。このフラグは、ループバックアドレスを適切な送信元または宛先アドレスと見なすためのものです。ソース: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

iptables -t nat -A OUTPUT -p tcp --dport XXXX -j DNAT --to-destination Ext.er.nal.IP:YYYY

上記のコマンドは、宛先IPがExt.er.nal.IP:YYYYであるlocalhost:XXXX宛てのパケットを変更します

iptables -t nat -A POSTROUTING -j MASQUERADE

このコマンドは、ソースIPをマシンのパブリックIPとして変更します。

-s、-d、-i、-oを使用して適切な送信元と宛先のIPおよびインターフェースを追加することで、ルールをもう少し厳密にすることができます。 「man iptables」を参照してください。

John WH SmithとWurtelに感謝します。提案は非常に役に立ちました。

12
keerthi

これを達成する最も簡単な方法は、netcatinetdをインストールすることです(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 10ncオプションとして持っています。これは私の状況で役立ちますが、必要ないかもしれません。

inetd.confファイルを変更した後、inetdを再ロードします。

この方法でこれを行うと、ncによって開始されたinetdがリレープロセスとして使用されます。

6
wurtel