ホームネットワークに対してNATを実行するLinuxゲートウェイがあります。パケットを特定のIP /ポート(つまりVPNではない)にのみ透過的に転送したい他のネットワークがあります。以下は、使用できるIPとポートのいくつかの例です。
Source Router Remote Gateway Remote Target
192.168.1.10 -> 192.168.1.1 -> 1.2.3.4 -> 192.168.50.50:5000
ソースマシンがルータから直接ルーティングできるように、リモートターゲットの特定のポートと通信できるようにしたいです。ルータでは、eth0はプライベートネットワーク、eth1はインターネット接続です。リモートゲートウェイはSSH経由で接続できる別のLinuxシステムで、リモートターゲットに直接ルーティングできます。
私が試した簡単な解決策は、ルータでSSHポート転送を設定することでした。たとえば、次のようになります。
ssh -L 5000:192.168.50.50:5000 1.2.3.4
これは、ポート5000にローカルに接続できるルーターに適しています。したがって、「telnet localhost 5000」は予想どおり192.168.50.50:5000に接続されます。
これで、現在確立されているSSHトンネルを介して送信元および流入経路のトラフィックをリダイレクトしたいと思います。これに対してNATルールを試しました。
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 127.0.0.1:5000
ルータはすでに私のNATゲートウェイなので、必要なルーティング後のルールはすでにあります。
-A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
このサイトや他のほとんどのQ&Aには、サーバーポート転送やヘアピンNATが含まれているようです。どちらも他の場所でうまくいくようですが、この状況には適用されません。リモートゲートウェイを介してリモート宛先ポートを転送できますが、インターネットからそのポートにアクセスできないようにし、セキュアSSHトンネルを介してのみアクセスできることを願っています。
私が見つけることができる最高の答えは、LinuxカーネルのMartianパケット拒否に関連しています。
iptables、ループバックからポートをリダイレクトする方法は?
Martianロギングを有効にし、カーネルがこれらのパケットをMartianに拒否していることを確認しました。しかし、そうではありません。私はこのパケットが何のためであるか、どこから来て、どこに行くのかを正確に知っています(私のSSHトンネル)。
そこで提案された「ロータリー」ソリューションはもともと問題には効果がありましたが、私の場合はそうではありませんでした。
ただし、この質問の作成/調査中に、次のようにSSHソースIPバインディングを使用して問題を解決しました。
ssh -L 192.168.1.1:5000:192.168.50.50:5000 1.2.3.4
iptables -t nat -D PREROUTING -i eth0 -p tcp -s 192.168.1.10 --dport 5000 -d 1.2.3.4 -j DNAT --to-destination 192.168.1.1:5000
ループバックを使用しないため、火星の拒否を回避できます。
私がこの質問をここに投稿する理由は2つあります。
- 後で同様のことをしたい人が検索でそれを見つけることができるようにしたいので、この回避策が役立ちます。
- 私はまだsshポート転送接続をループバックにのみバインドし、iptablesを介してルーティングできるというアイデアを好みます。さて、このパケットが何であるか、どこに行くのかを正確に知っています。このトピックのすべての検索はrp_filterにつながり、これはテストには役立ちません。動作しても、許可したい正確なパケットに限定されるわけではありません。
私は他の人の検索時間を節約するために、一般的な検索に私の問題と解決策を提供することに興味があります。私がしたことは行き詰まった路地に到達しただけで、誰かが私の質問のループ/火星の部分に答えることを願っています。頭の本。
ベストアンサー1
DNATing 127.0.0.1:5000の問題は、リモート側が応答すると、これらのパケットがローカルで(127.0.0.1で)開始されたかのようにルーティングエンジンに返されますが、外部宛先アドレスがあることです。外部インターフェイスと一致するSNAT / MASQUERADEはそれをキャプチャして書き換えますが、最初にそのインターフェイスにパケットを取得するようにルーティングを決定する必要があり、デフォルトではこれらの偽造パケットを許可しません。ルーティングエンジンは後で再構築する必要があることを保証することはできません。
あなたができることは、!
ソースアドレス指定の前のパラメータを使用して192.168.1.10からの接続を除いて、iptables INPUTから192.168.1.1:5000へのすべての外部接続を拒否することです。-s
拒否メカニズムとしてTCPリセットを使用する場合(-j REJECT --reject-with tcp-reset
デフォルトのICMPターゲットに接続できない代わりに)、外部の世界に関する限り、これはそのアドレスとポートの組み合わせで何も受信しないのとほぼ同じです。