Привет, лор!
Есть машина, подключенная к сети через один физический интерфейс (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