это вопрос про линукс соседняя подсистема и виртуальный мост(линукс для меня новичок, извините за это).
Тест выполнен на UBUNTU21(uname -а
):
Linux dlw 5.11.0-16-generic #17-Ubuntu SMP Среда, 14 апреля, 20:12:43 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Начальная конфигурация
Диаграмма топологии:
||============================================||
||----------------| |------||
ПК2 --- ||enx00e04c369b80| |wlp1s0||--- ПК4
||----------------| |------||
|| ПК1(УБУНТУ 21) ||
||----------------| ||
ПК3 --- ||enx8800669997d7| ||
||----------------| ||
||============================================||
Все карты в ПК1 настраиваются со статическим IP-адресом с помощью следующих команд:
ifconfig enx00e04c369b80 192.168.0.31 сетевая маска 255.255.255.0
ifconfig enx8800669997d7 192.168.0.32 сетевая маска 255.255.255.0
ifconfig wlp1s0 192.168.0.33 сетевая маска 255.255.255.0
а «ip_forward» отключается проверкой /proc/sys/net/ipv4/ip_forward:
кот /proc/sys/net/ipv4/ip_forward
0
ПК2/ПК3/ПК4 — это терминалы со статическим IP-адресом и отключенным брандмауэром.
Вкратце, связь между PC1 и PCx такова:
--------------------------------------------- --------------------------
PC1-интерфейсы статический ip-прямая связь-внешнее-устройство-на-порт
--------------- ----------- --------- ------------------
enx00e04c369b80 192.168.0.31 ПК2 192.168.0.17 40:8d:5c:21:db:57
enx8800669997d7 192.168.0.32 ПК3 192.168.0.10 50:3е:аа:05:64:f7
влп1с0 192.168.0.33 ПК4 192.168.0.254 00:85:00:07:АА:3А
После запуска их с помощью команды «ifconfig xxx up» три карты в ПК1 разделены на три подсети и могут обмениваться данными только с напрямую связанными ПКх (подтверждено «пингованием» с -Я вариант). В частности, ПК2, ПК3 и ПК4 не могут связаться друг с другом.
Назначение и работа
Затем я хочу соединить ПК2 и ПК3 виртуальным мостом, то есть добавить мост «br0» в ПК1, и добавить к нему интерфейсы enx00e04c369b80 и enx8800669997d7, а wlp1s0 оставить без изменений.
Это достигается:
brctl addbr br0
brctl addif br0 enx00e04c369b80
brctl addif br0 enx8800669997d7
ifconfig enx8800669997d7 0.0.0.0
ifconfig enx00e04c369b80 0.0.0.0
ifconfig br0 192.168.0.30 сетевая маска 255.255.255.0
ifconfig br0 вверх
в результате получается следующая конфигурация на ПК1:
root@dlw:/home/dlw# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
инет 192.168.0.30 сетевая маска 255.255.255.0 широковещательная рассылка 192.168.0.255
inet6 fe80::a4d0:5bff:fe4a:8f76 prefixlen 64 scopeid 0x20<ссылка>
эфир a6:d0:5b:4a:8f:76 txqueuelen 1000 (Ethernet)
RX-пакеты 440 байт 20303 (20,3 КБ)
Ошибки RX 0 отброшено 0 переполнение 0 кадр 0
Пакеты TX 41 байт 5530 (5,5 КБ)
Ошибки передачи 0 отброшено 0 превышение пропускной способности 0 несущей 0 коллизий 0
enx00e04c369b80: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
эфир 00:e0:4c:36:9b:80 txqueuelen 1000 (Ethernet)
RX-пакеты 684 байта 34203 (34,2 КБ)
Ошибки RX 0 отброшено 0 переполнение 0 кадр 0
Пакеты TX 100 байт 8901 (8,9 КБ)
Ошибки передачи 0 отброшено 0 превышение пропускной способности 0 несущей 0 коллизий 0
enx8800669997d7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
эфир 88:00:66:99:97:d7 txqueuelen 1000 (Ethernet)
RX-пакеты 298 байт 35266 (35,2 КБ)
Ошибки RX 0 отброшено 4 переполнение 0 кадр 0
Пакеты TX 487 байт 32918 (32,9 КБ)
Ошибки передачи 0 отброшено 0 превышение пропускной способности 0 несущей 0 коллизий 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
инет 127.0.0.1 сетевая маска 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<хост>
loop txqueuelen 1000 (локальная петля)
RX-пакеты 5235 байт 423013 (423,0 КБ)
Ошибки RX 0 отброшено 0 переполнение 0 кадр 0
Пакеты TX 5235 байт 423013 (423,0 КБ)
Ошибки передачи 0 отброшено 0 превышение пропускной способности 0 несущей 0 коллизий 0
wlp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
инет 192.168.0.33 сетевая маска 255.255.255.0 широковещательная рассылка 192.168.0.255
inet6 fe80::ea0b:12c0:2ebf:b5c6 prefixlen 64 scopeid 0x20<ссылка>
эфир 84:5c:f3:52:98:60 txqueuelen 1000 (Ethernet)
RX-пакеты 23040 байт 22183801 (22,1 МБ)
Ошибки RX 0 пропущено 53 переполнение 0 кадр 0
Пакеты TX 8987 байт 994399 (994,3 КБ)
Ошибки передачи 0 отброшено 0 превышение пропускной способности 0 несущей 0 коллизий 0
root@dlw:/home/dlw# brctl показать
имя моста идентификатор моста интерфейсы с поддержкой STP
br0 8000.a6d05b4a8f76 нет enx00e04c369b80
enx8800669997d7
root@dlw:/home/dlw# ls /sys/class/net/br0/brif/
enx00e04c369b80 enx8800669997d7
Мост br0 работает нормально, «пингуя» друг друга в ПК2 и ПК3.
Вопрос
Но мой вопрос в том, что ПК2 может связаться с wlp1s0 ПК1 (через ping),
пинг 192.168.0.33
PING 192.168.0.33 (192.168.0.33) 56 (84) байт данных.
64 байта из 192.168.0.33: icmp_seq=1 ttl=64 время=1,05 мс
64 байта из 192.168.0.33: icmp_seq=2 ttl=64 время=1,05 мс
однако настоящий «ответчик» — это br0 (проверьте MAC-адрес), а не wlp1s0. Это подтверждается пакетом, захваченным на ПК2 с помощью wireshark:
23 2021-09-30 10:56:17.231255 Tp-LinkT_05:64:f7 Широковещательный ARP 42 У кого есть 192.168.0.33? Скажите 192.168.0.10
0000 ff ff ff ff ff 50 3e aa 05 64 f7 08 06 00 01
0010 08 00 06 04 00 01 50 3е аа 05 64 f7 с0 а8 00 0а
0020 00 00 00 00 00 00 с0 а8 00 21
24 2021-09-30 10:56:17.231999 a6:d0:5b:4a:8f:76 Tp-LinkT_05:64:f7 ARP 60 192.168.0.33 находится по адресу a6:d0:5b:4a:8f:76
0000 50 3e аа 05 64 f7 a6 d0 5b 4a 8f 76 08 06 00 01
0010 08 00 06 04 00 02 а6 d0 5b 4а 8f 76 с0 а8 00 21
0020 50 3е аа 05 64 f7 с0 а8 00 0а 55 55 55 55 55 55
0030 55 55 55 55 55 55 55 55 55 55 55 55
25 2021-09-30 10:56:17.232010 192.168.0.10 192.168.0.33 ICMP 74 0xc634 (50740) Эхо-запрос (ping) id=0x0002, seq=20474/64079, ttl=128 (ответ в 26)
0000 a6 d0 5b 4a 8f 76 50 3e aa 05 64 f7 08 00 45 00
0010 00 3с с6 34 00 00 80 01 00 00 с0 а8 00 0а с0 а8
0020 00 21 08 00 fd 5f 00 02 4f fa 61 62 63 64 65 66
0030 67 68 69 6а 6б 6в 6г 6д 6е 70 71 72 73 74 75 76
0040 77 61 62 63 64 65 66 67 68 69
26 2021-09-30 10:56:17.232711 192.168.0.33 192.168.0.10 ICMP 74 0x8d96 (36246) Эхо (пинг) ответ id=0x0002, seq=20474/64079, ttl=64 (запрос в 25)
0000 50 3e аа 05 64 f7 a6 d0 5b 4a 8f 76 08 00 45 00
0010 00 3c 8d 96 00 00 40 01 6b af c0 a8 00 21 c0 a8
0020 00 0a 00 00 05 60 00 02 4f fa 61 62 63 64 65 66
0030 67 68 69 6а 6б 6в 6г 6д 6е 70 71 72 73 74 75 76
0040 77 61 62 63 64 65 66 67 68 69
С другой стороны, захват icmp-пакета на ПК1 показывает, что wlp1s0 не получает icmp-пакета, а br0 получает:
root@dlw:/home/dlw# tcpdump -i wlp1s0 -XXXX icmp
tcpdump: подробный вывод подавлен, используйте -v или -vv для полного декодирования протокола
прослушивание на wlp1s0, тип канала EN10MB (Ethernet), размер захвата 262144 байт
^ С
0 пакетов захвачено
root@dlw:/home/dlw# tcpdump -i br0 -XXXX icmp
tcpdump: подробный вывод подавлен, используйте -v или -vv для полного декодирования протокола
прослушивание на br0, тип канала EN10MB (Ethernet), размер захвата 262144 байт
20:28:32.496062 IP 192.168.0.10 > dlw: эхо-запрос ICMP, идентификатор 2, последовательность 20555, длина 40
0x0000: a6d0 5b4a 8f76 503e aa05 64f7 0800 4500 ..[J.vP>..d...E.
0x0010: 003c c665 0000 8001 f2df c0a8 000a c0a8 .<.e............
0x0020: 0021 0800 fd0e 0002 504b 6162 6364 6566 .!......PKabcdef
0x0030: 6768 696a 6b6c 6d6e 6f70 7172 7374 7576 гхийклмнопкрстув
0x0040: 7761 6263 6465 6667 6869 вабкдефги
20:28:32.496109 IP dlw > 192.168.0.10: эхо-ответ ICMP, идентификатор 2, последовательность 20555, длина 40
0x0000:503e aa05 64f7 a6d0 5b4a 8f76 0800 4500 P>..d...[J.v..E.
0x0010: 003c e53f 0000 4001 1406 c0a8 0021 c0a8 .<.?..@......!..
0x0020: 000a 0000 050f 0002 504b 6162 6364 6566 ........PKabcdef
0x0030: 6768 696a 6b6c 6d6e 6f70 7172 7374 7576 гхийклмнопкрстув
0x0040: 7761 6263 6465 6667 6869 вабкдефги
Кроме того, wlp1s0 не может связаться с PC2 в обратном порядке:
dlw@dlw:~$ пинг 192.168.0.10 -I wlp1s0
PING 192.168.0.10 (192.168.0.10) от 192.168.0.33 wlp1s0: 56 (84) байт данных.
^ С
--- Статистика пинга 192.168.0.10 ---
6 пакетов передано, 0 получено, 100% потери пакетов, время 5121 мс
dlw@dlw:~$ пинг 192.168.0.254 -I wlp1s0
PING 192.168.0.254 (192.168.0.254) от 192.168.0.33 wlp1s0: 56 (84) байт данных.
64 байта из 192.168.0.254: icmp_seq=1 ttl=64 время=4,48 мс
64 байта из 192.168.0.254: icmp_seq=2 ttl=64 время=4,81 мс
^ С
--- Статистика пинга 192.168.0.254 ---
2 пакета передано, 2 получено, 0% потери пакетов, время 1002 мс
rtt min/avg/max/mdev = 4,477/4,645/4,813/0,168 мс
dlw@dlw:~$ ^C
Таблица маршрутизации, таблица arp и fdb в ПК1 выглядит следующим образом:
root@dlw:/home/dlw# маршрут -n
Таблица IP-маршрутизации ядра
Шлюз назначения Флаги Генмаски Метрика Ссылка Использование Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp1s0
192.168.0.0 0.0.0.0 255.255.255.0 У 0 0 0 бр0
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp1s0
root@dlw:/home/dlw# arp -a
? (192.168.0.17) в 40:8d:5c:21:db:57 [эфир] на enx00e04c369b80
? (192.168.0.17) в 40:8d:5c:21:db:57 [эфир] на br0
? (192.168.0.10) в 50:3e:aa:05:64:f7 [эфир] на br0
root@dlw:/home/dlw# brctl showmacs br0
порт без MAC-адреса является локальным? таймер старения
1 00:e0:4c:36:9b:80 да 0,00
1 00:e0:4c:36:9b:80 да 0,00
1 40:8d:5c:21:db:57 нет 65.37
2 50:3е:аа:05:64:f7 нет 24.93
2 88:00:66:99:97:d7 да 0.00
2 88:00:66:99:97:d7 да 0.00
Таблица arp и маршрутизации в PC2:
арп -а
192.168.0.17 40-8д-5в-21-дб-57
192.168.0.30 а6-д0-5б-4а-8ф-76
192.168.0.33 а6-д0-5б-4а-8ф-76
192.168.0.255 фф-фф-фф-фф-фф-фф
224.0.0.2 01-00-5е-00-00-02
224.0.0.22 01-00-5э-00-00-16
224.0.0.251 01-00-5e-00-00-фб
224.0.0.252 01-00-5e-00-00-фк
255.255.255.255 фф-фф-фф-фф-фф-фф
маршрут -n
Таблица IP-маршрутизации ядра
Шлюз назначения Флаги Генмаски Метрика Ссылка Использование Iface
255.255.255.255 0.0.0.0 255.255.255.255 U 0 0 0 eth0
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth0
0.0.0.0 192.168.0.10 255.255.255.255 U 0 0 0 eth0
192.168.0.255 0.0.0.0 255.255.255.255 U 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.0.10 0.0.0.0 255.255.255.255 U 0 0 0 eth0
Итак, «проблема» теперь немного ясна:
Когда ПК2 отправляет эхо-запрос 192.168.0.33, сначала спросив, где находится 192.168.0.33, посредством широковещательной рассылки arp, этот пакет достигает соседней подсистемы ПК1. Поскольку wlp1s0 имеет IP-адрес 192.168.0.33, ПК1 отвечает на эту arp-трансляцию с помощью mac wlp1s0, но каким-то образом этот пакет ответа arp «sender mac» и ether-header «Source mac» изменены. to br0 (это меня смутило).
После получения ответа arp компьютер PC2 отправляет ICMP-сообщение с mac пункта назначения (назначения) как br0 и IP-адресом пункта назначения как wlp1s0. Обработчик icmp PC1 (предположим, что он работал на уровне 3) ответил, но подсистема маршрутизации берет низшую метрику «192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 br0» и отправляет пакет на br0 (если не ошибаюсь).
Итак, мое замешательство почему соседняя подсистема Linux отвечает на эту широковещательную передачу arp, даже если PC2 и wlp1s0 не связаны на уровне 2? И как проходит поток разрешения arp?(извините, я до сих пор не знаком с кодом реализации соседней подсистемы Linux).