ホームネットワークに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を扱っているようです。どちらもこの状況には当てはまりません。確かに、DMZをリモートゲートウェイ経由でリモートターゲットポートに転送することはできますが、インターネットアクセス可能なポートは必要ありません。安全なSSHトンネルを介してのみアクセスできるようにします。
私が見つけることができる最良の答えは、Linuxカーネルでの火星のパケット拒否に関するものです。
iptables、ループバックからポートをリダイレクトする方法は?
martiansのログを有効にし、カーネルがこれらのパケットをmartiansとして拒否していることを確認しました。そうでないことを除けば、これらのパケットの目的、送信元、送信先を正確に知っています(私の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を介してそれらにルーティングできるようにするというアイデアを好みます。私はこれらのパケットが何であり、どこに行くのかを正確に知っているので、Linux Martianフィルタリングがそれらを拒否しないようにそれらにフラグを立てる方法はありませんか?このトピックを検索すると、rp_filterにつながりますが、テストではまったく役に立ちませんでした。そして、たとえそれが機能したとしても、許可しようとしている正確なパケットに固有のものではありません。
私は自分の質問と一般的な検索への回避策を提供して、他の人に行き止まりを見つけるために行った検索時間を節約し、誰かが私の質問のまだ開いているままのループバック/マーティン部分に答えてくれることを願っています私に。