GNU/Linux >> Linux の 問題 >  >> Linux

LAN 内から DNAT 化された Web サーバーにアクセスする

解決策 1:

元の回答が正しいと確信できなかったため、元の回答を削除しました。それ以来、問題のネットワークをシミュレートするために、VM の小さな仮想ネットワークをセットアップする時間がありました。これが私のために機能した一連のファイアウォールルールです(iptables-saveで) nat のフォーマット 表のみ):

-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE

最初の POSTROUTING ルールは、インターネット接続を LAN と共有する簡単な方法です。完全を期すために残しました。

PREROUTING ルールと 2 番目の POSTROUTING ルールを組み合わせて適切な NAT を確立し、接続が LAN の外部または内部のどちらから発生したかに関係なく、外部 IP アドレスを介したサーバーへの接続が発生できるようにします。 LAN 上のクライアントが外部 IP アドレス経由でサーバーに接続すると、サーバーは接続がルーターの内部 IP アドレス (192.168.2.1) からのものと見なします。

興味深いことに、2 番目の POSTROUTING ルールにも機能するいくつかのバリエーションがあることがわかりました。ターゲットが -j SNAT --to-source 192.168.2.1 に変更された場合 、効果は(驚くべきことではありませんが) MASQUERADE と同じです :サーバーは、ローカル LAN クライアントからの接続を、ルーターの内部から発信されたものとして認識します。 IPアドレス。一方、ターゲットを -j SNAT --to-source 89.179.245.232 に変更すると、 の場合、NAT は引き続き機能しますが、今回はサーバーはローカル LAN クライアントからの接続をルーターの 外部 から発信されたものとして認識します。 IP アドレス (89.179.245.232)。

最後に、元の PREROUTING に注意してください /DNAT -i ppp0 のルール ルールが LAN クライアントからのパケットと一致しないため (ppp0 経由でルーターに入らないため)、機能しません。 インターフェース)。 2番目の PREROUTING を追加することで機能させることができます 内部 LAN クライアントのためだけのルールですが、それは洗練されておらず (IMO)、外部 IP アドレスを明示的に参照する必要があります。

さて、「ヘアピン NAT」(または「NAT ループバック」、または「NAT リフレクション」、またはそれを呼びたいもの)ソリューションを詳細に説明した後でも、私はまだスプリット ホライズン DNS ソリューションであると信じています-- -外部クライアントが外部IPに解決され、内部クライアントが内部IPに解決される場合---より推奨されるルートです。なんで? NAT の仕組みを理解するよりも、DNS の仕組みを理解している人の方が多いため、優れたシステムを構築するためには、保守可能なパーツを使用することを選択することが重要です。 DNS セットアップは難解な NAT セットアップよりも理解される可能性が高く、したがって正しく維持されます (もちろん IMO です)。

解決策 2:

OpenWRT でデフォルトで使用される UCI 構成システムを使用して、これを正しい方法で行う方法をほぼ 8 年経っても誰も説明していないことに驚いています。

Steven Monday の答えは正しいですが、iptables を使用しています これは、UCI 構成システムよりも下位層であり、可能であればほとんどの OpenWRT ユーザーが触れないようにしておくのが最善です。

UCI の別の内部ホストからパブリック IP/ポートの組み合わせを介して内部サーバーにアクセスする正しい方法は、構成オプション reflection を有効にすることです。 ファイル /etc/config/firewall 内の特定の DNAT ターゲットごとに .この動作はここに文書化されています。

例:

config redirect option target 'DNAT' option src 'wan' option dest 'lan' option proto 'tcp' option src_dport '44322' option dest_ip '192.168.5.22' option dest_port '443' option name 'apache HTTPS server' option reflection '1'

注:示された OpenWRT ドキュメントによると、reflection デフォルトで有効になっています。私のテストでは、そうではありませんでした。

解決策 3:

一般的な解決策は、これらのホスト名に対して正しい「内部」アドレスを返すローカル DNS サーバーで内部ホストをポイントすることです。

もう 1 つの解決策は (私が Cisco ファイアウォールで作業している場所でこれを使用しています)、これらのアドレスに対応するファイアウォールの DNS 応答を書き換えることです。現在、これを行う Linux 用のツールはないと思います。

正しいことを行うために、ゲートウェイでルーティングを構成できるはずです。外部でマッピングされた IP アドレスを認識できるようにサーバーを構成する必要がある場合があります (たとえば、ダミー インターフェイスに割り当てます)。この構成では、ある内部システムから別の内部システムへの通信 (その「外部」アドレスを使用) は、ルーターを経由します。

解決策 4:

あなたがしようとしていることは NAT Loopback と呼ばれています また、LAN からサーバーへのパケットがルーターを経由して戻るように、SNAT ルールを追加する必要があります。

-A POSTROUTING -p tcp -s 192.168.2.0/24 -d 192.168.2.10 -m multiport --dports 22,25,80,443 -j SNAT --to-source 89.179.245.232

Linux
  1. コマンドラインからIPアドレスのジオロケーションを見つける

  2. ヒアドキュメント内のヒアドキュメントを正しい方法でインデントする方法は?

  3. LAN内からのSSH接続が拒否されましたか?

  1. シェルがSshから制御されているかどうかを検出する方法は?

  2. Vimの内側からルートになりますか?

  3. Find To Workで-execオプションを取得しますか?

  1. コンテナー内で docker-compose コマンドからシェル スクリプトを実行します。

  2. シェルから base32 へのエンコード

  3. IPTables - 別の IP &ポートへのポート (内側から)