Маленький, но гордый параметр, о котором стоит немного поговорить и посмотреть, как и при каких обстоятельствах мы можем его изменять.

Для начало нам необходимо выяснить каким образом MikroTik выбирает себе IP адрес источника перед тем как отправить пакет.

  1. Если явно указан адрес источника. Вы можете указать src или local адрес в различных параметрах. Например при настройке GRE или IPIP туннеля, параметр local адрес отвечает именно, за поле src в заголовке пакета. Если вы запускаете программу Ping вы можете указать IP адрес источника.
  2. Перекладывание на плечи ядру RouterOS выбор адрес источника src, если маршрутизатор генерирует какой-то трафик и при этом явным образом не указан адрес источника Пункт 1, то MikroTik начинает процедуру выбора IP адреса, и она зависит от таблицы маршрутизации.

И так для понимания приведём простой пример.

[admin@MikroTik.Me] /ip route> print where !ospf !routing-mark     
 #      DST-ADDRESS        PREF-SRC        GATEWAY            DISTANCE
 0 A S  0.0.0.0/0                          10.188.48.1               1
 1 ADC  10.188.48.0/22     10.188.48.99    ether1                    0
 2 ADC  10.199.1.1/32      10.199.1.2      l2tp-srv-01               0
 3 ADC  10.255.200.1/32    10.255.200.2    ipip-trm                  0
 4 ADC  172.20.17.0/24     172.20.17.1     Bridge-Local              0

Перед вами таблица маршрутизации моего домашнего маршрутизатора, я убрал из вывода протокол OSPF и именованные таблица маршрутизации, чтобы не было простынки 400 маршрутов.

Когда вы назначаете IP адрес на интерфейс, RouterOS автоматически создаёт connected маршрут, до сети, которая высчитывается из адрес и маски которую вы указали при назначении IP адреса, а также устанавливается параметр pref-src который соответствует непосредственно назначенному IP адресу

Если у вас несколько IP адресов из одной подсети, то параметр pref-src будет назначен, самой первой записи IP адресу, обратите внимание не самому низкому IP адресу, а к тому IP адресу, который был первый назначен на интерфейс.

Теперь попробуем запустить ping до адреса 10.255.200.1

[admin@MikroTik.Me] > /ping 10.255.200.1
  SEQ HOST                                     SIZE TTL TIME  STATUS                                                                                                                        
    0 10.255.200.1                               56  64 4ms  
    1 10.255.200.1                               56  64 4ms  
    sent=2 received=2 packet-loss=0% min-rtt=4ms avg-rtt=4ms max-rtt=4ms 

Как видите ping прошёл, теперь взглянем на нашу таблицу маршрутизации и найдём наилучшим маршрут для IP адреса 10.255.200.1

3 ADC  10.255.200.1/32    10.255.200.2    ipip-trm                  0

Так как при запуске ping мы явно не указали с какого IP адреса отправлять пакет, то ядро RouterOS выбрало наилучший маршрут для IP адреса назначения, и в данном маршруте указан параметр pref-src, именно такой IP адрес был использован при генерации пакетов.

Попробуем явно указать IP адрес, маршрут до которого на хосте 10.255.200.1 отсутствует.

[admin@MikroTik.Me] > /ping 10.255.200.1 src-address=10.188.48.99
  SEQ HOST                                     SIZE TTL TIME  STATUS                                                                                                                        
    0 10.255.200.1                                            timeout                                                                                                                       
    1 10.255.200.1                                            timeout                                                                                                                       
    2 10.255.200.1                                            timeout                                                                                                                       
    sent=3 received=0 packet-loss=100% 

Как видите, к нам не возвращается пакет, так как на хосте 10.255.200.1 маршрут до адреса 10.188.48.99 не соответствует интерфейсу до нашего маршрутизатора. По простому он улетает куда-то не туда.

А теперь попробуем сделать ping до хоста 8.8.8.8

[admin@MikroTik.Me] > /ping 8.8.8.8
  SEQ HOST                                     SIZE TTL TIME  STATUS                                                                                                                        
    0 8.8.8.8                                    56  46 6ms  
    1 8.8.8.8                                    56  46 6ms  
    sent=2 received=2 packet-loss=0% min-rtt=6ms avg-rtt=6ms max-rtt=6ms

Взглянем на таблицу маршрутизации и определим наилучший маршрут для адреса 8.8.8.8

 0 A S  0.0.0.0/0                          10.188.48.1               1

Pref-source не указан, так какой IP адрес будет выбран тогда?

А здесь кроется маленький нюанс о котором многие забывают, а может и не знают.

Любое сетевое устройство когда выбирает из таблицы маршрутизации маршрут, всегда делает столько итераций поиска, сколько понадобится пока не найдёт интерфейс выхода. Именно для уменьшения нагрузки на процесс выбора маршрута необходимы параметры scope, но об этом в другой раз.

И так маршрут найден

 0 A S  0.0.0.0/0                          10.188.48.1               1

MikroTik смотрит на поле pref-src если указанно значение, то в пакете будет установлен адрес источника, но в нашем случае параметра нет.

Так как адрес шлюза не соответствует интерфейсу, то маршрутизатор повторяет процесс поиска маршрута, но уже не для адреса 8.8.8.8 а для адреса 10.188.48.1

И результат поиска будет

1 ADC  10.188.48.0/22     10.188.48.99    ether1                    0

И в данном случает pref-src указан, адрес источника если на данный момент не установлен будет указан как 10.188.48.99.

Так как маршрутизатор, всегда опускается по цепочке до маршрута который указывает на интерфейс, а такой маршрут connected заполняется автоматически на основании IP адреса назначенного на интерфейс, MikroTik всегда назначает какой-нибудь IP адрес на интерфейсе.

Например если бы в нашем случае у нас было два IP адреса из одно сети, мы бы могли указать на дефолтом маршруте значение pref-src тот ip адрес с которого необходимо отправлять трафик в интернет.

Обратите внимание значение pref-src должен быть IP адрес назначенный на любой интерфейс и включен, в противном случае такой маршрут становиться не действительным.

Если вы используете OSPF и у вас есть loopback адрес, и в свою очередь вы данные loopback адреса редистрибьютите в сеть OSPF, то вы можете сделать следующий lifehack

[admin@MikroTik.Me] > /routing filter add chain=ospf-in set-pref-src=172.31.255.1

Естественно адрес 172.31.255.1 заменить на адрес loopback того маршрутизатора, на котором будет выполняться данная команда.

После данной команды не забудьте поставить правило выше discard-а, и того при тоже трассировке вы в списке хопов будете видеть не внутренние адреса интерфейсов а адреса loopback-ов, что значительно удобнее.

Рассказать друзьям