LINUX.ORG.RU
ФорумAdmin

Один сервер, несколько ipv4

 , , ,


0

2

Привет, лор!

Есть машина, подключенная к сети через один физический интерфейс (eno1). Под эту машину выделено несколько белых IP-адресов. Как раскидать эти несколько адресов по виртуальным интерфейсам так, чтобы и сервер по каждому из белых адресов отвечал, и с самого сервера можно было выходить в сеть с разных IP-адресов, используя эти самые виртуальные интерфейсы?

Что было испробовано: создание dummy-интерфейсов через systemd-networkd, назначение им одного из неиспользуемых белых адресов, с указанием шлюза (такого же, как и у физического интерфейса eno1): в таком случае извне машина доступна и пингуется по всем назначенным ей адресам (как тому, что висит на физическом интерфейсе, так и тем, что на виртуальных), однако с самого сервера нельзя, к примеру, ничего попинговать с виртуального интерфейса: ping -I virt0 на адрес шлюза или любого хоста в интернете выдаст destination host unreachable:

root@srv:~# ping -I virt0 203.0.113.1
PING 203.0.113.1 (203.0.113.1) from 203.0.113.20 virt0: 56(84) bytes of data.
From 203.0.113.20 icmp_seq=1 Destination Host Unreachable

Интуиция и гуглёж мне подсказывают, что здесь пригодится policy based routing, однако попытка создать новую таблицу маршрутизации не помогла (или я чего не так делаю):

# echo 101 virt0-route >> /etc/iproute2/rt_tables
# ip route add default via 203.0.113.1 dev virt0 table virt0-route
# ip rule add from 203.0.113.20 lookup virt0-route

Вывод ip r:

default via 203.0.113.1 dev eno1 onlink 
default via 203.0.113.1 dev virt0 proto static 
203.0.113.0/24 dev eno1 proto kernel scope link src 203.0.113.11 
203.0.113.0/24 dev virt0 proto kernel scope link src 203.0.113.20

И route -n:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         203.0.113.1     0.0.0.0         UG    0      0        0 eno1
0.0.0.0         203.0.113.1     0.0.0.0         UG    0      0        0 virt0
203.0.113.0     0.0.0.0         255.255.255.0   U     0      0        0 eno1
203.0.113.0     0.0.0.0         255.255.255.0   U     0      0        0 virt0


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

Есть разные варианты.

  1. Прописать алиасы на интерфейс. роутить трафик через снат на указанные адреса. Как вариант, вешать сокс-прокси и прозрачно или напрямую направлять приложения на них.

2 Использовать openvswitch. Он позволяет создавать нормальный бридж и интерфейсы на нем.

AVL2 ★★★★★
()

Если выделена сеть и она маршрутизируется на этот сервер, то на внешнем интерфейсе сервера вешаете один публичный адрес, прочие сервисы или серверы в локальной за этим серверов можете SNATить (NATить) в соответствующий другой IP адрес это внешней сети.

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

ip a a a.a.a.a/mask dev eno1
ip a a b.b.b.b/mask dev eno1
ip a a с.с.с.с/mask dev eno1
ip a a d.d.d.d/mask dev eno1

всё.

При использовании dummy интерфейсов и ping -I virt0 к такому сетевому интерфейсу физически не подключена ни одна среда передачи данных (медь, оптика, wifi) и так работать не будет.

А вот пинговаться с внешнего мира адрес на virt0 может, если включить форвард пакетов между интерфейсами.

Но тебе просто нужно назначить на внешнем сетевом интерфейсе все нужные адреса. Если всё сервисы находятся на самом сервере.

Если сервисы находятся на серверах в локальной сети, то назначать IP адреса на внешней интерфейс не нужно, нужно делать DNAT с внешнего адреса на сервер в локальной сети и SNAT оnветных пакетов от сервера во внешней сети на публичный адрес.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)