web-dev-qa-db-ja.com

NAT MikrotikRB2011でホスト名を介して同じポート上の2つの異なるサーバーに

静的IPを介してインターネットに接続するRouterOSを実行しているMikrotikRB2011ルーターがあります。私のLANには2つの異なるサーバーがあり、1つはIP 192.168.89.11上にあり、もう1つは192.168.89.12上にあります

私のDNS(cloudflare上)は、myfirstserver.comとmysecondserver.comの両方をルーターの静的IPに解決します。

さて、私がやりたいのは、myfirstserver.comのすべてのトラフィックが192.168.89.11に行き、mysecondserver.comのトラフィックが192.168.89.12に行くようにトラフィックを何らかの方法で分離することです(そして両方ともポート80にあります。ポートを変更するだけでよいことはわかっていますただし、これらが公開されているサーバーである場合、ユーザーは80とは異なるポートを設定しません)

私がこれまでに試みたのは、なんとかマングルを介してパケットにマークを付け、そのマークをNATで使用して適切なdst-nat転送を行うことです。

コンテンツまたはレイヤー7プロトコルの正規表現のいずれかを使用してパケットにマークを付けてみます(アクションがログの場合は正しく動作します。正しくログされていることがわかります)。

問題は、私がそれらにマークを付けた後、NATはそれらを無視し、マークされていないパケットを受け入れるサーバーに接続を転送するようだということです。

どういうわけか、フィルタリングの順序とチェーンを混同していると思います。

誰かがこれを達成する方法についていくつかの指針/支援を提供することができるでしょうか?

ありがとう!

編集:私の質問は、MikrotikルーターのRouterOSでパケットをマークし、NATでマークをチェックすることについて非常に具体的です。リバースプロキシが必要かどうかではありません。ありがとう

編集2:@ Cha0sは私の/ip firewall exportだからここにある:

/ip firewall layer7-protocol
add name=haf1a regexp=haf1a

/ip firewall address-list
add address=192.168.89.0/24 list=local
add address=192.168.88.0/24 list=local
add address=www.xxx.yyy.zzz list=local
add address=192.168.87.0/24 list=local

/ip firewall filter
add chain=input comment="default configuration" protocol=icmp
add chain=input comment="default configuration" connection-state=established
add chain=input comment="default configuration" connection-state=related
add action=drop chain=virus comment="Drop 80 DoS attack" src-address-list=spammer
add action=add-src-to-address-list address-list=spammer address-list-timeout=1d chain=input connection-limit=10,32 dst-address-list=!local dst-port=53 protocol=udp
add action=drop chain=input dst-port=53 protocol=udp src-address-list=!local
add action=add-src-to-address-list address-list=spammer address-list-timeout=1d chain=input connection-limit=30,32 protocol=tcp
/ip firewall mangle
add action=change-mss chain=forward new-mss=1422 out-interface=all-ppp protocol=tcp tcp-flags=syn tcp-mss=1423-65535

/ip firewall nat
add action=masquerade chain=srcnat comment="default configuration" out-interface=ether1-gateway
add action=masquerade chain=srcnat out-interface=pppoe-out1
add action=dst-nat chain=dstnat comment="No HAF mark" dst-address=www.xxx.yyy.zzz dst-port=80 packet-mark=!haf1 port="" protocol=tcp src-port="" to-addresses=192.168.89.41 to-ports=80
add action=dst-nat chain=dstnat comment="HAF mark" dst-address=www.xxx.yyy.zzz dst-port=80 packet-mark=haf1 port="" protocol=tcp src-port="" to-addresses=192.168.89.31 to-ports=80

どこ www.xxx.yyy.zzzは私の外部IP(静的)であり、192.168.89.31および192.168.89.41ローカルネットワーク内の2つのサーバー

私の目標は、haf1aそれら(例haf1a.lala.com)関連するサーバー(192.168.89.31)

2
pataroulis

輸出してくれてありがとう。

この構成がMikroTikでサポートされていないか、バグがあることが判明しました。

パケットフロー図によると、正しく理解すれば、dst-natmangle preroutingの前にあるため、dst-natはパケット/接続マークを検出できるはずです。しかし、私自身のいくつかのテストの後、私はあなたがしたのと同じように立ち往生しました。 MikroTik Packet Flow Diagram

マングル/フィルターは、NATでマークされたパケットと一致することができますが(またはマークなしでも、ルールでL7フィルターを直接使用することにより)、単にどのパケットとも一致しません。

MikroTikフォーラムにはさまざまな関連スレッドもありますが、解決策は見つかっていないようです。

http://forum.mikrotik.com/viewtopic.php?f=2&t=83129

http://forum.mikrotik.com/viewtopic.php?f=2&t=73856

http://forum.mikrotik.com/viewtopic.php?f=13&t=62152

ある人は、MikroTikのWebProxyを使用することによる解決策について言及しています。これは、送信元IPアドレスをMikroTikのIPに変更し、Webサーバーが実際の訪問者ではなく同じIPですべての要求をログに記録するため、個人的には使用しません。 IP。

他に2つの解決策が考えられますが、それほど簡単ではありません。

解決策1:MikroTikのバージョン5.xを使用している場合、MikroTikにパッチを適用し、上部に最小限のDebianディストリビューションを追加するISOイメージがあります(または以下)それ。次に、HAproxyまたはその他のリバースプロキシをインストールして、必要なことを適切に実行できます(HAproxyまたはその他のリバースプロキシは、他の人がすでに述べたように、これを行う正しい方法です)

解決策2:別のアプローチはメタルーターを作成することです(ルーターボードでMikroTikを実行する場合、十分な空き容量がありますRAM =そしてあなたはnstremeを使用しません)そしてその上にopenwrtイメージをロードしますそしてあなたはそれからあなたがタスクを達成するためにあなたの好みのリバースプロキシをインストールすることができます。

おそらく解決策ではありません:もちろん、サポートチケットをMikroTikに送信して、=にバグがあることを確認または(ほとんどの場合)拒否することもできます。 NAT L7パケットマーキングあり。しかし、彼らのサポートにはあまり期待していません。ほとんどの場合、まったく役に立ちません。彼らのデフォルトの戦略は、誰もが愚かで、問題は常に続いているということです。 MikroTik自体ではなく、ユーザーの設定...

ルーター自体でこのタスクを処理できると便利です。これは、リバースプロキシを実行するためにさらに別のマシンを配置することができない制約のある環境に適しています。実稼働環境では(たとえ機能したとしても)この方法は使用しませんが。レイヤー7フィルターは、ルーターにとって非常に遅くて重いです。

更新:RB2011を使用しているのを見たので、ISO/Debianソリューションは機能しません(x86のみ)。 nstremeを使用していない場合(私はそうは思わない)、唯一の賭けは、openwrtでメタルーターを使用してリバースプロキシを実行することです。

3
Cha0s

HTTPの場合、リバースプロキシはトラフィックの分離を処理できます。最近のブラウザーは、必要なサイトを指定するHostヘッダーを送信するため、この方法が機能します。それは他のほとんどのプロトコルでは機能しません-あなたは彼らが要求したIPアドレスしか見ることができません。

他のプロトコルを別のサーバーに送信する場合は、ISPに2番目のパブリックIPを要求する必要があります。

0
Grant