Networking

使用 Mikrotik RB2011 通過主機名 NAT 到同一埠上的兩個不同伺服器

  • August 29, 2018

我有一個 Mikrotik RB2011 路由器,執行 RouterOS,它通過靜態 IP 連接到網際網路。在我的區域網路中,我有兩台不同的伺服器,一台在 IP 192.168.89.11 上,另一台在 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 不同的埠)

到目前為止,我嘗試過的是以某種方式通過 mangle 標記數據包,然後在 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網路中的兩台伺服器在哪裡

我的目標是將其中的任何連接haf1a(例如haf1a.lala.com)重定向到相關伺服器(192.168.89.31)

謝謝你的出口。

事實證明,MikroTik 不支持此配置或存在錯誤。

根據數據包流程圖,如果我理解正確,dst-nat應該能夠檢測到數據包/連接標記,因為mangle prerouting是 before dst-nat。但是經過我自己的一些測試後,我和你一樣陷入了困境。 MikroTik 數據包流程圖

雖然 mangle/filter 可以匹配 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,因此網路伺服器將記錄所有具有相同 IP 的請求,而不是真正的訪問者IP。

我可以想到另外兩個解決方案,但不是那麼簡單。

解決方案 1: 如果您使用的是 MikroTik 5.x 版,則有一個 ISO 映像可以修補 MikroTik 並在其頂部(或下面)添加一個最小的 debian 發行版。然後您可以使用它來安裝 HAproxy 或您喜歡的任何其他反向代理,以正確完成您需要的工作(HAproxy 或任何其他反向代理是正確的方法,正如其他人已經提到的那樣)

解決方案 2: 另一種方法是創建一個元路由器(如果您在路由器板上執行 MikroTik,您有足夠的空閒 RAM 並且您不使用 nstreme)並在其上傳入一個 openwrt 映像。然後,您可以在其上安裝您喜歡的反向代理來完成任務。

很可能不是解決方案: 當然,您也可以向 MikroTik 發送支持票以確認或(很可能)否認 NAT 上存在帶有 L7 數據包標記的錯誤。但我對他們的支持不抱太大期望。大多數時候根本不會幫助你。他們的預設策略是每個人都是愚蠢的,問題總是出在使用者的配置上,而不是 MikroTik 本身……

能夠在路由器本身上處理此任務會很好。它適用於無法選擇讓另一台機器進行反向代理的受限環境。雖然我不會在生產環境中使用這種方法(即使它有效)。第 7 層過濾器對於路由器來說非常緩慢和沈重。

更新: 我剛剛看到您使用的是 RB2011,因此 ISO/debian 解決方案對您不起作用(僅適用於 x86)。如果您不使用 nstreme(我猜不是),那麼您唯一的選擇是使用帶有 openwrt 的元路由器為您執行反向代理。

引用自:https://serverfault.com/questions/654716