Linux iptables sshポート転送(martian拒否)


12

ホームネットワークに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つの理由でここに質問を投稿しています:

  1. 将来似たようなことをしようとしている人が検索でこれを見つけ、この回避策が彼らを助けるかもしれないことを願って。
  2. 私はまだ、sshポート転送接続をループバックのみにバインドし、iptablesを介してそれらにルーティングできるようにするというアイデアを好みます。私はこれらのパケットが何であり、どこに行くのかを正確に知っているので、Linux Martianフィルタリングがそれらを拒否しないようにそれらにフラグを立てる方法はありませんか?このトピックを検索すると、rp_filterにつながりますが、テストではまったく役に立ちませんでした。そして、たとえそれが機能したとしても、許可しようとしている正確なパケットに固有のものではありません。

私は自分の質問と一般的な検索への回避策を提供して、他の人に行き止まりを見つけるために行った検索時間を節約し、誰かが私の質問のまだ開いているままのループバック/マーティン部分に答えてくれることを願っています私に。


UL対SFのMeta投稿をさらに読むと、Michaelからのクロスポストではないという要求にも気づきました。SFでオフトピックとして明確にマークされているため、これをクロスポストしました。元の質問を移動してこの質問を閉じることがより適切で可能であれば、それも素晴らしいことです。
マーク

net.ipv4.conf.default.rp_filter = 0とnet.ipv4.conf.all.rp_filter = 0を/etc/sysctl.confに入れて「sudo sysctl -p」を実行すると問題が解決しますか?
ルイFリベイロ

つまり、両方を直接適用してみました。「sysctl net.ipv4.conf.default.rp_filter = 0」。特定のプライベートインターフェイス用のものも含まれます。「sysctl -a」で設定されていることを確認しましたが、127.0.0.1への火星のパケットはまだ拒否されています。そして、これが機能したとしても、すべてのインターフェイスをマーティンに開放することは私が望んでいることではありません。また、1つの(albiet private)インターフェイスを開きたくさえありません。私はどの火星のパケットを許可したいかを正確に知っており、iptables NAT / mangle式がこれを達成できるように望んでいます。
マーク

あなたはnet.ipv4.conf.default.rp_filter = 2をお勧めしますし、他のいくつかのiptablesのルール
ルイF・リベイロ

回答:


1

127.0.0.1:5000に対してDNATを実行する際の問題は、リモート側が応答すると、これらのパケットがローカルで発信されたように(127.0.0.1から)ルーティングエンジンに戻るが、外部宛先アドレスを持つことです。外部インターフェイスに一致するSNAT / MASQUERADEはそれらをキャッチして書き換えますが、パケットがそのインターフェイスに到着するために行う必要があるルーティングの決定が最初になり、デフォルトで偽のこれらのパケットを許可しません。ルーティングエンジンは、後でその書き換えを行うことを忘れないことを保証できません。

代わりにできることは!-sソースアドレス指定の前の引数を使用して、192.168.1.10から来るもの以外のiptables INPUTでの192.168.1.1:5000への外部接続を拒否することです。TCPリセットを拒否メカニズムとして使用する場合(-j REJECT --reject-with tcp-resetデフォルトのICMP宛先到達不能の代わりに)、外部の世界に関する限り、そのaddress:portの組み合わせをリッスンすることさえ何もない状況とほぼ同じになります。


0

openVPNを使用して、ルーターからRemoteGatewayへのトンネルを作成します。

次に、ルーターでルートを追加します。

route add -host RemoteTarget gw RemoteGateway-VPNaddress

Sourceのアクセスを許可するポートを制限する場合は、シンプルなiptablesルールを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.