Я только что смоделировал ваш сценарий/необходимость с тремя виртуальными машинами и двумя (независимыми) мостами на хосте виртуальной машины и сформулировал/протестировал для него решение (о чем я упоминал в своем комментарии).
Хост виртуальной машины действует как веб-сервер, а две виртуальные машины действуют как маршрутизаторы, одна из виртуальных машин действует как веб-клиент из «Интернета»:
Конфигурации на хосте ВМ (веб-сервер):
$ ip show dev bridge1
4: bridge1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
ссылка/эфир 3a:f6:7b:90:aa:bd brd ff:ff:ff:ff:ff:ff
инет 192.168.254.3/24 охват глобальный мост1
valid_lft навсегда
inet6 fe80::38f6:7bff:fe90:aabd/64 ссылка на область видимости
valid_lft навсегда
$ ip show dev bridge2
5: bridge2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
ссылка/эфир 1a:6f:58:86:72:55 brd ff:ff:ff:ff:ff:ff
ссылка на область inet6 fe80::186f:58ff:fe86:7255/64
valid_lft навсегда
(мост1
используется для моделирования локальной сети, и мост2
используется для имитации «Интернета», поэтому последнему не назначается адрес IPv4.)
$ IP-правило
0: из всех локальных поисковых систем
32765: из всех fwmark 0xb iif lo lookup 11
32766: из всех основных поисковых запросов
32767: из всех поисковых запросов по умолчанию
$ ip r показать таблицу main dev bridge1
10.10.10.0/24 через 192.168.254.1
192.168.254.0/24 прото-ссылка на область ядра src 192.168.254.3
$ ip r показать таблицу 11
10.10.10.0/24 через мост 192.168.254.2 dev1
(Здесь 192.168.254.1
предполагается, что он является «основным» шлюзом по умолчанию. если ло
— это уточнение, которое приводит к тому, что правило применяется только к трафику, который исходит от самого хоста, другими словами, это, вероятно, не нужно, если только хост веб-сервера также не действует как своего рода маршрутизатор.)
$ sudo nft list набор правил
IP-адрес таблицы mangle {
цепочка ввода {
type filter hook input priority mangle; политика принять;
ether saddr 52:54:00:bb:bb:bb ip saddr != 192.168.254.2 ct mark set 0x0000000b
}
выход цепи {
тип route hook выходной приоритет mangle; политика принять;
ct mark 0x0000000b метаметка установить ct mark
}
}
(По всей видимости тип
должно быть маршрут
в вывод крючка
цепь для этого, чтобы работать. Кроме того, трафик, исходящий от маршрутизаторов, в отличие от трафика, исходящего из «Интернета», можно дифференцировать по исходным IP-адресам, поэтому IP-адрес != 192.168.254.2
указывается для обозначения факта; на самом деле это, вероятно, ненужное уточнение.)
Вот tcpdump
захват на хосте ВМ/веб-сервере двух завиток
выполнить на виртуальной машине веб-клиента:
$ sudo tcpdump -eni bridge1 TCP-порт 80
tcpdump: подробный вывод подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на мосту 1, тип канала EN10MB (Ethernet), длина моментального снимка 262144 байта
16:54:43.602105 52:54:00:aa:aa:aa > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 74: 10.10.10.3.33132 > 192.168.254.3.80: Флаги [S], seq 2320058647, win 64240, параметры [mss 1460,sackOK,TS val 3412464375 ecr 0,nop,wscale 7], длина 0
16:54:43.602185 3a:f6:7b:90:aa:bd > 52:54:00:aa:aa:aa, ethertype IPv4 (0x0800), длина 74: 192.168.254.3.80 > 10.10.10.3.33132: Флаги [S.], seq 3987984937, ack 2320058648, win 65160, options [mss 1460,sackOK,TS val 3768307023 ecr 3412464375,nop,wscale 7], длина 0
16:54:43.603460 52:54:00:aa:aa:aa > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.33132 > 192.168.254.3.80: Флаги [.], ack 1, win 502, options [nop,nop,TS val 3412464377 ecr 3768307023], длина 0
16:54:43.604003 52:54:00:aa:aa:aa > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 140: 10.10.10.3.33132 > 192.168.254.3.80: Флаги [P.], seq 1:75, ack 1, win 502, параметры [nop,nop,TS val 3412464377 ecr 3768307023], длина 74: HTTP: GET / HTTP/1.1
16:54:43.604054 3a:f6:7b:90:aa:bd > 52:54:00:aa:aa:aa, ethertype IPv4 (0x0800), длина 66: 192.168.254.3.80 > 10.10.10.3.33132: Флаги [.], ack 75, win 509, options [nop,nop,TS val 3768307025 ecr 3412464377], длина 0
16:54:43.604238 3a:f6:7b:90:aa:bd > 52:54:00:aa:aa:aa, ethertype IPv4 (0x0800), длина 329: 192.168.254.3.80 > 10.10.10.3.33132: Флаги [P.], seq 1:264, ack 75, win 509, options [nop,nop,TS val 3768307025 ecr 3412464377], длина 263: HTTP: HTTP/1.1 200 OK
16:54:43.604636 52:54:00:aa:aa:aa > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.33132 > 192.168.254.3.80: Флаги [.], ack 264, win 501, options [nop,nop,TS val 3412464378 ecr 3768307025], длина 0
16:54:43.605112 52:54:00:aa:aa:aa > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.33132 > 192.168.254.3.80: Флаги [F.], seq 75, ack 264, win 501, options [nop,nop,TS val 3412464379 ecr 3768307025], длина 0
16:54:43.605133 3a:f6:7b:90:aa:bd > 52:54:00:aa:aa:aa, ethertype IPv4 (0x0800), длина 66: 192.168.254.3.80 > 10.10.10.3.33132: Флаги [F.], seq 264, ack 76, win 509, options [nop,nop,TS val 3768307026 ecr 3412464379], длина 0
16:54:43.605270 52:54:00:aa:aa:aa > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.33132 > 192.168.254.3.80: Флаги [.], ack 265, win 501, options [nop,nop,TS val 3412464379 ecr 3768307026], длина 0
16:54:47.528893 52:54:00:bb:bb:bb > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 74: 10.10.10.3.49270 > 192.168.254.3.80: Флаги [S], seq 1866708541, win 64240, параметры [mss 1460,sackOK,TS val 1196345946 ecr 0,nop,wscale 7], длина 0
16:54:47.528977 3a:f6:7b:90:aa:bd > 52:54:00:bb:bb:bb, ethertype IPv4 (0x0800), длина 74: 192.168.254.3.80 > 10.10.10.3.49270: Флаги [S.], seq 1756841838, ack 1866708542, win 65160, options [mss 1460,sackOK,TS val 3768310949 ecr 1196345946,nop,wscale 7], длина 0
16:54:47.530210 52:54:00:bb:bb:bb > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.49270 > 192.168.254.3.80: Флаги [.], ack 1, win 502, options [nop,nop,TS val 1196345947 ecr 3768310949], длина 0
16:54:47.530535 52:54:00:bb:bb:bb > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 140: 10.10.10.3.49270 > 192.168.254.3.80: Флаги [P.], seq 1:75, ack 1, win 502, опции [nop,nop,TS val 1196345948 ecr 3768310949], длина 74: HTTP: GET / HTTP/1.1
16:54:47.530588 3a:f6:7b:90:aa:bd > 52:54:00:bb:bb:bb, ethertype IPv4 (0x0800), длина 66: 192.168.254.3.80 > 10.10.10.3.49270: Флаги [.], ack 75, win 509, options [nop,nop,TS val 3768310951 ecr 1196345948], длина 0
16:54:47.530744 3a:f6:7b:90:aa:bd > 52:54:00:bb:bb:bb, ethertype IPv4 (0x0800), длина 329: 192.168.254.3.80 > 10.10.10.3.49270: Флаги [P.], seq 1:264, ack 75, win 509, options [nop,nop,TS val 3768310951 ecr 1196345948], длина 263: HTTP: HTTP/1.1 200 OK
16:54:47.531434 52:54:00:bb:bb:bb > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.49270 > 192.168.254.3.80: Флаги [.], ack 264, win 501, options [nop,nop,TS val 1196345949 ecr 3768310951], длина 0
16:54:47.532994 52:54:00:bb:bb:bb > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.49270 > 192.168.254.3.80: Флаги [F.], seq 75, ack 264, win 501, options [nop,nop,TS val 1196345951 ecr 3768310951], длина 0
16:54:47.533092 3a:f6:7b:90:aa:bd > 52:54:00:bb:bb:bb, ethertype IPv4 (0x0800), длина 66: 192.168.254.3.80 > 10.10.10.3.49270: Флаги [F.], seq 264, ack 76, win 509, options [nop,nop,TS val 3768310954 ecr 1196345951], длина 0
16:54:47.533925 52:54:00:bb:bb:bb > 3a:f6:7b:90:aa:bd, ethertype IPv4 (0x0800), длина 66: 10.10.10.3.49270 > 192.168.254.3.80: Флаги [.], ack 265, win 501, options [nop,nop,TS val 1196345951 ecr 3768310954], длина 0
^ С
20 пакетов захвачено
20 пакетов, полученных фильтром
0 пакетов отброшено ядром
Как видите, MAC-адреса назначения ответов совпадают с MAC-адресами источника соответствующего исходного трафика, что означает, что они отправлялись на маршрутизатор, с которого исходил соответствующий исходный трафик. даже если IP-адреса идентичны. (Кроме того, как показано на снимке экрана, оба запуска успешно извлекли целевую веб-страницу.)
Обоснование набора правил nftable
ct отметка
параметр в хук вход
chain приведет к тому, что метка будет установлена для всех потоков одного и того же «соединения». (Я не/не могу углубляться в это, но если вы хотите узнать об этом больше, изучите «conntrack».) Поэтому в вывод крючка
цепочке вы можете «выбрать» соответствующие ответы с помощью ct отметка
соответствие, и выполнить мета отметка установить ct отметку
на них, что означает установить метаметка
на ответы того же значения, что и ct отметка
(т.е. 0xb
, что является произвольным значением, кстати). (Вместо этого вы также можете установить другое значение.)
метаметка
соответствует fwmark
в правиле ip и, следовательно, лишняя таблица маршрутизации (11
в примере, что также является произвольным значением) будет искаться трафик с метаметка
что равно fwmark
в правиле, перед (из-за более низкого значения приоритета) таблица маршрутов главный
просматривается.
Так как в таблице маршрутов 11
есть маршрут для 10.10.10.0/24
с другим nexthop (т.е. с помощью
) из таблицы маршрутизации главный
, выбранные ответы будут отправлены на «правильный» маршрутизатор. (Дальнейший поиск не выполняется, если есть маршрут, который «покрывает» адрес назначения.)
Хотя 10.10.10.0/24
используется вместо По умолчанию
он же 0.0.0.0/0
и «маршрутизаторы» подключены к одному и тому же мосту рядом с хостом веб-клиента для имитации реального Интернета, это не должно мешать работе тренировки в реальной ситуации.