我有一个Mikrotik RB2011路由器,运行RouterOS,通过静态IP连接到互联网。 在我的局域网中,我有两台不同的服务器,一台是IP 192.168.89.11,另一台是192.168.89.12
我的DNS(在cloudflare上)将myfirstserver.com和mysecondserver.comparsing为我的路由器的静态IP。
现在,我想要做的是以某种方式分开的stream量,所以myfirstserver.com的所有stream量去192.168.89.11和mysecondserver.com的stream量去192.168.89.12(都在端口80.我知道我可以改变端口但是如果这些服务器是公开可用的,则没有用户将设置不同于80的端口)
到目前为止,我尝试过的方法是用标记来标记数据包,然后在NAT上使用这个标记来做正确的转发。
我尝试通过内容或第7层协议正则expression式来标记数据包(如果操作是日志,它们可以正常工作,我可以看到它们被正确logging)。
问题是,在我标记它们之后,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我的两个服务器在我的本地networking
我的目标是将与haf1a (例如haf1a.lala.com )的任何连接redirect到相关的服务器(192.168.89.31)
感谢您的出口。
事实certificate,这个configuration不被MikroTik支持或者有一个错误。
根据数据包stream程图,如果我理解正确, dst-nat应该能够检测到数据包/连接标记,因为在dst-nat之前, mangle prerouting 。 但经过我自己的一些testing后,我和你一样卡住了。 
虽然mangle / filter可以匹配标记的数据包(甚至没有标记,但是通过直接在规则上使用L7filter),它只是不匹配任何数据包。
在MikroTik论坛上也有各种相关的线索,似乎没有find一个解决scheme。
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解决scheme,我个人不会使用这个解决scheme,因为它会把源IP地址改成MikroTik的IP地址,因此web服务器会用相同的IP地址logging所有的请求, IP地址。
我可以想到另外两个解决scheme,但并不那么简单。
解决scheme1:如果您使用的是MikroTik 5.x版本,则会有一张ISO映像文件修补MikroTik,并在最上面(或下面)添加一个最小化的debian发行版。 那么你可以使用安装HAproxy或任何其他反向代理来完成你需要的东西(HAproxy或任何其他反向代理是正确的方式来做到这一点,因为其他人已经提到)
解决scheme2:另一种方法是创build一个metarouter(如果你在一个路由器板上运行MikroTik,那么你有足够的空闲RAM,并且不使用nstreme)并在其上加载一个openwrt图像。 然后你可以安装一个你喜欢的反向代理来完成任务。
很可能不是一个解决scheme:当然,你也可以发送支持票给MikroTik,以确认或者(很有可能)否认NAT上有一个L7数据包标记的错误。 但我不会期望他们的支持。 大多数时间根本无法帮助你。 他们的默认策略是每个人都是愚蠢的,问题总是在用户的configuration上,而不是在MikroTik本身上。
能够在路由器本身上处理这个任务是很好的。 它适合于在另一台机器上执行反向代理的约束环境不是一个选项。 虽然我不会在生产环境中使用这种方法(即使它起作用)。 第7层filter对于路由器来说是相当慢和沉重的。
更新:我刚刚看到你正在使用RB2011,所以ISO / debian解决scheme不适合你(仅适用于x86)。 如果你不使用nstreme(我猜不是),那么你唯一的select就是使用openwrt的metarouter来为你做反向代理。
对于HTTP,反向代理可以处理分离的stream量。 它的工作原理是因为现代浏览器发送一个主机头指定他们想要的站点。 这不适用于大多数其他协议 – 你只能看到他们要求的IP地址。
如果您希望其他协议转到单独的服务器上,则需要从ISP请求第二个公共IP。