LINUX.ORG.RU
ФорумAdmin

Разный внешний IP в зависимости на какой внутренний IP шлюза пришел запрос - маршрутизация

 , , ,


0

1

Задачка для тех кто на самом деле разбирается в маршрутизации!

Имеем один физический интерфейс 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



Последнее исправление: cetjs2 (всего исправлений: 4)

ip-шлюза на который пришел запрос на маршрутизацию это бред. Нет никакого запроса на маршрутизацию, просто приходит пакет. В этом пакете нигде нет адреса шлюза, да и клиенту он не особо нужен, особенно на p2p линках.

Я не понял, что у вас за tap0:0 и tap0:1, если это просто алиасы, созданые через ifconfig, то это фикция, а не интерфейс и по ним не отследить клиента.

mky ★★★★★
()

В пакетах указывается MAC-адрес шлюза(случаи с туннельными интерфейсами пока опустим для простоты), а не IP. IP шлюза на оконечных устройствах придуман исключительно для удобства - чтобы вычислять MAC-адрес(и в некоторых случаях - имя интерфейса через который отправлять пакет).

Так что в общем случае тебе нужны несколько интерфейсов с разными MAC-адресами, чтобы такая схема заработала - простыми IP-алиасами на Ethernet-интерфейсе ты это не разрулишь. Тут напрашивается мост и netns, но это попахивает тем еще извратом.

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

ТС пишет про openvpn, и если я правильно понял, он хочет чтобы клиент мог определять через какой адрес его будут НАТить.

И тогда, получается, что ему нужно делать tap интерфейс, как-то делать несколько mac-адресов у сервера на этом tap и дальше уже на этом строить маршрутизацию/NAT.

mky ★★★★★
()
Последнее исправление: mky (всего исправлений: 1)
Ответ на: комментарий от mky

честно говоря вообще не понял, зачем такое может понадобится, что мешает мне думать над тем, как это реализовать.

zgen ★★★★★
()

Мне кажется что можно, как было сказано выше, поднять несколько отдельных интерфейсов (не алиасов) и уже на них натить.

anc ★★★★★
()
Ответ на: комментарий от zgen

zgen да, я понимаю вас, поэтому и обратился к разбирающимся людям т.к. задача не тривиальная, тривиальные все сделаны.

Как верно упомянул mky это нужно для того чтобы клиент мог определять через какой адрес его будут НАТить.

Сейчас это решено тем, что на клиенте поднимается несколько VPN соединений на один сервер, ему выдаются несколько адресов, а на сервер настроено для каждого из них:

iptables -t nat -A POSTROUTING -s 10.9.0.10/32 -o virbr0 -j SNAT --to-source XXX.1.1.2

А я хочу не несколько, а поднять один тунель на клиенте и меняя на нем IP шлюза менять внешний IP. Возможно есть другой способ делать это через 1 тунель, я пока его не осознал...

Pinkbyte могли бы вы привести примеры как с учетом MAC интерфейса шлюза назначить разные правила NAT?

lunix
() автор топика
Ответ на: комментарий от lunix

Вы или «глухой или немой» вам предложили вариант несколько отдельных интерфейсов, а не алиасов на одном.

anc ★★★★★
()
5 апреля 2018 г.
Ответ на: комментарий от anc

Вернусь к вопросу т.к. не решил задачу.. mky, anc

Вопрос: Хочу добиться сменой IP шлюза на на vpn-клиенте (или маршрута) изменения IP адреса NATa на выходе с сервера VPN.

1. OpenVPN сервер поднимается на tap0 интерфейсе, назначаю ему IP:

/sbin/ifconfig tap0 inet 10.9.0.1 netmask 255.255.255.0

2. Клиент конектится 10.9.0.2/24

3. Поднимаю второй tap1:

ip tuntap add tap1 mode tap
ifconfig tap1 10.9.0.99/24

4. На сервере прописаны правила для маркировки пакетов, если они придут на второй tap интефейс:

iptables -t mangle -A PREROUTING -m connmark --mark 0 -i tap5 -j CONNMARK --set-mark 10

5. Далее правила NATа на сервере, в зависимости от того на какой IP шлюза клиент присылает пакеты:

iptables -t nat -A POSTROUTING -s 10.9.0.2/32 -o virbr0 -m connmark --mark 10 -j SNAT --to-source WAN_IP_1
iptables -t nat -A POSTROUTING -s 10.9.0.2/32 -o virbr0 -m connmark --mark 0 -j SNAT --to-source WAN_IP_2

C клиента пингуются 10.9.0.1 и 10.9.0.99, но если я меняю основной маршрут на клиенте на 10.9.0.99 маршрутизация не идет. У меня есть подозрения что на клиенте нельзя указать шлюзом IP отличный от IP который назначен tap интерфейсу на котором поднять OpenVPN сервер..

Буду рад любому совету или предложению попробовать другие варианты..

lunix
() автор топика
Ответ на: комментарий от lunix

Наискосок:
tap0 tap1 и «внезапно» tap5.
rpfilter
ip r s
ip rule s
arp -an
смотреть tcpdump

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.