контекст
Есть 2 сервера:
сервер1 - eth0 10.129.76.16 eth0.2 192.168.0.103
сервер2 - eth0 10.129.79.1 eth0.2 192.168.62.101
Адреса 192.xxx подключены к одному и тому же vlan (vlan2) и могут видеть друг друга. Адреса 10.xxx подключены к разным vlan, которые не могут видеть друг друга.
по запросу Дэвида Шварца: таблица маршрутизации на сервере 1:
~$ sudo route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.129.76.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0.2
0.0.0.0 192.168.61.254 0.0.0.0 UG 100 0 0 eth0.2
таблица маршрутизации на сервере 2:
~$ sudo route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 <public IP gw> 0.0.0.0 UG 100 0 0 eth0.11
10.129.79.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
<public IP> 0.0.0.0 255.255.255.128 U 0 0 0 eth0.11
192.168.0.0 0.0.0.0 255.255.192.0 U 0 0 0 eth0.2
Проблема:
Когда я пингую с сервера 1 на сервер 2, кажется, что пакеты не приходят и наоборот. Когда я проверяю маршруты (route -n), я вижу, что gw по умолчанию использует eth0.2 на обоих серверах. Но когда я использую arping, я получаю ответ в одну сторону (с сервера 2 на сервер 1), но не получаю ответа в обратную сторону.
arping 192.168.62.101
ARPING 192.168.62.101 from 10.129.76.16 eth0
^CSent 2 probes (2 broadcast(s))
Received 0 response(s)
Как вы видите, он использует адрес 10.xxx вместо 192.xxx. И как я уже говорил, адрес 10.xxx недоступен с другого сервера.
Когда я заставляю arping использовать eth0.2, это работает.
У меня нет проблем с пингом других серверов ни с одного из этих двух серверов.
Я видел это в таблицах ARP:
~# arp -n | grep 192.168.0.103
192.168.0.103 (incomplete) eth0
и
~# arp -n | grep 192.168.62.101
Вопрос
вполне очевидно... Как мне сделать так, чтобы эти серверы снова увидели друг друга?
Вещи, которые я связал
очистите соответствующие записи в arptable и попытайтесь избавиться от (неполных) Но я думаю, что самая большая проблема в том, что eth0 используется вместо eth0.2 для пакетов от сервера 1 к серверу 2
Из-за замечания Дэвида Шварца о таблицах маршрутизации я добавил туда маршрут, определяющий хост. Я добавил
192.168.0.103 0.0.0.0 255.255.255.255 UH 0 0 0 eth0.2
и
192.168.62.101 0.0.0.0 255.255.255.255 UH 0 0 0 eth0.2
на соответствующие серверы, но это не решило проблему, поэтому я предполагаю, что проблема не в маршрутизации.
Мое предположение
Я полагаю, проблема заключается в следующем.
~$ arp -n | grep 192.168.0.103
192.168.0.103 (incomplete) eth0
но я не могу удалить эту запись. (arp -d 192.168.0.103 не дает эффекта)
Спасибо за прочтение и еще больше спасибо за ответ!
решение1
Вот фрагмент:
arpping не учитывает локальную таблицу маршрутизации:
== mbrownnyc [gateway/web/freenode] has joined ##networking
[10:14] <mbrownnyc> mAniAk-_-: any idea why, if his routing table reflects the proper interface to route 192.168.0.0/18 packets, why when he `arping 192.168.62.101` the kernel would think to make the source address that of the other interface?
[10:14] <mbrownnyc> it's very very weird to me
[10:16] <mbrownnyc> tafelpoot: unless arping has a bug in the code or something?
[10:17] <mbrownnyc> can you use another piece of software? like hping?
[10:17] <catphish> mbrownnyc: arping doesn't respect the routing table
[10:17] <catphish> you have to specify the interface manually
[10:17] <mbrownnyc> catphish: voila!
[10:18] <catphish> no idea why, it's just never been a feature of it, it seems to use the first ethernet interface unless you tell it otherwise
[10:19] <mbrownnyc> catphish: interesting catphish that's the whole "problem" here, the testing mechanism, I guess
используйте icmp для проверки:
[10:25] <catphish> mbrownnyc: that guy is testing with arping which makes no sense since arping doesn't use the routing table
[10:26] <catphish> it should be ping
[10:26] <catphish> and if ping fails, arping with an interface specified
[10:26] <mAniAk-_-> GG
[10:26] <catphish> oh, it does work when forcing arping to use the right address
[10:27] <catphish> so im not sure what the problem might be
[10:27] <mAniAk-_-> ARPING 192.168.62.101 from 10.129.76.16 eth0
[10:27] <mAniAk-_-> not eth0.2
[10:28] <catphish> indeed
[10:28] <catphish> because the interface wasn't specified
[10:28] <catphish> apparantly it works when the interface is specified
[10:28] <catphish> so i don't see the problem
в порядке ли ваши VLAN?
[10:29] <catphish> it's also possible the the vlan config is messed up, i don't like mixing native and tagged vlans like that
[10:29] <mAniAk-_-> yeah i thought so too
решение2
Вы не упомянули, какое ядро вы используете или какую версию arping
, и есть вероятность ошибки в одном или другом. Тот факт, что вы можете успешно arping
указать подинтерфейс, указывает на то, что все ваши сети уровня 2 ведут себя правильно.
Попробуйте использовать ip route get 192.168.62.101
on server1, чтобы напрямую спросить ядро, как оно будет отправлять ваш трафик. Исходя из таблиц маршрутизации, которые вы опубликовали, отправка через eth0.2 — это явно правильное поведение, и если ip route get
возвращается другой ответ, возможно, вы смотрите на ошибку ядра. Если он возвращает правильный ответ, то arping
виноват, но это кажется маловероятным.
Эту (incomplete)
запись не нужно удалять; это заполнитель, который сообщает ядру, что оно пыталось отправить ARP-запрос на этот IP-адрес, поэтому ответ ARP следует считать действительным и неатака ARP-отравления, но ответа не получил. Истечет время ожидания.