Таблица MANGLE
предназначена для операций по классификации и маркировке пакетов и
соединений, а также модификации заголовков пакетов. В частности нас интересует цепочка
PREROUTING, которая позволяет маркировать пакет до маршрутизации.
Попробуем разобраться с веб сервером.
Допустим
у нас настроен NAT 80 порта с внешнего IP 192.168.1.116 (ISP1, первый
провайдер) на 80 порт веб сервера в локальной сети и необходимо
гарантировать, что все ответы, которые буду идти от веб сервера попадали
на шлюз первого провайдера.
Вот правило для таблицы NAT.
[mkt@MikroTik] > ip firewall nat add chain=dstnat dst-address=192.168.1.116
protocol=tcp dst-port=80 action=dst-nat to-addresses=192.168.0.2 to-ports=80
comment="NAT 80 port from ISP1 to local web server"
[mkt@MikroTik] > ip firewall nat print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=srcnat action=masquerade out-interface=!LOCAL
1 ;;; NAT 80 port from ISP1 to local web server
chain=dstnat action=dst-nat to-addresses=192.168.0.2 to-ports=80
protocol=tcp dst-address=192.168.1.116 dst-port=80
Первым шагом создадим правило в таблице
MANGLE.
[mkt@MikroTik] > ip firewall mangle add chain=prerouting src-address=192.168.0.2
protocol=tcp src-port=80 action=mark-routing new-routing-mark=to-isp1
[mkt@MikroTik] > ip firewall mangle print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=prerouting action=add-src-to-address-list protocol=tcp
address-list=test_list address-list-timeout=0s dst-port=23
1 chain=prerouting action=mark-routing new-routing-mark=to-isp1
passthrough=yes protocol=tcp src-address=192.168.0.2 src-port=80
Пакеты с локального адреса 192.168.0.2 с
80 порта буду маркироваться как to-isp1.
Вторым шагом добавим правило в таблицу маршрутизации.
[mkt@MikroTik] > ip route add gateway=192.168.1.249 routing-mark=to-isp1
[mkt@MikroTik] > ip route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 A S 0.0.0.0/0 192.168.1.249 r... 1
1 A S 0.0.0.0/0 192.168.1.249 r... 1
192.168.1.249 r...
192.168.222.1 r...
2 ADC 192.168.0.0/24 192.168.0.1 LOCAL 0
3 ADC 192.168.1.0/24 192.168.1.116 ISP1 0
4 ADC 192.168.222.0/24 192.168.222.100 ISP2 0
Все что приходит с маркером to-isp1 отправляется на шлюз первого провайдера.
Теперь усложним ситуацию, допустим второй
провайдер предоставят на выгодных условиях большую локальную сеть по
всему городу и через эту сеть объединены все 10 филиалов вашей фирмы.
Все филиалы и офис пользуются тем же сайтом, но какой смысл ходить на
него через первого провайдера, когда можно настроить доступ к нему
практически локально.
В
первую очередь добавляем правило в таблицу NAT, по которому все
запросы, пришедшие на внешний IP адрес, который предоставляет 2-ой
провайдер, на 80 порт будут переадресовываться на 80 порт локального веб
сервера.
[mkt@MikroTik] > ip firewall nat add chain=dstnat dst-address=192.168.222.100
protocol=tcp dst-port=80 action=dst-nat to-addresses=192.168.0.2 to-ports=80
comment="NAT 80 port from ISP2 to local web server"
[mkt@MikroTik] > ip firewall nat print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=srcnat action=masquerade out-interface=!LOCAL
1 ;;; NAT 80 port from ISP1 to local web server
chain=dstnat action=dst-nat to-addresses=192.168.0.2 to-ports=80
protocol=tcp dst-address=192.168.1.116 dst-port=80
2 ;;; NAT 80 port from ISP2 to local web server
chain=dstnat action=dst-nat to-addresses=192.168.0.2 to-ports=80
protocol=tcp dst-address=192.168.222.100 dst-port=80
Следующим шагом добавим в таблицу MANGLE
еще одно правило:
[mkt@MikroTik] > ip firewall mangle add chain=prerouting src-address=192.168.0.2
protocol=tcp src-port=80 dst-address=192.168.222.0/24 action=mark-routing
new-routing-mark=to-isp2
[mkt@MikroTik] > ip firewall mangle print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=prerouting action=add-src-to-address-list protocol=tcp
address-list=test_list address-list-timeout=0s dst-port=23
1 chain=prerouting action=mark-routing new-routing-mark=to-isp2
passthrough=yes protocol=tcp src-address=192.168.0.2
dst-address=192.168.222.0/24 src-port=80
2 chain=prerouting action=mark-routing new-routing-mark=to-isp1
passthrough=yes protocol=tcp src-address=192.168.0.2 src-port=80
Пакеты с локального
адреса 192.168.0.2 с 80 порта буду маркироваться как to-isp2 если
они предназначены для подсети второго провайдера.
Ну и в заключении
правило в таблице маршрутизации:
[mkt@MikroTik] > ip route add gateway=192.168.222.1 routing-mark=to-isp2
[mkt@MikroTik] > ip route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 A S 0.0.0.0/0 192.168.1.249 r... 1
1 A S 0.0.0.0/0 192.168.222.1 r... 1
2 A S 0.0.0.0/0 192.168.1.249 r... 1
192.168.1.249 r...
192.168.222.1 r...
3 ADC 192.168.0.0/24 192.168.0.1 LOCAL 0
4 ADC 192.168.1.0/24 192.168.1.116 ISP1 0
5 ADC 192.168.222.0/24 192.168.222.100 ISP2 0
Теперь на запросы, пришедшие со стороны
первого провайдера, ответ пойдет на шлюз первого провайдера, а на
запросы со стороны второго провайдера и из подсети второго провайдера
ответ пойдет на шлюз второго провайдера.