Задачка для тех кто на самом деле разбирается в маршрутизации!
Имеем один физический интерфейс eth0:
DEVICE="eth0"
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
BRIDGE=virbr0
На виртуальном интерфейсе virbr0, настроено несколько внешних IP:
DEVICE="virbr0"
TYPE="Bridge"
BOOTPROTO="static"
IPADDR0=XXX.1.1.2
PREFIX0=24
GATEWAY=XXX.1.1.1
IPADDR1=YYY.1.1.2
PREFIX1=24
GATEWAY1=YYY.1.1.1
IPADDR2=ZZZ.1.1.2
PREFIX2=24
GATEWAY2=YYY.1.1.1
Все корректно работает, можно менять маршрут по умолчанию на любой из: GATEWAY, GATEWAY1 или GATEWAY2
Поднимаю OpenVPN и поднимаю tap интерфейсы:
/sbin/ifconfig tap0 inet 10.9.0.1 netmask 255.255.255.0
/sbin/ifconfig tap0:0 inet 10.9.0.2 netmask 255.255.255.0
/sbin/ifconfig tap0:1 inet 10.9.0.3 netmask 255.255.255.0
Подключается клиент и получает IP: 10.9.0.10
Теперь самое главное, я хочу чтобы в зависимости какой у клиента установлен основной шлюз, выполнялись РАЗНЫЕ правила SNAT, а именно исходящий IP.
Сейчас стоит такое правило:
iptables -t nat -A POSTROUTING -s 10.9.0.10/32 -o virbr0 -j SNAT --to-source XXX.1.1.2
Меняя --to-source на одно из 3-х: XXX.1.1.2, YYY.1.1.2, ZZZ.1.1.2 корректно меняется через какой внешний IP натится клиент.
Я хочу так переделать правило, чтобы оно отрабатывало не по IP локального клиента -s 10.9.0.10/32, а по IP шлюза на который пришел запрос на маршрутизацию, т.е.
- пришел запрос на IP шлюза 10.9.0.1 отработал NAT --to-source XXX.1.1.2
- пришел запрос на IP шлюза 10.9.0.2 отработал NAT --to-source YYY.1.1.2
- пришел запрос на IP шлюза 10.9.0.3 отработал NAT --to-source ZZZ.1.1.2
Я пытался маркировать пакеты, но не получается, не до конца понимаю цепочку прохождения пакетов на маршрутизаторе..
Подскажите пожалуйста как настроить?
OS Centos 7