我有一台 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)
答案1
谢谢你的导出。
事实证明,MikroTik 不支持此配置,或者存在错误。
根据数据包流程图,如果我理解正确的话,dst-nat
应该能够检测到数据包/连接标记,因为mangle prerouting
是在之前dst-nat
。但是经过我自己的一些测试后,我遇到了和你一样的问题。
虽然 mangle/filter 可以匹配标记的数据包(甚至没有标记,而是直接使用规则上的 L7 过滤器),但在 nat 上它根本不匹配任何数据包。
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 记录所有请求。
我可以想到另外两种解决方案,但不是那么简单。
解决方案 1: 如果您使用的是 MikroTik 5.x 版本,则有一个 ISO 映像可以修补 MikroTik 并在其上(或在其下)添加一个最小的 debian 发行版。然后您可以使用它来安装 HAproxy 或任何其他您喜欢的反向代理,以正确完成您的需要(正如其他人已经提到的,HAproxy 或任何其他反向代理是执行此操作的正确方法)
解决方案 2: 另一种方法是创建一个 metarouter(如果您在 routerboard 上运行 MikroTik,您有足够的可用 RAM 并且不使用 nstreme)并在其上加载 openwrt 映像。然后您可以在其上安装您喜欢的反向代理来完成任务。
很可能不是一个解决方案: 当然,您也可以向 MikroTik 发送支持请求,以确认或(最有可能)否认带有 L7 数据包标记的 NAT 存在错误。但我对他们的支持不会抱有太大期望。大多数时候根本帮不上忙。他们的默认策略是每个人都很愚蠢,问题总是出在用户的配置上,而不是 MikroTik 本身……
如果能够在路由器本身上处理这项任务就好了。它适用于受限环境,在这些环境中,再放置另一台机器来执行反向代理不是一种选择。不过我不会在生产环境中使用这种方法(即使它有效)。第 7 层过滤器对于路由器来说非常慢且繁重。
更新: 我刚看到你使用的是 RB2011,所以 ISO/debian 解决方案不适用于你(它仅适用于 x86)。如果你不使用 nstreme(我猜没有),那么你唯一的选择是使用带有 openwrt 的 metarouter 为你执行反向代理工作。
答案2
对于 HTTP,反向代理可以处理流量分离。它之所以有效,是因为现代浏览器会发送一个 Host 标头来指定它们想要的站点。这对于大多数其他协议不起作用 - 您只能看到它们请求的 IP 地址。
如果您希望其他协议转到单独的服务器,则需要向您的 ISP 请求第二个公共 IP。