Выводя из эксплуатации один из серверов, я вспомнил о связанном с ним забавном случае.
Некоторое время назад потребовалось иметь на одном физическом интерфейсе два реальных ip-адреса. Провайдер за долю малую радостно выдал дополнительный, естественно, из той-же подсети. Ничего, как говориться, не предвещало. Я бодро и весело цепляю его алиасом к основному и ... И ничего! Звоню в поддержку, там долго чешут репу, а опосля выдают: у адресов должны быть разные MAC-и. Мои стенания о несуразности этого требования (тому провайдеру было пофиг на то, какие маки светятся на клиентской стороне) разбились о суровое: "Сделать мы ничего не можем от слова совсем. Страдайте!".
Таким образом, по их логике, в дополнени к трём имеющимся в сервере эзернетам я должен был воткнуть ещё один? А потом что? Два хвоста через свитче-хаб соединить с вводом? Серьёзно? А что с машрутом по умолчанию делать?
Тогда-то и созрел хитрый план по использованию macvlan, который, ожидаемо, упёрся в default gateway, единственный для обоих адресов. Решение, как мне кажется, получилось симпатичным. )
В /etc/modules добавляем macvlan, в логах видим "device eth1 entered promiscuous mode".
Чтобы macvlan работал, отключаем фильтрацию пакетов на физическом интерфейсе: sysctl net.ipv4.conf.eth1.rp_filter=0
Здесь всё просто.
ip link add link eth1 address 10:01:01:01:01:01 eth1v1 type macvlan mode private
ip link add link eth1 address 20:02:02:02:02:02 eth1v2 type macvlan mode private
ip a add Z.Z.Z.10/24 brd Z.Z.Z.255 dev eth1v1
ip a add Z.Z.Z.20/24 brd Z.Z.Z.255 dev eth1v2
ip link set eth1 up
ip link set eth1v1 up
ip link set eth1v2 up
А здесь начинается магия. Маршрутов по умолчанию становится два. Маркируем исходящие с дополнительного адреса пакеты и
отправляем их в наружу. В итоге всё работает. )
ip route add default via Z.Z.Z.1 dev eth1v1 table main
ip route add default via Z.Z.Z.1 dev eth1v2 table 102
iptables -t mangle -A OUTPUT -s Z.Z.Z.20/32 ! -d 192.168.0.0/16 -j MARK --set-xmark 0x39/0x39
ip rule add from all fwmark 0x39/0x39 lookup 102