元の回答を削除しました。それが正しいと確信が持てなかったからです。その後、問題のネットワークをシミュレートするために、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
規則第二POSTROUTING
のルールは一緒に外部IPアドレスを介してサーバへの接続に関係なく、接続が外部からまたはLAN内から発信するかどうかの、起こることができるように、適切なNATのを確立します。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
インターフェース経由でルーターに入らないため)。PREROUTING
内部LANクライアント専用の2番目のルールを追加することで機能させることができますが、それはエレガントではなく(IMO)、外部IPアドレスを明示的に参照する必要があります。
今、「ヘアピンNAT」(または「NATループバック」、「NATリフレクション」、またはそれを呼び出すことを好むもの)ソリューションを完全に詳細にレイアウトした後でも、スプリットホライズンDNSソリューションはまだ信じています。 -外部IPに解決する外部クライアントと内部IPに解決する内部クライアントで---より適切なルートを選択します。どうして?なぜなら、NATの仕組みを理解するよりもDNSの仕組みを理解する人の方が多く、優れたシステムを構築する上で重要なのは、保守可能な部品を使用することです。DNSの設定は、難解なNATの設定(もちろん、IMO)よりも理解される可能性が高いため、正しく維持される可能性が高くなります。