linux маршрутизация или наттинг с ip на петлевой интерфейс в качестве псевдонима
У меня есть
eth0:0 192.168.2.10 (for bgp network announce, no vlan, alias on eth0)
eth0.1 192.168.3.20 (for bgp session 1,vlan3 transport to bgp router)
eth0.2 192.168.4.30 (for bgp session 2,vlan4 transport to bgp router)
маршрут по умолчанию задается зеброй (192.168.3.1 или 192.168.4.1 - аварийное переключение)
когда внешний ip (192.168.1.100) пытается подключиться к 192.168.2.10 -> ответные пакеты проходят через 192.168.3.1 (где исходный ip для этого - 192.168.3.20). Это работает правильно. Но я хочу, чтобы адрес источника был 192.168.2.10. Основная проблема заключается в том, что asterisk работает на 192.168.2.10, а клиенты пытаются зарегистрировать sip с 192.168.1.100 -> ответы отправляются с 192.168.3.20, а пакеты отбрасываются на удаленной стороне.
Как это исправить / решить? или есть другой способ настройки интерфейсов? Основная идея состоит в том, чтобы переключить маршрутизацию на 192.168.2.10, если один из сеансов bgp завершается.
rp_filter=0 on all interfaces
Если я поставлю что-то вроде:
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -j SNAT --to-source 192.168.5.58
это тоже не работает.
Вся проблема в том, что звездочка отстает от нат в этой схеме. если я запускаю его на всех интерфейсах -> клиент sip соединяется нормально на 192.168.4.30 и 192.168.3.20 ip, но не на 192.168.2.10.
2 ответа
На Linux это не то же самое, что loopback на Cisco.
Любой адрес, назначенный для lo в Linux, должен использоваться исключительно для того, чтобы машина отправляла трафик себе; ядро будет рассматривать любой пакет с исходным IP-адресом, который соответствует тому, который назначен для lo, как марсианский и будет отброшен при входе - это жестко закодированное поведение. Ядро также случайно использует lo для отправки трафика к себе для IP-адреса на любом другом интерфейсе (например, если у eth0 есть 10.0.0.1, и вы пингуете его, tcpdump на lo покажет запрос и ответ эха)
Для эквивалента стилю петлевого интерфейса Cisco используйте модуль ядра "фиктивный" - имейте в виду, что фиктивный модуль также выступает в качестве приемной ямы для трафика, направляемого к нему (например, null0 в Cisco), поэтому любой адрес, который вы назначаете это должен быть /32, так как очевидно, что ничто не будет подключено к фиктивному интерфейсу.
Помещение адресов без обратной связи на lo
интерфейс должен вызывать странности. Я предлагаю вам приложить 192.168.2.10 к eth0
вместо.