Я использую Linux-контейнер на основе Debian под Proxmox 4.4. У этого хоста есть пять сетевых интерфейсов (хотя в проблеме, с которой я столкнулся, участвуют только два).
Пока я захожу на этот хост, я пингую IP-адрес, связанный с eth1. То, что происходит, и то, что, я считаю, должно произойти, - это две совершенно разные вещи.
Я хочу, чтобы пакет ping вышел из eth3, где он будет направлен в eth1.
Происходит следующее: стек IP видит, что я проверяю локальный интерфейс, а затем отправляет ответ обратно в стек. Я знаю, что пакет не выходит и не возвращается по двум причинам:
- Захват пакета не показывает ничего, что попадает ни в eth1, ни в eth3.
- Задержка пинга составляет в среднем 0,013 мс. Если бы пакет выходил и возвращался, как предполагалось, задержка составляла бы около 60 мс.
Конечно, я желаю соответствующего поведения, когда я пингую IP-адрес, связанный с eth3. В этом случае я хочу, чтобы пакет вышел из eth1, где он будет направлен в eth3. К сожалению, поведение, подобное описанному выше, происходит.
Ниже я показываю статические маршруты, которые я настроил, чтобы попытаться вызвать желаемое поведение. Такие маршруты работают так, как и предполагалось, на компьютере с Windows, но они не работают в используемой мной установке Linux.
Как я могу настроить этот хост для пересылки, как предполагалось?
root@my-host:~# uname -a
Linux my-host 4.4.35-1-pve #1 SMP Fri Dec 9 11:09:55 CET 2016 x86_64 GNU/Linux
root@my-host:~#
root@my-host:~# cat /etc/debian_version
8.9
root@my-host:~#
root@my-host:~# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.0.2.65 Bcast:192.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:195028 errors:0 dropped:0 overruns:0 frame:0
TX packets:12891 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:92353608 (88.0 MiB) TX bytes:11164530 (10.6 MiB)
eth1 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:128.66.100.10 Bcast:128.66.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:816 errors:0 dropped:0 overruns:0 frame:0
TX packets:486 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:149517 (146.0 KiB) TX bytes:34107 (33.3 KiB)
eth2 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:203.0.113.1 Bcast:203.0.113.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:738 errors:0 dropped:0 overruns:0 frame:0
TX packets:880 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:423603 (413.6 KiB) TX bytes:94555 (92.3 KiB)
eth3 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:128.66.200.10 Bcast:128.66.200.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:611 errors:0 dropped:0 overruns:0 frame:0
TX packets:182 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:43921 (42.8 KiB) TX bytes:13614 (13.2 KiB)
eth4 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:198.51.100.206 Bcast:198.51.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:183427 errors:0 dropped:0 overruns:0 frame:0
TX packets:83 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:85706791 (81.7 MiB) TX bytes:3906 (3.8 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:252 errors:0 dropped:0 overruns:0 frame:0
TX packets:252 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:22869 (22.3 KiB) TX bytes:22869 (22.3 KiB)
root@my-host:~#
root@my-host:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
128.66.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
203.0.113.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
128.66.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
198.51.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth4
root@my-host:~#
root@my-host:~# route -v add 128.66.200.10/32 gw 128.66.100.1
root@my-host:~# route -v add 128.66.100.10/32 gw 128.66.200.1
root@my-host:~#
root@my-host:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
203.0.113.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
198.51.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth4
128.66.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
128.66.100.10 128.66.200.1 255.255.255.255 UGH 0 0 0 eth3
128.66.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
128.66.200.10 128.66.100.1 255.255.255.255 UGH 0 0 0 eth1
root@my-host:~#
root@my-host:~# ping -c 3 128.66.100.10
PING 128.66.100.10 (128.66.100.10) 56(84) bytes of data.
64 bytes from 128.66.100.10: icmp_seq=1 ttl=64 time=0.008 ms
64 bytes from 128.66.100.10: icmp_seq=2 ttl=64 time=0.014 ms
64 bytes from 128.66.100.10: icmp_seq=3 ttl=64 time=0.017 ms
--- 128.66.100.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.008/0.013/0.017/0.003 ms
root@my-host:~#
Четверг, 17.08.2017, 8:12 PDT ОБНОВЛЕНИЕ
По просьбе Диркта я уточняю нашу архитектуру и причину моего вопроса.
Виртуальный хост, который является предметом этого поста (то есть хост с сетевыми интерфейсами eth1, eth3 и тремя другими сетевыми интерфейсами, не связанными с моим вопросом), используется для тестирования физической, проводной сетевой инфраструктуры TCP/IP, которую мы настроили , В частности, мы проверяем функциональность маршрутизации этой сетевой инфраструктуры TCP/IP.
У нас было два виртуальных хоста, а не один, как я описал в своем первоначальном посте. Пинг между этими двумя хостами был бы нашим тестом дыма, чтобы убедиться, что тестируемая сетевая инфраструктура TCP/IP все еще работает.
По слишком подробным причинам, наличие двух хостов затрудняло сбор журналов, которые нам нужны. Итак, мы переключились на один хост, дали ему два сетевых адаптера, настроили статические маршруты так, чтобы все, что предназначалось для сетевого адаптера 2, выходило из сетевого адаптера 1 и наоборот. Проблема в том, что, как я уже сказал, они не выходят.
Эта настройка одного хоста / двух сетевых карт работала под Windows в течение многих лет. Я не знаю, происходит ли это из-за того, что Windows сломана, и мы непреднамеренно воспользовались ошибкой, или если Windows работает нормально (то есть RFC-совместимо), и нам просто нужно правильно настроить конфигурацию на наших виртуальных машинах Linux, чтобы получить такую же поведение.
Подведем итоги и вычеркнем длинный блок текста оболочки выше:
Два интерфейса:
eth1: 128.66.100.10/24; the router on this interface's network has IP address 128.66.100.1
eth3: 128.66.200.10/24; the router on this interface's network has IP address 128.66.200.1
Соответствующие маршруты:
Destination Gateway Genmask Flags Metric Ref Use Iface
128.66.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
128.66.100.10 128.66.200.1 255.255.255.255 UGH 0 0 0 eth3
128.66.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
128.66.200.10 128.66.100.1 255.255.255.255 UGH 0 0 0 eth1
Команда, которую я выполняю:
ping -c 3 128.66.100.10
Пункт назначения 128.66.100.10 соответствует двум из указанных выше маршрутов:
Destination Gateway Genmask Flags Metric Ref Use Iface
128.66.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
128.66.100.10 128.66.200.1 255.255.255.255 UGH 0 0 0 eth3
Маршрут с самым длинным совпадением префикса:
Destination Gateway Genmask Flags Metric Ref Use Iface
128.66.100.10 128.66.200.1 255.255.255.255 UGH 0 0 0 eth3
Я пытаюсь понять, почему, учитывая существование этого маршрута, пакет не будет выходить из eth3, проходить через нашу сетевую инфраструктуру TCP/IP, возвращаться и попадать в eth1 извне.
Стек TCP/IP, очевидно, не обращается к таблице пересылки. Как будто, когда он видит, что я пингую локально подключенный интерфейс, стек TCP/IP просто говорит: «О, это локальный интерфейс. Так что я не собираюсь консультироваться с таблицей пересылки. Вместо этого я просто отправлю эхо-ответ прямо обратно в стек ".
Является ли поведение, которое я желаю, RFC-совместимым? Если это не так, я должен отказаться от попытки. Но если он совместим с RFC, я хотел бы узнать, как настроить стек TCP/IP в Linux, чтобы разрешить такое поведение.
ПОНЕДЕЛЬНИК, 21.08.2017 ОБНОВЛЕНИЕ
Я обнаружил параметры ядра sysctl rp_filter и accept_local . Я установил их следующим образом:
root@my-host:~# cat /proc/sys/net/ipv4/conf/eth1/accept_local
1
root@my-host:~# cat /proc/sys/net/ipv4/conf/eth3/accept_local
1
root@my-host:~# cat /proc/sys/net/ipv4/conf/all/accept_local
1
root@my-host:~# cat /proc/sys/net/ipv4/conf/default/accept_local
1
root@my-host:~# cat /proc/sys/net/ipv4/conf/eth1/rp_filter
0
root@my-host:~# cat /proc/sys/net/ipv4/conf/eth3/rp_filter
0
root@my-host:~# cat /proc/sys/net/ipv4/conf/all/rp_filter
0
root@my-host:~# cat /proc/sys/net/ipv4/conf/default/rp_filter
0
Установка параметров этого ядра, перезагрузка, проверка того, что они пережили перезагрузку, и повторное тестирование не показали различий в поведении.
Обратите внимание, что my-host - это Linux-контейнер lxc, работающий под Proxmox 4.4. Я также установил rp_filter и accept_local, как показано выше, на интерфейсах гипервизора, которые соответствуют интерфейсам eth1 и eth3 на my-host.
Чтобы подвести итог моей цели, у меня есть хост Linux с двумя сетевыми картами, eth1 и eth3. Я пытаюсь пропинговать eth1, маршрутизировать пакет ping через тестируемую сетевую инфраструктуру TCP/IP и возвращаться к eth3.
Ничто из того, что я пробовал выше, не позволило мне сделать это. Как я могу это сделать?
27.08.2017 ОБНОВЛЕНИЕ
Согласно примечанию dirkt, которое я не упомянул, являются ли eth1 и eth3 чисто виртуальными или соответствуют ли они физическому интерфейсу ... eth1 и eth3 оба соответствуют одному и тому же физическому интерфейсу на гипервизоре. Намерение состоит в том, что пакет, который выходит из eth1, фактически физически покидает блок гипервизора, выходит в настоящую сеть TCP/IP и возвращается обратно.
27.08.2017 ОБНОВЛЕНИЕ № 2
По сути, я исследовал сетевые пространства имен, так как это казалось довольно многообещающим. Однако это не "просто работает".
Я использую контейнеры LXC, и кажется, что некоторые механизмы изоляции, присутствующие в контейнерах, мешают мне создать пространство имен сети. Если бы я не работал в контейнере, думаю, у меня не было бы проблем с добавлением сетевого пространства имен.
Я нахожу некоторые ссылки на выполнение этой работы в контейнерах LXC, но они довольно туманны и неясны. Пока нет, и придется на сегодня бросить полотенце ... Если у кого-то есть какие-либо предложения на этот счет, пожалуйста, сообщите ...