
Я уже некоторое время ищу ответ на этот вопрос и не могу найти, поэтому решил спросить, прежде чем провести еще пару дней, бившись головой об стол.
У меня есть Ubuntu-бокс с двумя физическими интерфейсами и одним виртуальным интерфейсом.
eno1 - 172.16.0.100
eno2 - 172.16.0.101
eno1:0 - x.x.x.x
Что я хотел бы получить
- Для ответов на входящие пакеты я бы хотел, чтобы пакеты отправлялись на тот интерфейс, на который пришел запрос.
Для исходящих пакетов я бы хотел, чтобы они отправлялись по умолчанию...
a. eno1 - для пакетов, предназначенных для частных сетей (несколько несмежных диапазонов 172.16.x.0) b. eno1:0 - для пакетов, предназначенных для всех остальных сетей
Текущая настройка
список правил ip
0: from all lookup local
32760: from all to x.x.x.x lookup eno1:0
32761: from x.x.x.x lookup eno1:0
32762: from all to 172.16.0.101 lookup eno2
32763: from 172.16.0.101 lookup eno2
32764: from all to 172.16.0.100 lookup eno1
32765: from 172.16.0.100 lookup eno1
32766: from all lookup main
32767: from all lookup default
таблица списка маршрутов ip eno1:0
default via x.x.x.1 dev eno1
таблица списка маршрутов ip eno1
default via 172.16.0.1 dev eno1
172.16.0.0/24 dev eno1 scope link src 172.16.0.100
таблица списка маршрутов ip eno2
default via 172.16.0.1 dev eno2
172.16.0.0/24 dev eno2 scope link src 172.16.0.101
список маршрутов ip
default via 172.16.0.1 dev eno1 onlink
x.x.x.0/23 dev eno1 proto kernel scope link src x.x.x.x
172.16.0.0/24 dev eno2 proto kernel scope link src 172.16.0.101
172.16.0.0/24 dev eno1 proto kernel scope link src 172.16.0.100
Значения sysctl для eno1 и eno2
arp_filter=1
arp_ignore=1
arp_announce=2
Проблемы
- Я могу время от времени добираться до eno1 и eno2 из диапазонов за пределами их подсетей, но до eno1:0 я вообще не могу дотянуться.
- С коробки я вообще не могу выйти в интернет (публичные IP-адреса).
решение1
Нашел — или, скорее, заново открыл — ответ...
Проблема в том, что Unix считает, что хост — это сетевая сущность, а не порт, что вызывает все виды проблем arp на многосетевых серверах. Так что, по сути, мне нужно было ограничить ответы arp на интерфейсе IP-адресами, связанными с этим интерфейсом, в противном случае Unix будет отвечать на ЛЮБОМ интерфейсе независимо от IP-адреса — что действительно сбивает с толку все остальные устройства в подсети.
Итак... Установлены arptables
sudo apt-get -y install arptables
Ограничить ответы на каждом интерфейсе IP-адресами на интерфейсе
sudo arptables -n -v --line-numbers -L
Chain INPUT (policy DROP 6011K packets, 168M bytes)
1 -j ACCEPT -i eno1 -o * -d x.x.x.x , pcnt=2496 -- bcnt=69888
2 -j ACCEPT -i eno1 -o * -d 172.16.0.100 , pcnt=294 -- bcnt=8232
3 -j ACCEPT -i eno2 -o * -d 172.16.0.101 , pcnt=294 -- bcnt=8232
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
1 -j ACCEPT -i * -o eno1 -s x.x.x.x , pcnt=2503 -- bcnt=70084
2 -j ACCEPT -i * -o eno1 -s 172.16.0.100 , pcnt=295 -- bcnt=8260
3 -j ACCEPT -i * -o eno2 -s 172.16.0.101 , pcnt=294 -- bcnt=8232
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
И вуаля, все IP-адреса отвечают на своих правильных портах.
Мужик! Надеюсь, я больше этого не забуду!