Два провайдера и распределение по каналам
После добавления в нашу тестовую конфигурацию второго провайдера появилась проблема ответа определенных сервисов по нужному каналу, если обращаться к ним из вне через NAT.
На пример веб сервер, выведенный через NAT на IP адрес первого провайдера получает запрос, а вот вероятность того, что ответ пойдет по нужному каналу уже не 100%. Какой же он после этого веб сервер?
Решить эту проблему нам поможет механизм маркировки пакетов.
Таблица 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
Теперь на запросы, пришедшие со стороны первого провайдера, ответ пойдет на шлюз первого провайдера, а на запросы со стороны второго провайдера и из подсети второго провайдера ответ пойдет на шлюз второго провайдера.
(c) slagovskiy.blogspot.ru