我想将所有 TCP 数据包转发到一个接口(仅用于下载的专用互联网连接),并将所有 UDP 数据包转发到另一个接口(仅用于流媒体和视频游戏的专用互联网连接)。我该怎么做?我的路由器是 Mikrotik RB750。
答案1
如果您想要在两个本地连接之间拆分传入的网络流量,假设每个接口都有不同的地址,则可以使用 dst-nat 来实现:
/ip firewall nat
add in-interface=[incoming interface] action=dst-nat protocol=tcp dst-address=[TCP address]
add in-interface=[incoming interface] action=dst-nat protocol=udp dst-address=[UDP address]
如果您的意思是将传出的流量拆分到两个外部连接之间,并且每个连接都有不同的地址,那么您可以这样做:
/ip firewall nat
add chain=srcnat protocol=tcp action=src-nat to-address=[TCP connection address] out-interface=[TCP interface]
add chain=srcnat protocol=udp action=src-nat to-address=[UDP connection address] out-interface=[UDP interface]
答案2
您可以使用/ip route rule
和routing-mark
来强制路由路径。它的工作原理与Linux 下/ip firewall mangle
基本相同。ip rule
- 标记一组数据包,例如路由标记:R1
- 使用路由标记标记另一组数据包,例如:R2
- 为其中任何一个没有设置路由标记的添加默认网关。
- 为第二组添加第二个网关,并设置参数路由标记。
- 添加规则
/ip route rule
,强制对选定的数据包组使用路由表 R2 或 R1。
下面是我的示例配置,用于通过一个网关路由从路由器寻址的数据包并通过另一个网关转发的数据包:
[lapsio@CCR1009SWAG] > /ip firewall mangle export
/ip firewall mangle
add action=jump chain=prerouting jump-target=check-standard
add action=accept chain=check-standard in-interface=ether1-gateway #<- all incoming packets need to use "main" table in order to "see" local links
add action=accept chain=check-standard src-address-list=networkSERVICE #<-this is just example match
...
#some matching criteria of packets to NOT mark here with action=accept
...
add action=jump chain=check-standard jump-target=mark-standard
add action=mark-routing chain=mark-standard new-routing-mark=standard passthrough=no
[lapsio@CCR1009SWAG] > /ip route export
/ip route
add distance=1 gateway=192.168.0.6 routing-mark=standard
add distance=1 gateway=192.168.10.1
/ip route rule
add routing-mark=standard src-address=0.0.0.0/0 table=standard
这里我只使用了“R2”等价物,即“标准”——数据包通过 转发.0.6
。没有任何标记的数据包将通过 转发.10.1
。
答案3
虽然其他两个答案都是正确的,但我应该指出,这几乎肯定行不通。游戏和流媒体使用 TCP 和 UDP,如果它从一个地址获取 TCP 数据包,而从另一个地址获取 UDP,则可能行不通。我建议确定哪些主机在玩游戏和流媒体,并为每个主机定义单独的 src-nat 规则。
更好的问题是,为什么?这种模式有什么好处?