Я построил эту простую конфигурацию:
---------------- ----------------
| Linux host A | <----- patch cable -------> | Linux host B |
---------------- ----------------
Затем я настроил 2 VLAN на каждом хосте:
eth1 eth1
| |
|-- eth1.2 -> 192.168.1.2/24 |-- eth1.2 -> 192.168.1.4/24
|-- eth1.3 -> 192.168.1.3/24 |-- eth1.3 -> 192.168.1.5/24
На хосте A, когда я делаю:
ping -I eth1.2 192.168.1.4
это работает, но когда я делаю:
ping -I eth1.3 192.168.1.5
это не работает.
Я пробовал установить на обоих хостах:
sysctl net.ipv4.conf.enth1.rp_filter=0
sysctl net.ipv4.conf.enth1/2.rp_filter=0
sysctl net.ipv4.conf.enth1/3.rp_filter=0
но это не решило проблему.
Использование wirehark на хосте B, отслеживание eth1, показывает, что эхо-запрос с идентификатором VLAN 3 получен правильно, но хост B не отвечает.
Конечно, я проверил свои iptables:
Chain INPUT
target prot opt in out source destination
ACCEPT all -- eth1 any anywhere anywhere
Chain OUTPUT (policy ACCEPT)
Когда я делаю на хосте А простой:
ping 192.168.1.5
Хост B отвечает, НО я вижу с помощью wirehark, что пакеты помечены VLAN id 2, это, конечно, работает.
Я предполагаю, что что-то не так с маршрутизацией пакетов с тегами VLAN на хост B, но я не могу найти что!
Вы используете один и тот же IP-сегмент, и у вас нет специальных правил маршрутизации. Это означает, что всегда используется маршрут по умолчанию, а в вашем случае маршрут по умолчанию установлен на VLAN2.
Лучше всего, если вы дифференцируете свои VLAN по разным IP-сегментам. Например, ваша VLAN2 может использовать существующие 192.168.1.1/24, а VLAN3 может использовать 192.168.3.1/24.